1.单表查询
(1)查询多个字段
指定列查询基础语法:select 字段1,字段2,字段3,... from 表名;
全列查询基础语法:select * from 表名;
注意:
1)在实际开发中不用使用*来进行查询,因为数据库会很大,影响效率;
2)查询的结果是一个表达式,例如,在查询命令中添加一个数值,则查询的结果中每一列都会有这个数值;
如:select id,name,10 from exam;(在查询的每条记录中都会添加一列,值为10)
3)可以通过as关键字来为查询结果中的列指定别名,as和引号都可以省略,但如果别名中存在空格就不能省略引号了;
4)列与列之间可以进行计算;(select chinese+math+english as '总分' from exam)
5)还可以直接加上指定的数字;(select math+10 from exam;)
(2)设置别名
基础语法:select 字段1[AS 别名1],字段2[AS 别名2]... from 表名;
2. 去重查询(DISTINCT)
去重查询是通过关键字DISTINCT来实现,用于返回唯一不同的值(当你在执行查询时,如果某列中包含多个重复的值,使用distinct可以只获取该列中的唯一值)。
基础语法:select distinct 字段列表 from 表名;
(1)使用单个列
eg:
select distinct colum_name from table_name;
colum_name:列名(从中获取唯一值)
table_name:表名
(2)使用多个列
eg:
select distinct colum_name1,colum_name1from table_name;
colum_name1:列名1
colum_name2:列名2
table_name:表名
返回:所有独特的colum_name1和colum_name2的组合值是唯一的,即使此两列中的某一列出现唯一,但两列组合不唯一也无法返回。
注意:
(1)在查询结果中,每一列都相同才认为是重复数据(可以使用多个字段的组合来确定唯一性)
(2)DISTINCT 关键字必须紧跟在 SELECT 关键字之后,并作用于其后指定的字段或字段列表。
3.排序查询
对于多字段,按照字段的前后顺序,如果第一个字段相同,按照第二个字段进行排序。
基础语法:select 字段列表 from 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
排序方式:asc(升序,默认值),desc(降序),可以根据多个字段进行排序,排序的优先级就按照书写的顺序进行排序。
(1)使用别名排序
select id,name,math+chinese+english as '总分' from exam order by 总分 desc;
若三科成绩中有任何一科为null,则总分就是null
注意:
(1)如果数据为null就认为是最小的,升序排在最前面,降序排在最后面;
(2)不论和任何值相加,结果都是null;
(3)始终被看作false;
(4)null并不等同于0;
4.条件查询
比较运算符如图一
基础语法:select 字段列表 from 表名 where 条件列表;
注意:
1)如果表中有null,不参与筛选,所以最终结果不会包括null;
2)同一行的数据是可以比较的,但不能跨行比较;(select name from exam where english>chinese;)
3)如果where后面使用了表达式的话要写完整的表达式,不能写别名(english+math+chinese的别名total);(select name,english+math+chinese as total from exam where english+math+chinese<250 order by total desc)
4)<=> 表示等于,是专门针对null判断的,如null <=> null 的结果为1,null的判断是不能使用“=”判断的;
5)like表示模糊匹配,按照单个字符和任意个字符进行匹配:
1.1)select * from exam where name like '陈%';(陈后面任意个字符)
1.2)select * from exam where name like '陈_'; (陈后面只能跟一个字符)
6)判断是否为null的命令:
1.1)IS NULL 是NULL
1.2)IS NOT NULL 不是NULL
逻辑运算符如图二
OR 任意一个条件为true就符合,哪怕另一个条件不参与比较;
AND 任意条件都需要为true才符合;
优先级:AND 和 OR优先级和Java中一样,and>or,不过仅以根据需求加括号;
SQL的执行顺序
(3)select name,english+math+chinese as total
(1)from exam
(2)where english+math+chinese < 250
(4)order by total desc
1.如果要在数据库中查找某些数据,首先要确定表,先执行from;
2.在查询过程中,渝澳根据指定的查询条件把复合条件的数据过滤出来,只是执行的是where字句;
3.执行select后面的指定的列,这些列最终要加到结果的展示集中;
4.根据order by子句的列名和排序规则进行最后的排序;
图一
图二
5.分页查询
如果直接使用select * from 不加限制来查询全部的数据是不安全的,通过分页查询可以有效的控制一次查询出来的结果集中的记录条数,可以有效的减少数据库服务器的压力,也有利于用户查看。
计算第s页所需的偏移量n: n=(s-1)*每页显示的记录数;(如果说指定的起始位置超出了整个表的范围,就会返回一个空的结果集)
6.分组查询
基础语法:select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
where和having的区别:
执行时机不同:where是分组前进行过滤,不满足where条件不进行分组,having是对分组后的结果进行过滤;
判断条件不同:where不能对聚合函数进行判断,而having可以;
(2)通过having对分组后的数据进行过滤:
select role ,round(avg(salary),2) as '平均薪资'
from emp
group by role
having 平均薪资 >10000 and 平均薪资 < 100000;
7.EXISTS关键字
基础语法:select * from 表名 where exists (select * from 表名);
exists后面括号中的查询语句,如果有结果返回就执行外层查询,如果返回的是一个空结果集,就不执行外层的查询;
select * from course where exists(select * from course where course_id = 100);
注意:
1)先执行select * from course where course_id = 100语句,如果结果返回不是空结果集,则会执行外层的查询,否则不会;
8.临时表查询
在from子句中使用子查询,就是把一个子查询当作一个临时表来使用
select * from score sc,
(select avg(sc.score) as score
from score as sc, student as st,class as c
where c.class_id=st.class_id
and st.student_id=sc.student_id
and c.name='中文系') as tmp
where sc.score > tmp.score;
9.子查询
(1)单行子查询
select * from student where class_id = (select class_id from student where name = '许仙') and name !='许仙';
(2)多行子查询
select * from score where course_id in (select course_id from course where name = '语文' or name = '英文');
(3)多列子查询
select *
from score
where (student_id,course_id,score)
in (select student_id,course_id,score from score group by student_id,course_id,score having count(*) >1);
注意:外层查询中的条件字段和内层查询中的结果对比,完全符合条件才可以;
10.多表查询
联合查询就是联合多个表进行查询,为了消除表中字段的依赖关系,设计数据时把表进行拆分,这是会导致一条SQL语句查询出的数据不够完整,就可以通过联合查询把关系中的数据全部查出来,在一个数据行中显示详细信息;
11.合并查询
合并查询:合并多个查询结果到一个结果集中
基础语法:select 字段列表 from 表A... union[All] select 字段列表 from 表B...;
(1)单表中合并查询
可以直接使用or更加简洁
(2)多表中合并查询
select * from student union select * from student2;
注意:
1)合并显示的两张表的列名要匹配一致;
2)union和union all的区别:
union会自动去除合并结果中的重复行;
union all则会保留素有结果集中的所有行,包括重复的行;