数据库(基本SQL语句、存储引擎和数据类型、约束条件、关键字查询)

数据的演变史

以ATM为例:

1. 把数据存在了文件中,有不同的命名,不同的数据格式

  文件名:user.txt,也有命名为userinfo.txt

  数据格式:kevin|123、kevin@123、kevin-123

2. 软件开发目录规范

  db文件夹:专门用来存储数据文件,但是,当数据文件较多时,会占用过多的资源,也会产生很多的文件。

3. 数据库阶段

  解决了以上的所有问题,采用统一的存储格式

数据的发展史

1. 单机游戏阶段:

  数据会单独存放在每一台计算机上,不是实现数据的共享。

2. 联网游戏阶段:

  实现了数据的共享,把数据单独存放在服务器上面(在一台计算机上)

数据的分类

1. 关系型数据

  MySQL、Oracle、SQLserver、postgresql、DB2、sqlite、acess、MAriaDB

  MySQL数据库:开源的

  MariaDB,和MySQL数据库时同一作者

  Oracle:收费的

2. 非关系型数据库

  Redis(缓存数据库)、memcache(缓存数据库)、mongoDB(爬虫等)

  Redis(缓存数据库)是目前市面上使用的最多的:

    Redis数据库把memcache淘汰了,没有用memcache(老项目之前用的,现在没有更换,还再用)

    Redis能做memcahe不能做的事情。

    Redis支持的数据类型要比memcache多的多

3. 两者的特点

  1. 关系型数据库可以建立关系,拥有固定的表结构、表与表之间可以建立表关系

  2. 非关系型数据不能够建立表关系,是以k:v键值对的形式存在的,没有表的概念,支持五种数据类型。

数据库的本质

数据库的本质:其实是一款C/S架构的软件,市面上存在很多的数据库。

SQL与NoSql的由来

  对于关系型数据库,服务端为了兼容各个客户端,统一规定了,每个客户端都要使用MySQL语言,而这个MySQL语言就是我们说的SQL语句(关系型数据库)

  非关系型数据库:Nosql语句

MySQL的介绍

版本的介绍:

  MySQL5.0 (版本不稳定)

  MySQL5.5 (用的很少,老项目还再用)

  MySQL5.6 (老项目用的比较多,版本很稳定)

  MySQL5.7 (新项目在选择数据库的时候,使用的就是这个版本了)

  MySQL8.0 (最新版本,现在生产环境用的还不是很多)

数据库的各个版本区别不是很大,核心就是SQL语句,不管哪个版本,SQL语句几乎都是一样。

""" 在IT领域,生产环境尽量不要使用最新版本,因为,新版本没有经过大量的测试,不是很稳定。"""

生产环境:你的项目上线之后的环境

测试环境:你在本地自己玩,无所谓了

MySQL的下载与安装

1. 直接去官网下载

  https://downloads.mysql.com/archives/community/

2. 下载完成之后,如何使用?

  下载之后是一个压缩包,解压完成即可

3. MySQL的主要文件介绍

  bin: 存放mysql的一些启动文件,客户端:mysql.exe,服务端:mysqld.exe

    mysql.exe : MySQL自带的客户端

    mysqld.exe:MySQL自带的服务端

  data:mysql数据的存储文件夹,存数据。

  my-default.ini:MySQL的配置文件,复制一份my-default.ini文件。并重命名为my.ini,以后只需要在my.ini文件中做修改。

  README:MySQL的说明文件

4. MySQL如何启动

  由于MySQL是有客户端和服务端的,因此,我们要启动服务端和客户端来使用

  1. 记住一定是先启动服务端:mysqld.exe,窗口不要关,进程也不要关

  2. 然后启动一个新的cmd窗口,让客户端去连接服务端

  如何启动:

    1. 先切换路径到bin目录下

      打开cmd -----> 输入mysqld启动服务端 ----->在打开一个cmd窗口 -----> 输入mysql连接服务端

    2. 客户端连接上服务端之后,如何退出客户端: exit

    3. 服务端启动之后,如何终止(停掉)服务端:ctrl + c

    """

      localhost :代表的就是本机

      127.0.0.1:代表的也是本机

      在某些情况下,这两者是有区别的

      """

