MySQL查询关键字()

MySQL查询关键字

  • MySQL查询关键字SQL语句查询关键字前期数据准备编写SQL语句的小技巧查询关键字之where筛选查询关键字之group by分组查询关键字之having过滤查询关键字之distinct去重查询关键字之order by排序查询关键字之limit分页查询关键字之regexp正则表达式多表查询的思路
  • SQL语句查询关键字
  • 前期数据准备
  • 编写SQL语句的小技巧
  • 查询关键字之where筛选
  • 查询关键字之group by分组
  • 查询关键字之having过滤
  • 查询关键字之distinct去重
  • 查询关键字之order by排序
  • 查询关键字之limit分页
  • 查询关键字之regexp正则表达式
  • 多表查询的思路

SQL语句查询关键字

select  # 选择,指定需要查询的字段信息
select * #查询所有字段
select name  #查name字段
select char_length(name) # 支持对字段做处理 

from #来自...
	# 指定需要查询的表信息
    from mysql.user
    from t1

SQL语句中关键字的执行顺序和编写顺序并不是一致的,可能会错乱。
	eg:
    select id,name from userinfo;
    我们先写的select再写的from,但是执行的时候是先执行的from再执行select
ps:
    对应关键字的编写顺序和执行顺序没必要过于在意,熟练之后会自然编写,只要把注意力放在每个关键字的功能上即可。

前期数据准备

