DQL(数据查询语句)
1.简单查询
格式: select 字段名1,字段名2... from 表名;
mysql> desc emp;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| EMPNO | int | NO | PRI | NULL | |
| ENAME | varchar(10) | YES | | NULL | |
| JOB | varchar(9) | YES | | NULL | |
| MGR | int | YES | | NULL | |
| HIREDATE | date | YES | | NULL | |
| SAL | double(7,2) | YES | | NULL | |
| COMM | double(7,2) | YES | | NULL | |
| DEPTNO | int | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
提示:sql语句以分号结尾;sql语句不区分大小写
查询年薪?
select ename,sal12 from emp; (字段可以参与数学运算)
给查询结果的列重命名?
select ename,sal12 as yearsal from emp; (as关键字重命名,as关键字可省略)
select ename,sal*12 as '年薪' from emp; (sql语句中的字符串使用单引号)
查询全部字段?
select * from emp; (程序中不建议使用,效率低)
2.条件查询
格式:select 字段名 from 表明 where 条件; (执行顺序: from ——> where ——> select)
常用条件:
查询工资等于5000的员工?
select ename from emp where sal = 5000;
+-------+
| ename |
+-------+
| KING |
+-------+
= | |
---|---|
<>= | |
< | |
> | |
>= | |
and | and优先级高于or,可使用小括号提高优先级 |
or | |
not | 非,常跟is或in |
between ...and... | 等同于 >= and <= ,除了可以用于数字也用于字母,数字是包含关系,字母是左闭右开 |
is null | null 不是一个值,表示为空,因此不能用等号衡量。反义为is not null |
in | 等同于or,eg:in (’manage‘,’sal‘)。反义为not in |
like | 模糊查询,可以用来匹配%或下划线 。%代表任意多个字符,_代表任意一个字符 |
+------+-----------+ | |
id | name |
+------+-----------+ | |
1 | feefee |
2 | xiao_ming |
3 | tt |
+------+-----------+ | |
查询带有下划线的名字? | |
select name from t_user where name like '%_%'; (斜杠转义) |
3.排序
order by 关键字,默认为升序,asc也可表示升序,desc降序
select ename,sal from emp order by sal;
select ename,sal from emp order by sal desc; 降序查询
select ename,sal from emp order by sal desc, ename; 多个字段同时排序,用逗号隔开,靠前的字段主导作用越大,只有前面的字段无法完成排序的时候才会启用后面的字段。
select ename,sal from emp order by 2;order by后面可跟字段的顺序,表示根据第二列排序,不建议使用,该方法不够健壮,字段位置发生变化时就失效了
select
*
from
tablename
where
条件
order by
......;(执行顺序;from ,where,select,order by)
4.分组函数
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
注意:所有分组函数都是针对某一组数据操作的,也叫多行处理函数。
特点:分组函数自动忽略null,不需要额外添加判断null的条件
记住:NULL参与表达式运算时,所得结果一定为NULL。
ifnull() 空处理函数?
ifnull(可能是null的数据,如为null则当作什么处理):属于单行处理函数
select ifnull(comm,0) from emp;
+----------------+
| ifnull(comm,0) |
+----------------+
| 0.00 |
| 300.00 |
| 500.00 |
| 0.00 |
| 1400.00 |
| 0.00 |
| 0.00 |
| 0.00 |
| 0.00 |
| 0.00 |
| 0.00 |
| 0.00 |
| 0.00 |
| 0.00 |
+----------------+
记住:SQL语法规则,分组函数不能直接使用在where子句中。因为group by在where之后才会执行
count(*) :和字段没关系,统计总记录体条数
count(字段):统计该字段中不为NULL的数据总数量
分组函数也可以组合起来使用:
select avg(sal),count(sal),max(sal) from emp;
单行处理函数和分组函数(即多行处理函数)区别?
单行处理单数一行一行处理数据,处理多少行则返回多少行数据
多行处理函数,处理多行数据输出一行结果
案例:找出工资高于平均工资的员工
select ename,sal from emp where sal > (select avg(sal) from emp);
嵌套子查询
5.group by和having
group by:按照某个字段或某些字段分组
having:是对分组之后的数据再次进行分组过滤,是group by的搭档
案例:找出每个工作岗位的最高薪资。
select job,max(sal) from emp group by job;
执行顺序:form, group by,select max
分组函数一般都会个group by一起使用,因此叫做分组函数的原因。并且任何一个分组函数都是在group by后面执行。没有group by时整张表数据自成一组。
当一条语句有group by时,select后只能跟参与分组的字段和分组函数。
select ename,job,max(sal) from emp group by job;
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'bjpowernode.emp.ENAME' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
select xx 5
from tablename 1
where xx 2
group by xx 3
having xx 4
order by xx 6
多字段分组查询(可将多个字段看成一个字段):
group by 字段1,字段2
select deptno,job,max(sal) from emp group by deptno,job;
找出每个部门的最高薪资,要求显示薪资大于2900的数据?
select max(sal) from emp group by deptno having max(sal) > 2900; (效率低)
select max(sal) from emp where sal >2900 group by deptno;(推荐)
尽量先使用where,实在不行再使用having
找出每个部分的平均薪资,要求显示薪资大于2000的数据?
select avg(sal) from emp group by deptno having avg(sal) > 2000;
关于查询结果去重:关键字distinct
select distinct job from emp;
distinct只能出现在所有字段的最前面。后面的字段联合起来去重