5. 加入环境变量

  D:\mysql-5.6.45-winx64\bin加入到环境变量中,达到在任何位置都可以找到服务端和客户端程序

6. 系统服务制作(使用管理员权限)

  1. 先打开cmd窗口

  mysqld --install 提示:Service successfully installed
   第一次安装成功,需要手动启动一次

  2. 如何启动服务

    1. 鼠标点击启动按钮(此电脑---->管理--->服务)

    2. net start mysql

    3. 任务管理器

  3. 如何关闭服务

    1. 鼠标点击启动按钮

    2. net stop mysql

    3.通过杀死进程来关闭服务

     taskill /pid 端口 -f

  4. 如何卸载MySQL服务

   mysqld --remove

  """以上操作都需要管理员权限"""

7. 卸载MySQL

  1. 先卸载服务

  2. 在关闭服务端

  3. 直接删除MySQL的文件夹

 

管理员修改密码及忘记密码

登录MySQL

1. 游客模式登录:mysql (功能很少,权限很低   

2. 管理员登录:mysql -u root -p (直接回车就登录成功了) 

3. 如果你连接的是别人电脑上的数据库,需要指定 ip 和 port :mysql -h 127.0.0.1 -P 3306 -u root -p 123 

4. 给管理员设置密码 mysqladmin -u root -p 旧密码 password 新密码

5. 如果密码忘记了怎么办? 

  """使用跳过授权表的形式""" 

  1. 停止服务并终止服务端

  2. 使用'跳过授权表'的形式启动服务端

    mysqld  # 不'跳过授权表'

    mysqld --skip-grant-table  # '跳过授权表'

  """跳过授权表的意思是:客户端在连接服务端的时候,不需要验证密码了,直接登录成功"""

  3. 再次使用客户端(管理员账号)来登录进去,就不需要密码了

     进入mysSQL之后,需要修改密码

  update mysql.user set password=password(123) where Host='localhost' and User='root';

  flush privileges; # 刷新权限

  退出客户端

  退出服务端

  4. 改完之后,一定要终止服务端,重新不跳过授权表,以普通模式启动服务端,再次使用管理员登录即可  

MySQL的配置文件

mysql的默认配置文件:my-default.ini,ini:配置文件,将这个文件复制一份,命名为my.ini(Windows)

macOS系统:配置是my.cnf(安装的时候已经有了,就在人家的基础上改,如果没有自己创建)

程序先启动会加载配置文件中的配置之后才真正的启动

配置文件的作用:

  修改字符编码:在my.ini中输入一下内容

[mysqld]

    character-set-server=utf8

    collation-server=utf8_general_ci

[client]

    default-character-set=utf8

[mysql]

    default-charcater-set-utf8

 

只要配置文件发生了改变,一定要重启服务端,配置文件c才生效

\s:输出一些MySQL的基本信息

重要的概念

库:其实就是文件夹

表:文件夹中的文件

记录:文件夹的文件中的一行行数据

先有库,再有表,最后有记录

先创建数据库,在库里创建数据表,最后在表中插入记录。

数据库相关命名

1. 查看所有的数据库(管理员登录:mysql -root -p),游客身份只能看见两个。

  show databases;

    information_schema :默认创建在内存中的数据库

    mysql :MySQL默认创建的数据库,不要动

    performance_schema 

    test :空数据

show create database 库名:查看数据库的基本信息

2. 如何选择数据库

  use 库名;

  use mysql;

3. 如何增加数据库

  create database db1;

4. 如何删除数据库

  drop database db1 charset='gbk';

  一般情况下,只要创建了数据库,就不会去修改,如果要修改,就直接删掉,重新创建。

针对库的SQL语句

  查看所以的数据库:show databases;

  查看新建的库:show create database 库名;

  创建数据库:create datbase 库名;

  修改数据库:alter database 库名 charset='gbk';

  删除数据库:drop database 库名;

  切换数据库:use 库名;

针对表的SQL语句(重要)

有表的前提是先有库

表:相当于文件,表中的一条记录就相当于文件中的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段。

先有库:

查看当前所在库:select database();

选择库:use db1;

 cmd结果:

 

0: 查看表

show tables;# 查看表
show create table t1;  # 查看表结构
desc t1;  # 格式化之后的表结构

 cmd结果:

 

1:创建表

create table t1(id int,name varchar(20),age int);

2:修改表

alter table t1 rename tt1;

3:删除表

drop table t1;

针对记录的SQL语句

关键字:select、insert、update、delete

1. 查看表中的数据

select * from t1;  # 查看表中的所有字段
select id from t1; # 查看表中单个字段:id
select id,name from t1; 
select id,name,age from t1;

 

 

2. 增加数据

insert into t1(id,name,age) values(1,'hua',20);

insert into t1 values(1,'hua',20);
insert into t1 values(2,'rui',18),(3,'lin',19),(4,'cai',17);  # 单条增加数据,并且是全字段增加

 

3. 修改数据

update 表名 set 字段名=‘字段值’ where 条件;

update t1 set name='hua1' ,age = 18 where id =1;
update t1 set name='lin',age =18 where id =3 and age=19;

 

在写更新语句的时候,一定别忘了检测更新条件。

4. 删除数据

delete from t1 where id =1;
delete from t1 where id =1 and name='kevin';

 

存储引擎(存储数据的方式)

存储引擎:就是存储数据的方式

MySQL中存储数据的方式:

  show engines; 查看所有的存储引擎

MySQL中共支持9种存储引擎,需要掌握两种:

  MyISAM:MySQL5.5及之前的版本默认的存储引擎,存取速度很快,但数据相对InnoDB不够安全

  InnoDB:MySQL5.5之后的版本默认的存储引擎,存取速度相对于MyISAM更慢了但数据更加安全了。

  MEMORY:数据是在内存中存着的,内存基于电工作的,所以断电数据丢失,重启服务端也会丢失数据。

验证以上三者存储引擎所产生的文件:

create table t2(id int) engine=MyISAM;
create table t3(id int) engine=InnoDB;
create table t4(id int) engine=MEMORY;

MyISAM: 产生三个文件

  .frm:这个文件存表结构

  .MYD:这个文件存数据 data

  .MYI:这个文件存数据的索引 index >>> 类似于是书的目录,加快查询速度。

InnoDB:产生两个文件

  .frm:这个文件存表结构

  .ibd:这个文件存数据的索引和数据 index  

MEMORY:产生一个文件

  .frm:这个文件存表结构

数据类型(重要)

1.整型

tinyint、smallint、mediumint、int、 bigint

不同的类型存储的范围不一样。

存储范围比较:

tinyint:1个字节 ------> 8位 ------> 2 **8 ----> 256 -----> 0-255 ----->-128-127

smallint: 2个字节存储 -----> 16位 ----> 2 ** 16 ----> 65536-----> 0-65535---->-32768-32767
int: 4个字节 ------> 32位 -----> 2 ** 32----> 21...---->
bigint:8个字节 -----> 64位 -----> 2 ** 64 ---->

默认情况整型是否带符号:

create table t5 (id tinyint);
create table t5 (id smallint);
create table t5 (id int);
create table t5 (id bigint);

检验:

insert into t5 values(999);
insert into t5 values(-129);

 

得出结论: 默认情况下整型是带符号的

整型的数字代表的是什么意思

char(4)、varchar(4) : 括号里的数字代表的只是存储的长度

int、tinyint、smallint :整型的存储范围跟括号中的数字没有任何关系

整型的存储范围完全是跟关键字相关,int, smallint

create table t11 (id int(3));
insert into t11 values(99999);
create table t13 (id int(3) zerofill);
insert into t13 values(9);
create table t15 (id int(11) zerofill);
insert into t15 values(9);

 

 

2. 浮点型(小数)

float、double、decimal

"""语法格式""":

float(255,30);  # 255表示的是存储的位数,30代表的是小数位数。

double(255,30):  # 255表示的是存储的位数,30代表的是小数位数。

decimal(65,30):  # 65表示的是存储的位数,30代表的是小数位数。

比如:decimal(8,2)  # 表示的最大范围是:999999.99

 

三者的区别:

create table t6(id float(255, 30));
create table t7(id double(255, 30));
create table t8(id decimal(65, 30));
# 插入数据
insert into t6 values(1.111111111111111111111111);
insert into t7 values(1.111111111111111111111111);
insert into t8 values(1.111111111111111111111111);

得出结论:三者的精确度不一样,decimal >>> double >>> float

 

 3. 字符串

char(5)、varchar(5)  # 这两个都是用来存储字符串使用的。

char(5): char 是定长,那么它就存5位,如果没有到5位,就会用空格补齐5位。

    如果超出5位,(在严格模式下)报错或者就存5位

 

varchar(5):varchar是可变长的,不超出5位,有几位存几位,

      如果超出5位,报错(在严格模式下)或者最大存5位。

 

验证:

create table t9(id int, name char(5));
create table t10(id int, name varchar(5));

insert into t9 values(1, 'kevin');
insert into t10 values(1, 'kevin');

如果想让报错,需要设置严格模式

如何查看严格模式

1. select @@sql_mode;

2. show variables like '%mode%'   模糊查询,变量中带有mode的。

设置严格模式

1. 永久修改:需要改配置文件

2.临时修改:

set global
sql_mode='STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';

 

验证存储的长度:

insert into t9 values(1,'r');
insert into t10 values(1,'r');
#验证存储的长度
select char_length(name) from t10;
select char_length(name) from t11;

 

大多数情况使用的都是varchar,如果你的存储数据就是固定的,就使用char。

4. 日期类型

  datetime:年日月 时分秒 (reg_time)

  date:年月日(update_time)

  time:时分秒(delete_time)

  year:年份

 

create table t14 (id int,
                          reg_time datetime,
                          update_time date,
                          delete_time time,
                          birth year
                        );
insert into t14 values(1, '2023-10-01 11:11:11', '2023-07-10', '11:11:11', '2023');

 

5. 枚举类型

 enum:多选一

create table t15 (id int,
                        hobby enum('tangtou', 'hejiu', 'xijio', 'chouyan')
                         );
insert into t15 values(1, 'tangtou');   

 

set:多选多,也可以多选一

create table t16 (id int,
                         hobby set('tangtou', 'hejiu', 'xijio', 'chouyan')
                      );

 

 

创建表的完整语法结构

create table 表名(
字段名1 数据类型 约束条件 约束条件 约束条件,
字段名2 数据类型 约束条件 约束条件 约束条件,
字段名3 数据类型 约束条件 约束条件 约束条件,
字段名4 数据类型 约束条件 约束条件 约束条件,
字段名5 数据类型 约束条件 约束条件 约束条件
);

create table t17 (
id int,
name varchar(16),
age int

)

注意事项:

  1. 字段名和数据类型是必须要写的

  2. 约束条件是可选的,有就有,没有就不写

  3. 最后一个字段的末尾不能加逗号

约束条件

约束条件:在数据类型的基础上再添加限制条件

1. unsigned (无符号)

unsigned作用:

    1. 起到约束数值的作用,只能输入正的值

    2. 增加了数值的范围,以tinyint为例,原本的取值范围为-127~128,加上unsigned,取值范围:0~255

使用:

create table t1(id int unsigned);

结果:

 

 2. zerofill

zerofill:不足位数的用0填充

使用:

create table t2(id int(5) zerofill);
insert into t2 values(3);
select * from t2;

结果:

 3. not null(非空)

使用:

### 没有加not null 约束条件
create table t3(id int,name varchar(16));
insert into t3 values (1,'');
insert into t3 values(2,null);
select *from t3;

结果:

 

### 加了 not null约束条件
create table t4(id int,name varchar(16) not null);
insert into t4 values(1,'');
insert into t4 values(2,null);
select * from t4;

结果:加了 not  null约束条件,当往表格中写入null时会报错

""" 在MySQL中,空字符串和null不一样 """

 4. unique(唯一)

 单列唯一:

  使用:单列的值是唯一的

create table t5(id int,name varchar(16) unique);
insert into t5 values(1,'rui');
insert into t5 values(2,'rui');

结果:设定了name 的值是唯一的,所以当在插入相同的name值会报错。

如图:

   联合唯一: 

    使用:unique(字段1,字段2),要求字段1-字段2 的值不能重复。

create table t6(id int,ip varchar(16),port int,unique(ip,port));
insert into t6 values(1,'127.0.0.1',8080);
insert into t6 values(2,'127.0.0.0',8080);
insert into t6 values(3,'127.0.0.1',8080);
select *from t6;

结果如图:

 5. default(默认值)

当没有写值时,就填入初始设定的默认值

使用:

create table t7(id int,name varchar(16) default 'hua');
insert into t7 values(1,'rui');
insert into t7(id) values(2);

结果如图:

6. 主键(primary key)

单纯从约束条件上来看,主键 = not null + unique,非空且唯一。

添加主键:

create table t8(id int primary key,name varchar(32));
insert into t8 values(1,'rui');
insert into t8 values(1,'lin');
insert into t8 values(2,'lin');
select *from t8;

结果:

  InnoDB存储引擎要求每一张表必须要有一个主键,如果没有添加主键,InnoDB存储引擎内部隐藏的有一个主键字段,但是这个隐藏的字段我们看不到,这个主键的目的主要就是用来帮助我们把表创建成功,仅此而已。

一般会给id字段添加主键,sid、aid、uid等都可以。

7. auto_increment(让主键每次自动增加1)

以后创建表的时候,主键的固定写法:id int primary key auto_increment

使用:

create table t9(id int primary key auto_increment, name varchar(32));
insert into t9 values(null); # 报错
insert into t9(name) values('rui');
insert into t9(name) values('hua');
select *from t9;

结果如图:

 

清空表的两种方式

1. delete from t1;  清除数据但不会把主键id的值重置

2. truncate t1;  会把主键id的值重置为1开始并清除数据

推荐使用:truncate,使用truncate如果想恢复数据,还可以补救。

如何恢复数据:binlog日志,记录了你在数据库中执行SQL语句的变化过程,通过binlog日志还可以恢复数据。

补充其他SQL语句

1. 修改表名

'语法格式:'
alter table 表名 rename 新表名;

2. 增加字段

在增加字段的时候,一定要考虑此时表中是否已经有数据了。
'语法格式:'
alter table 表名 add 字段名 数据类型 完整的约束条件 after 字段名;# 在什么字段名之后添加
alter table 表名 add 字段名 数据类型 完整的约束条件 first; # 在第一行添加字段
alter table 表名 add 字段名 数据类型 完整的约束条件;

3. 删除字段

'语法格式:'
alter table 表名 drop 字段名;

4. 修改字段

modify只能改字段数据类型,约束条件,不能改字段名,但是change可以。

当数据表中已经有数据的时候,在修改的时候要仔细看好。

'语法格式:'
alter table 表名 modify 字段名 数据类型 完整约束条件;
alter table 表名 change 旧字段名 新字段名 旧数据类型 完整约束条件;

数据准备

create table emp(
  id int primary key auto_increment,
  name varchar(20) not null,
  sex enum('male','female') not null default 'male', #大部分是男的
  age smallint(3) unsigned not null default 28,
  hire_date date not null,
  post varchar(50),
  post_comment varchar(100),
  salary double(15,2),
  office int, #一个部门一个屋子
  depart_id int
);

插入数据

insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
('tom','male',78,'20150302','teacher',1000000.31,401,1),#以下是教学部
('kevin','male',81,'20130305','teacher',8300,401,1),
('tony','male',73,'20140701','teacher',3500,401,1),
('owen','male',28,'20121101','teacher',2100,401,1),
('jack','female',18,'20110211','teacher',9000,401,1),
('jenny','male',18,'19000301','teacher',30000,401,1),
('sank','male',48,'20101111','teacher',10000,401,1),
('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('呵呵','female',38,'20101101','sale',2000.35,402,2),
('西西','female',18,'20110312','sale',1000.37,402,2),
('乐乐','female',18,'20160513','sale',3000.29,402,2),
('拉拉','female',28,'20170127','sale',4000.33,402,2),
('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3);

 

 

查询关键字—— where筛选

show variable like '%mode%'

模糊查询:没有明确的筛选条件

     关键字: like 

     关键符号:

      %:匹配任意个数任意字符

      _:匹配单个个数任意字符

例题:

1.查询id大于等于3小于等于6的数据

# 方式1:
select * from emp where id >=3 and id<=6;

# 方式2
select * from emp where id between 3 and 6;

 

2. 查询薪资是20000或者18000或者17000的数据

# 方式1
select * from emp where salary =20000 or salary = 18000 or salary=17000;

# 方式2
select * from emp where salary in (20000, 18000, 17000);

 

3. 查询员工姓名中包含o字母的员工姓名和薪资

select name,salary from emp where name like '%o%';

#补充1,以o开头的:
select name,salary from emp where name like 'o%'; 

#补充2,以o结尾的:
select name,salary from emp where name like '%o';

 

4. 查询员工姓名是由四个字符组成的员工姓名与其薪资

# 方式1:
select name,salary from emp where name like '____';
#方式2:
select name,salary from emp where char_length(name)=4;

结果:

 

5. 查询id小于3或者大于6的数据

# 方式1:
select * from emp where id <3 or id >6;
#方式2:
select * from emp where id not between 3 and 6;

结果:

 

6. 查询薪资不在20000,18000,17000范围的数据

select * from emp where salary not in (20000,18000,17000);

结果:

 

7. 查询岗位描述为空的员工名与岗位名(针对null不能用等号,只能用is)

select name,post from emp where post_comment = NULL;  # 查询结果为空!
select name,post from emp where post_comment is NULL;

结果:

 如果字段想设置为空,最好设置为 ‘ ’,不要使用NULL,尤其是两者混用。

归档数据:使用SQL语句把要归档的数据筛选出来。

 

查询关键字——group by分组

分组:把一个整体分成若干个个体

关键字:group by

分组之后,按照哪个字段分组就只能获取到这个字段的值。分组之后只能得到分组的依据。(严格模式下)

分组之后默认只能够直接过去到分组的依据,其他数据都不能直接获取。

" 针对5.6需要自己设置sql_mode = 'only_full_group_by,STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';

分组正常会配合聚合函数使用,聚合函数有:sum、max、min、avg、count

1. 按部门分组

select * from emp group by post;
# 进行验证:
select id,name,sex from emp group by post;

结果:

 2. 每个部门的最低工资

遇到每个肯定是需要分组的,按照每字后面的那个字段进行分组

select post,min(salary) from emp group by post;

结果:

 

3. 每个部门的平均工资

select post,avg(salary) from emp group by post;

结果:

4.  每个部门的工资总和

select post,sum(salary) from emp group by post;

结果:

 5. 每个部门的人数

select post, count(*) from emp group by post;
select post, count(id) from emp group by post;
select post, count(1) from emp group by post; # 第一列的count

配合分组使用的其他函数,分组之后只能获取到分组的依据,通过使用group_contactcontact_ws。

contact:用在分组之前

select concat(name,'|',sex) from emp;

 

group_contact:用在分组之后 ,取出每个部门的所有数据值

select post,group_concat(name,'|',age,'|',sex) from emp group by post;

结果:

 

concat_ws :一般用于分组前,分组后使用的话,按照什么分组就只能拿到分组 其他字段不能直接获取

select post,concat_ws('|', name, age,sex) from emp group by post;

 

补充 :在显示的时候还可以给字段取别名

as可以省略,但是不推荐省略,因为寓意不明确。

select post as '部门',max(salary) as '最高工资' from emp group by post;

 补充:分组也可以按照多个字段分组 

关键字——having过滤

having也是用来筛选数据的

功能上是跟where一样的,但是where用在分组之前,先筛选一遍,而having在分组之后在筛选。

题1:统计各部门年龄在30以上的员工平均薪资,并且保留平均薪资大于10000的部门。

# 第一步:先筛选出年龄在30之上的
select * from emp where age >30;
#第二步:按部门分组算平均工资
select avg(salary) from emp where age >30 group by post;
# 第三步:用having保留avg(salary)大于10000的部门
select avg(salary) from emp where age >30 group by post having avg(salary) >10000;

关键字——distinct去重

将重复的数据去掉,对有重复的展示数据进行去重操作(一定要是重复的数据

select distinct age from emp;
select distinct post from emp;

结果:

 

关键字——order by排序

select * from emp order by salary; #默认升序排,也可以写 asc进行升序排

select * from emp order by salary desc; #降序排

先按照age降序排,在年纪相同的情况下在按照薪资升序排。

select * from emp order by age desc,salary;

结果:

 1. 统计各部门年龄在10岁以上的员工平均薪资,并保留平均薪资大于1000的部门,然后对平均薪资进行排序

# 1.先筛选出年龄在十岁以上的员工
select * from emp where age >10
# 2.按部门分组,求平均工资
select avg(salary) as avg_salary from emp where age >10 group by post
# 3. 筛选出平均工资大于1000的部门
select avg(salary) as avg_salary from emp where age >10 group by post having avg(salary) >1000
# 4. 对平均薪资进行排序
select avg(salary) as avg_salary from emp where age > 10 group by post having avg(salary) > 1000 order by avg(salary) desc;

结果:

 关键字——limit分页

1. 限制展示的条数:

select * from emp limit 3;

 2. 查询工资最高的人的详细信息

select * from emp order by salary desc limit 1;

 

select * from emp limit 0,5;  # 第一个参数表示起始位置,第二个参数表示的是条数,不是索引位置
select * from emp limit 5,5; # 第一个参数代表的是起始位置,第二个参数是限制 的条数

 

 关键字——regexp正则

支持正则

select * from emp where name regexp '^j.*(n|y)$';

 

练习题

1. 查询岗位名以及岗位包含的所有员工名字

select post,group_concat(name) from emp group by post;

结果:

 

 

2. 查询岗位名以及各岗位内包含的员工个数

select post,count(id) from emp group by post;

结果:

 

3. 查询公司内男员工和女员工的个数

select sex,count(sex) from emp group by sex;

结果:

 

4. 查询岗位名以及各岗位的平均薪资

select post,avg(salary) from emp group by post;

结果:

 

5. 查询岗位名以及各岗位的最高薪资

select post,max(salary) from emp group by post;

结果:

 

6. 查询岗位名以及各岗位的最低薪资

select post,min(salary) from emp group by post;

结果:

 

7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资

select sex,avg(salary) from emp group by sex;

结果:

 

posted @ 2023-07-10 19:11  Maverick-Lucky  阅读(79)  评论(0)    收藏  举报