mysql> create table emp(
    ->   id int primary key auto_increment,
    ->   name varchar(20) not null,
    ->   gender enum('male','female') not null default 'male', 
    #大部分是男的
    ->   age int(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
    -> );
Query OK, 0 rows affected (1.60 sec)

#插入记录
#三个部门:教学,销售,运营
mysql> insert into emp(name,gender,age,hire_date,post,salary,office,depart_id)
    -> values
    -> ('jason','male',18,'20170301','浦东第一帅形象代言',7300.33,401,1),
    #以下是教学部
    -> ('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);
Query OK, 18 rows affected (0.38 sec)

编写SQL语句的小技巧

1.select后面的字段名可以先用*占位往后写,最后再修改占位符替代的内容;
2.实际应用中select后面很少写*,因为*表示所有,如表中字段和数据都特别多的情况下会非常浪费数据库资源;
"""
SQL语句的编写类似于代码的编写,需要反复修改补充。
"""

查询关键字之where筛选

# 1.查询id大于等于3小于等于6的数据
mysql> select * from emp where id >=3 and id <=6;
4 rows in set (0.14 sec)
#支持逻辑运算符
mysql> select *from emp where id between 3 and 6;
4 rows in set (0.07 sec)

# 2.查询薪资是20000或者18000或者17000的数据
mysql> select * from emp where salary =20000 or salary=18000 or salary = 17000;
3 rows in set (0.01 sec)
mysql> select * from emp where salary in (20000,18000,17000);
3 rows in set (0.00 sec)

# 3.查询id小于3大于6的数据
mysql> select * from emp where id<3 or id>6;
mysql> select * from emp where id not between 3 and 6;

# 4.查询员工姓名中包含字母o的员工姓名与薪资
mysql> select * from emp where name like '%o%';

"""
条件不够精确的查询称为模糊查询,关键字为like
"""
#模糊查询常用符号:
	%:匹配任意个数的任意字符
    	例:%o%	o jason owen loo wwoww
        	%o	  o	asdasdo asdo
	_:匹配单个个数的任意字符
        例:_o_	aox	wob iok 
        	o_	 oi ok ol

# 5.查询员工姓名是由四个字符组成的员工姓名与其薪资
mysql> select * from emp where name like'____';
#四个下划线,一个下划线代表一个字符
mysql> select * from emp where char_length(name)=4;

# 6.查询岗位描述为空的员工名与岗位名(针对null不能用等号,只能用is)
mysql> select * from emp where post_comment=NULL;
Empty set (0.00 sec)# 找不到
mysql> select * from emp where post_comment is NULL;
18 rows in set (0.00 sec)

查询关键字之group by分组

分组:
	意思就是按照指定的条件将单个的数据分类再组成整体,目的也是为了更好地统计数据。
eg:将学生按照性别分组、将全国人民按照民族分组、将全部人类按照肤色分组

#聚合函数:专门用于分组之后的数据统计
"""
max\min\sum\avg\count
最大值、最小值、总和、平均数、计数
"""

1.将员工数据按照部门分组
mysql> select * from emp group by post;
"""
MySQL5.6默认不会报错
	set global sql_mode='strict_trans_tables,only_full_group_by'
MySQL5.7及8.0默认都会直接报错
	因为分组之后,select后面默认只能直接填写分组的依据,不能再写其他字段
		select post from emp group by post;
		select age from emp group by age;		
	分组之后默认的最小单位就应该是组,而不应该再是组内的单个数据单个字段
"""

2.获取每个部门的最高工资
# 判断是否需要分组可以从题目的需求中分析,特别是出现关键字(每个,平均)
mysql> select post,max(salary)from emp group by post;
"""
针对SQL语句执行之后的结果,可以修改字段名称,关键as也可以省略
select post as'部门',max(salary)as'最高薪资'from emp group by post;
"""

3.一次获取部门薪资相关统计
mysql> select post,max(salary) '最高薪',min(salary) '最低薪',avg(salary) '平均薪资',sum(salary) '月支出' from emp group by post;

4.统计每个部门的人数
mysql> select post,count(id) from emp group by post;

5.统计每个部门的部门名称以及部门下的员工姓名
mysql> select post,name from emp group by post;
mysql> select post,group_concat(name)from emp group by post;
mysql> select post ,group_concat(name,age) from emp group by post;

# 格式化输出,解压赋值
mysql> select post,group_concat(name,'|',age)from emp group by post;
mysql> select post,group_concat(name,'_NB')from emp group by post;
mysql> select post,group_concat('DSB_',name,'_NB')from emp group by post;

查询关键字之having过滤

having与where一样都用来对数据做筛选,但是where用在分组之前(首次筛选),having用在分组之后(二次筛选)
1.统计各部门年龄在30岁以上的员工平均工资,并且保留大于10000的数据
"""
	在写复杂的SQL时跟写代码一样,提前构思大致步骤,将每条SQL的结果看成一张表,基于该表如果还想继续操作则直接在产生该表的SQL语句上添加即可。
"""
	步骤1:先筛选出所有年龄大于30岁的员工数据
    	select * from emp where age > 30;
 	步骤2:再对筛选出来的数据按照部门分组并统计平均薪资
    	select post,avg(salary) from emp where age > 30 group by post;
 	步骤3:针对分组统计之后的结果做二次筛选
    	select post,avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;

查询关键字之distinct去重

去重的必需条件:必须有一模一样的数据
mysql> select distinct id ,age from emp;
# 关键字针对多个字段组合的结果
mysql> select distinct age from emp;
# 去重成功
mysql> select distinct age,post from emp;
# 必须两个关键字数据都相同才能去重

查询关键字之order by排序

1.单个字段排序
mysql> select * from emp order by age;
# 默认升序
mysql> select * from emp order by age asc;
# 默认升序(asc可省略)
mysql> select * from emp order by age desc;
# 默认升序变降序

2.多个字段排序
mysql> select * from emp order by age,salary desc;
# 先按照年龄升序排,相同的情况下再按照薪资降序排

	# 统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序
1.先筛选出所有年龄大于10岁的员工
mysql> select * from emp where age>10;
2.再对他们按照部门分组统计平均薪资
mysql> select post,avg(salary)from emp where age>10 group by post;
3.针对分组的结果做二次筛选
mysql> select post,avg(salary)from emp where age>10 group by post having avg(salary)>10000;
4.最后按照指定字段排序
 	select post,avg(salary) from emp where age > 10 group by post having avg(salary)>1000 order by avg(salary);

查询关键字之limit分页

当表中数据特别多的情况下 我们很少会一次性获取所有的数据
	很多网站也是做了分页处理 一次性只能看一点点
  
select * from emp limit 5;  直接限制展示的条数
select * from emp limit 5,5;  从第5条开始往后读取5条

查询工资最高的人的详细信息
'''千万不要关系思维 一看到工资最高就想着用分组聚合'''
select * from emp order by salary desc limit 1;

查询关键字之regexp正则表达式

SQL语句的模糊匹配如果用不习惯 也可以自己写正则批量查询
	select * from emp where name regexp '^j.*?(n|y)$';

多表查询的思路

表数据准备
create table dep(
  id int primary key auto_increment,
  name varchar(20) 
);

create table emp(
  id int primary key auto_increment,
  name varchar(20),
  sex enum('male','female') not null default 'male',
  age int,
  dep_id int
);

#插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营'),
(205,'财务');

insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('dragon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);


select * from emp,dep;  会将两张表中所有的数据对应一遍
这个现象我们也称之为'笛卡尔积' 无脑的对应没有意义 应该将有关系的数据对应到一起才合理
基于笛卡尔积可以将部门编号与部门id相同的数据筛选出来
涉及到两张及以上的表时 字段很容易冲突 我们需要在字段前面加上表名来指定
select * from emp,dep where emp.dep_id=dep.id;
基于上述的操作就可以将多张表合并到一起然后一次性获取更多的数据
————————

MySQL查询关键字

  • MySQL查询关键字SQL语句查询关键字前期数据准备编写SQL语句的小技巧查询关键字之where筛选查询关键字之group by分组查询关键字之having过滤查询关键字之distinct去重查询关键字之order by排序查询关键字之limit分页查询关键字之regexp正则表达式多表查询的思路
  • SQL语句查询关键字
  • 前期数据准备
  • 编写SQL语句的小技巧
  • 查询关键字之where筛选
  • 查询关键字之group by分组
  • 查询关键字之having过滤
  • 查询关键字之distinct去重
  • 查询关键字之order by排序
  • 查询关键字之limit分页
  • 查询关键字之regexp正则表达式
  • 多表查询的思路

SQL语句查询关键字

select  # 选择,指定需要查询的字段信息
select * #查询所有字段
select name  #查name字段
select char_length(name) # 支持对字段做处理 

from #来自...
	# 指定需要查询的表信息
    from mysql.user
    from t1

SQL语句中关键字的执行顺序和编写顺序并不是一致的,可能会错乱。
	eg:
    select id,name from userinfo;
    我们先写的select再写的from,但是执行的时候是先执行的from再执行select
ps:
    对应关键字的编写顺序和执行顺序没必要过于在意,熟练之后会自然编写,只要把注意力放在每个关键字的功能上即可。

前期数据准备

mysql> create table emp(
    ->   id int primary key auto_increment,
    ->   name varchar(20) not null,
    ->   gender enum('male','female') not null default 'male', 
    #大部分是男的
    ->   age int(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
    -> );
Query OK, 0 rows affected (1.60 sec)

#插入记录
#三个部门:教学,销售,运营
mysql> insert into emp(name,gender,age,hire_date,post,salary,office,depart_id)
    -> values
    -> ('jason','male',18,'20170301','浦东第一帅形象代言',7300.33,401,1),
    #以下是教学部
    -> ('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);
Query OK, 18 rows affected (0.38 sec)

编写SQL语句的小技巧

1.select后面的字段名可以先用*占位往后写,最后再修改占位符替代的内容;
2.实际应用中select后面很少写*,因为*表示所有,如表中字段和数据都特别多的情况下会非常浪费数据库资源;
"""
SQL语句的编写类似于代码的编写,需要反复修改补充。
"""

查询关键字之where筛选

# 1.查询id大于等于3小于等于6的数据
mysql> select * from emp where id >=3 and id <=6;
4 rows in set (0.14 sec)
#支持逻辑运算符
mysql> select *from emp where id between 3 and 6;
4 rows in set (0.07 sec)

# 2.查询薪资是20000或者18000或者17000的数据
mysql> select * from emp where salary =20000 or salary=18000 or salary = 17000;
3 rows in set (0.01 sec)
mysql> select * from emp where salary in (20000,18000,17000);
3 rows in set (0.00 sec)

# 3.查询id小于3大于6的数据
mysql> select * from emp where id<3 or id>6;
mysql> select * from emp where id not between 3 and 6;

# 4.查询员工姓名中包含字母o的员工姓名与薪资
mysql> select * from emp where name like '%o%';

"""
条件不够精确的查询称为模糊查询,关键字为like
"""
#模糊查询常用符号:
	%:匹配任意个数的任意字符
    	例:%o%	o jason owen loo wwoww
        	%o	  o	asdasdo asdo
	_:匹配单个个数的任意字符
        例:_o_	aox	wob iok 
        	o_	 oi ok ol

# 5.查询员工姓名是由四个字符组成的员工姓名与其薪资
mysql> select * from emp where name like'____';
#四个下划线,一个下划线代表一个字符
mysql> select * from emp where char_length(name)=4;

# 6.查询岗位描述为空的员工名与岗位名(针对null不能用等号,只能用is)
mysql> select * from emp where post_comment=NULL;
Empty set (0.00 sec)# 找不到
mysql> select * from emp where post_comment is NULL;
18 rows in set (0.00 sec)

查询关键字之group by分组

分组:
	意思就是按照指定的条件将单个的数据分类再组成整体,目的也是为了更好地统计数据。
eg:将学生按照性别分组、将全国人民按照民族分组、将全部人类按照肤色分组

#聚合函数:专门用于分组之后的数据统计
"""
max\min\sum\avg\count
最大值、最小值、总和、平均数、计数
"""

1.将员工数据按照部门分组
mysql> select * from emp group by post;
"""
MySQL5.6默认不会报错
	set global sql_mode='strict_trans_tables,only_full_group_by'
MySQL5.7及8.0默认都会直接报错
	因为分组之后,select后面默认只能直接填写分组的依据,不能再写其他字段
		select post from emp group by post;
		select age from emp group by age;		
	分组之后默认的最小单位就应该是组,而不应该再是组内的单个数据单个字段
"""

2.获取每个部门的最高工资
# 判断是否需要分组可以从题目的需求中分析,特别是出现关键字(每个,平均)
mysql> select post,max(salary)from emp group by post;
"""
针对SQL语句执行之后的结果,可以修改字段名称,关键as也可以省略
select post as'部门',max(salary)as'最高薪资'from emp group by post;
"""

3.一次获取部门薪资相关统计
mysql> select post,max(salary) '最高薪',min(salary) '最低薪',avg(salary) '平均薪资',sum(salary) '月支出' from emp group by post;

4.统计每个部门的人数
mysql> select post,count(id) from emp group by post;

5.统计每个部门的部门名称以及部门下的员工姓名
mysql> select post,name from emp group by post;
mysql> select post,group_concat(name)from emp group by post;
mysql> select post ,group_concat(name,age) from emp group by post;

# 格式化输出,解压赋值
mysql> select post,group_concat(name,'|',age)from emp group by post;
mysql> select post,group_concat(name,'_NB')from emp group by post;
mysql> select post,group_concat('DSB_',name,'_NB')from emp group by post;

查询关键字之having过滤

having与where一样都用来对数据做筛选,但是where用在分组之前(首次筛选),having用在分组之后(二次筛选)
1.统计各部门年龄在30岁以上的员工平均工资,并且保留大于10000的数据
"""
	在写复杂的SQL时跟写代码一样,提前构思大致步骤,将每条SQL的结果看成一张表,基于该表如果还想继续操作则直接在产生该表的SQL语句上添加即可。
"""
	步骤1:先筛选出所有年龄大于30岁的员工数据
    	select * from emp where age > 30;
 	步骤2:再对筛选出来的数据按照部门分组并统计平均薪资
    	select post,avg(salary) from emp where age > 30 group by post;
 	步骤3:针对分组统计之后的结果做二次筛选
    	select post,avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;

查询关键字之distinct去重

去重的必需条件:必须有一模一样的数据
mysql> select distinct id ,age from emp;
# 关键字针对多个字段组合的结果
mysql> select distinct age from emp;
# 去重成功
mysql> select distinct age,post from emp;
# 必须两个关键字数据都相同才能去重

查询关键字之order by排序

1.单个字段排序
mysql> select * from emp order by age;
# 默认升序
mysql> select * from emp order by age asc;
# 默认升序(asc可省略)
mysql> select * from emp order by age desc;
# 默认升序变降序

2.多个字段排序
mysql> select * from emp order by age,salary desc;
# 先按照年龄升序排,相同的情况下再按照薪资降序排

	# 统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序
1.先筛选出所有年龄大于10岁的员工
mysql> select * from emp where age>10;
2.再对他们按照部门分组统计平均薪资
mysql> select post,avg(salary)from emp where age>10 group by post;
3.针对分组的结果做二次筛选
mysql> select post,avg(salary)from emp where age>10 group by post having avg(salary)>10000;
4.最后按照指定字段排序
 	select post,avg(salary) from emp where age > 10 group by post having avg(salary)>1000 order by avg(salary);

查询关键字之limit分页

当表中数据特别多的情况下 我们很少会一次性获取所有的数据
	很多网站也是做了分页处理 一次性只能看一点点
  
select * from emp limit 5;  直接限制展示的条数
select * from emp limit 5,5;  从第5条开始往后读取5条

查询工资最高的人的详细信息
'''千万不要关系思维 一看到工资最高就想着用分组聚合'''
select * from emp order by salary desc limit 1;

查询关键字之regexp正则表达式

SQL语句的模糊匹配如果用不习惯 也可以自己写正则批量查询
	select * from emp where name regexp '^j.*?(n|y)$';

多表查询的思路

表数据准备
create table dep(
  id int primary key auto_increment,
  name varchar(20) 
);

create table emp(
  id int primary key auto_increment,
  name varchar(20),
  sex enum('male','female') not null default 'male',
  age int,
  dep_id int
);

#插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营'),
(205,'财务');

insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('dragon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);


select * from emp,dep;  会将两张表中所有的数据对应一遍
这个现象我们也称之为'笛卡尔积' 无脑的对应没有意义 应该将有关系的数据对应到一起才合理
基于笛卡尔积可以将部门编号与部门id相同的数据筛选出来
涉及到两张及以上的表时 字段很容易冲突 我们需要在字段前面加上表名来指定
select * from emp,dep where emp.dep_id=dep.id;
基于上述的操作就可以将多张表合并到一起然后一次性获取更多的数据