DQL:数据查询语言
--select:选择
1、查询:
查询的内容与表无关时,select 查询内容;
查询的内容与表有关时,select 查询内容 from tableName;
查询指定字段:select colName1,colName2... from tableName;
查询所有字段:select * from tableName;
结果集:查询得到的结果
ps:查询内容可以是所查表中指定字段,也可以是所查表中所有的字段或者函数
2、列别名用法:
格式:select colName1 [as] 列别名,colName2 [as] 列别名... from tableName [where 条件]
注意:列别名可以不加双引号或单引号,但如果列别名中带有空格的话,则必须将列别名加上双引号或单引号
例如:select ename 姓名,sal '工 资' from emp
3、条件查询(where子句):
关系运算符:>,>=,<,<=,=,!=,<>。
作用:条件限制约束等操作,有过滤的作用。
位置:from子句之后。
格式:select colName1,colName2... from tableName where 条件。
注:null在条件中,不能使用=或!=来判断,应该使用is或者is not,因为null与任何事物都不相等
(1)范围查询:使用>,>=和<,<=来进行范围限制或between and来限制。
格式:select colName1,colName2... from tableName where colName [not] between val1 and val2;
注:between val1 and val2相当于闭区间[val1,val2]
(2)集合作条件查询:同一个字段有多个值的情况下使用。
使用:in|not in
格式:select colName1,... from tableName where colName [not] in (元素1,元素2,....);
注:in相当于or,not in相当于and,比较的都是同一字段
集合的其他用法:all与any
格式:
select colName from tableName where colName>all(元素1,元素2,元素3......):大于集合中最大的元素。
select colName from tableName where colName<all(元素1,元素2,元素3......):小于集合中最小的元素。
select colName from tableName where colName>any(元素1,元素2,元素3......):大于集合中最小的元素。
select colName from tableName where colName<any(元素1,元素2,元素3......):小于集合中最大的元素。
注:在mysql中,集合函数(>all,>any,<all,<any)不适用与直接加数字,如:>any(10,20,30)是不允许的,但是我们可以将(10,20,30)转换为子查询
(3)模糊查询:like关键字
格式:select colName from tableName where colName like value。
通配符:
%:0或0个以上的字符
_:匹配一个字符。
例如:查询列中带字母a的值
select colName from tableName where colName like "%a%";
4、排序:当在查询表中数据时,记录较多需要进行排序时,可以使用order by子句。
格式:select colName from tableName where 条件 order by colName 排序规则
排序规则:
升序:asc(默认)
降序:desc
注:当order by后是一个字段时,就按该字段的排序规则进行排序,如果order by后是多个排序规则,则会先按照第一个排序规则进行排序,在第一个排序结果相同时,会按照第二个排序规则进行排序
5、desc
1)查询表结构 -- desc 表名
2)排序的降序规则 -- order by 字段 desc
如果设计表时,字段名叫desc,在使用该字段时,会出现错误,如果一定要使用desc为字段名,则需将该字段名进行转义:`字段名`
6、去重:对重复的记录进行去重操作
关键字:distinct(必须写在select关键字后)
格式:select distinct colName from tableName
注:distinct可以对一个字段进行去重,也可以对多个字段进行去重(联合去重)
7、分组查询与分组函数(聚合函数)
用途:查询表中的记录总数,或者查询表中以某字段分组进行查询,如每个部门的总工资,平均工资,总人数等,这种情况需要对表中的数据进行分组统计。
用法:group by Field1[,Field2]。
格式:select ... from tableName [where 条件] [group by子句] [order by子句]
注:在分组查询时,select子句中的值如果含有组标志或组函数,就尽量不要含有非组标志或组函数,如果在select后边既有组函数,又有非组函数(普通字段),那么在oracle数据库中,该语句会出现错误,而在mysql数据库中,
该语句没有错误,但是查询结果不正确,所以我们要避免在select后面既有组函数,又有普通字段
聚合函数:
count(Filed):统计指定字段的记录数,*:统计指定表中有多少条记录,字段名:统计指定表中该字段不为空的个数
sum(Filed):统计指定字段的和。
avg(Filed):统计指定字段的平均值
max(Filed):返回指定字段中的最大值。
min(Filed):返回指定字段中的最小值。
ifnull(field,value):如果field字段对应值不是null,就使用field的值,如果是null,就使用value。
注:聚合函数会忽略null值,因此有时候需要使用函数ifnull()
多字段分组:
field1, field2
10 500
20 600
30 700
注::多字段分组时,最多分组的数目为Filed1*Field2[*Filed3....]
8、having子句:
用途:在分组查询时,有的时候可能需要再次使用条件进行过滤,这个时候不能where子句,应该使用having子句,having子句后可以使用聚合函数。
位置:位于group by子句后
面试题:where和having的区别?
1)where后面放的是字段名,having后面可以放聚合函数(where属于一次过滤,having是对分组结果二次过滤)
2)书写位置:where放在group by之前,having group by之后
3)执行顺序:where先执行,having后执行
总结:
一个基本的查询语句包含的子句有:
select子句
from子句
where子句
group by子句
having子句
order by子句
一个完整的查询语句:
select..from..[where..][group by..][having..][order by..]
执行顺序:
先执行from子句。
再执行where子句
然后group by子句
再次having子句
之后select子句
最后order by子句