目录
1、简单的查询语句(DQL)
语法格式:
select 字段名1,字段名2,字段名3,.... from 表名;
note:
- 任何一条sql语句以“;”结尾。
- sql语句不区分大小写。
1) 查询员工的年薪?(字段可以参与数学运算。)
select ename,sal * 12 from emp;
2)如何给查询结果的列重命名?
select ename,sal * 12 as yearsal from emp;
select ename,sal * 12 yearsal from emp; (as也可以省略)
3) 别名中出现中文?
select ename,sal * 12 as 年薪 from emp; // 报错
select ename,sal * 12 as '年薪' from emp;
注意:标准sql语句中要求字符串使用单引号''括起来。虽然mysql支持双引号,尽量别用。
2、条件查询。
语法格式:
select
字段,字段...
from
表名
where
条件;
执行顺序:from>where>select
条件查询需要用到where语句,where必须放到from语句表的后面
支持如下运算符:
练习:
#1.查询工资等于5000的员工姓名?
mysql> select ename from emp where sal = 5000 ;
+-------+
| ename |
+-------+
| KING |
+-------+
#2.查询SMITH的工资?
mysql> select ename,sal from emp where ename = 'SMITH';
+-------+--------+
| ename | sal |
+-------+--------+
| SMITH | 800.00 |
+-------+--------+
#3.找出工资高于3000的员工?
mysql> select ename,sal from emp where sal > 3000;
+-------+---------+
| ename | sal |
+-------+---------+
| KING | 5000.00 |
+-------+---------+
#4.找出工资不等于3000的?
select ename,sal from emp where sal <> 3000;
select ename,sal from emp where sal != 3000;
#5.找出工资在1100和3000之间的员工,包括1100和3000?
select ename,sal from emp where sal >= 1100 and sal <= 3000;
select ename,sal from emp where sal between 1100 and 3000; #between...and...是闭区间
#between and除了可以使用在数字方面之外,还可以使用在字符串方面。(用在字符串上是左闭右开)
mysql> select ename from emp where ename between 'A' and 'C';
+-------+
| ename |
+-------+
| ALLEN |
| BLAKE |
| ADAMS |
+-------+
#6.NUll代表空,不是一个值,必须用is null 或者is not null
#找出哪些人津贴为NULL?
select ename,sal,comm from emp where comm is null;
#找出哪些人没有津贴?
select ename,sal,comm from emp where comm is null or comm = 0;
+--------+---------+------+
| ename | sal | comm |
+--------+---------+------+
| SMITH | 800.00 | NULL |
| JONES | 2975.00 | NULL |
| BLAKE | 2850.00 | NULL |
| CLARK | 2450.00 | NULL |
| SCOTT | 3000.00 | NULL |
| KING | 5000.00 | NULL |
| TURNER | 1500.00 | 0.00 |
| ADAMS | 1100.00 | NULL |
| JAMES | 950.00 | NULL |
| FORD | 3000.00 | NULL |
| MILLER | 1300.00 | NULL |
+--------+---------+------+
#7.找出工作岗位是MANAGER和SALESMAN的员工?
select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
select ename,job from emp where job in ('MANAGER' ,'SALESMAN');#in后面的值不是区间,是具体的值。
+--------+----------+
| ename | job |
+--------+----------+
| ALLEN | SALESMAN |
| WARD | SALESMAN |
| JONES | MANAGER |
| MARTIN | SALESMAN |
| BLAKE | MANAGER |
| CLARK | MANAGER |
| TURNER | SALESMAN |
+--------+----------+
#8.模糊查询like
#找出名字当中含有O的?
select ename from emp where ename like '%O%';
+-------+
| ename |
+-------+
| JONES |
| SCOTT |
| FORD |
+-------+
###在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_
(%代表任意多个字符,_代表任意1个字符。)
3、数据排序
排序采用order by子句,order by后面跟排序的字段,多个字段采用逗号间隔,order by默认采用升序(asc),如果存在where子句那么order by必须放到where语句的后面。
语法结构:
select
字段 3
from
表名 1
where
条件 2
order by
.... 4
order by是最后执行的。
实例:1.按照工资的降序排列,当工资相同的时候再按照名字的升序排列。
select ename,sal from emp order by sal desc , ename asc;
Note:
- order by 默认是升序,asc表示升序,desc表示降序。
- 越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段
2.找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列。
mysql> select ename ,job ,sal from emp where job = 'SALESMAN' order by sal desc;
+--------+----------+---------+
| ename | job | sal |
+--------+----------+---------+
| ALLEN | SALESMAN | 1600.00 |
| TURNER | SALESMAN | 1500.00 |
| WARD | SALESMAN | 1250.00 |
| MARTIN | SALESMAN | 1250.00 |
+--------+----------+---------+
4、分组函数/聚合函数/多行处理函数
- count 计数
- sum 求和
- avg 平均值
- max 最大值
- min 最小值
练习:1.找出工资高于平均工资的员工?
mysql> select ename,sal from emp where sal > avg(sal);
ERROR 1111 (HY000): Invalid use of group function
报错的原因:分组函数是在group by 之后执行的,而where优先于group by执行。所以在执行where语句时avg(sal)还没有开始计算,是无效的。
正确写法:select ename,sal from emp where sal > (select avg(sal) from emp); #小括号()里的先执行,相当于先求出平均薪资,再把sal跟计算好的平均薪资比较
2.count(*)和count(具体的某个字段)的区别?
mysql> select count(*) from emp ;
+----------+
| count(*) |
+----------+
| 14 |
+----------+
1 row in set (0.01 sec)
mysql> select count(comm) from emp ;
+-------------+
| count(comm) |
+-------------+
| 4 |
+-------------+
- count(*):统计总记录条数。(和某个字段无关)
- count(comm): 表示统计comm字段中不为NULL的数据总数量。
3.分组函数也能组合使用:
分组函数的特点:
- 所有的分组函数都是对“某一组”数据进行操作的;
- 输入多行,最终输出的结果却是1行。
- 分组函数自动忽略NULL。
- 分组函数不能直接出现在where子句中
单行处理函数:输入一行,输出结果也是一行
典型的单行处理函数:ifnull() 空处理函数
例如:计算每个员工的年薪?
select ename,(sal+comm)*12 as yearsal from emp; //错误,有null参与的运算结果只能是null
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
# infull(comm,0) 将comm字段中出现null的地方,用0代替
5、分组查询 group by
group by : 按照某个字段或者某些字段进行分组。
having : having是对分组之后的数据进行再次过滤。having必须搭配group by 使用
案例1:找出每个工作岗位的最高薪资。
mysql> select max(sal),job from emp group by job;
+----------+-----------+
| max(sal) | job |
+----------+-----------+
| 1300.00 | CLERK |
| 1600.00 | SALESMAN |
| 2975.00 | MANAGER |
| 3000.00 | ANALYST |
| 5000.00 | PRESIDENT |
+----------+-----------+
语法特点:
- 分组函数一般都会和group by联合使用,分组函数必须在group by语句执行结束之后才会执行(当一条sql语句没有group by的话,那整张表的数据会自成一组)。
- 当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。
案例2:找出每个部门的最高薪资,要求显示薪资大于2900的数据。
mysql> select max(sal),deptno from emp group by deptno having max(sal) > 2900;
+----------+--------+
| max(sal) | deptno |
+----------+--------+
| 3000.00 | 20 |
| 5000.00 | 10 |
+----------+--------+
2 rows in set (0.00 sec)
mysql> select max(sal),deptno from emp where sal > 2900 group by deptno;
+----------+--------+
| max(sal) | deptno |
+----------+--------+
| 3000.00 | 20 |
| 5000.00 | 10 |
+----------+--------+
以上两种方法都可以实现,但是where的效率会比having高很多,所以能够使用where过滤的尽量使用where。
6、总结(DQL语法)
一个完整的DQL语句的写法以及执行顺序:
select 字段 5
from 表名 1
where 条件 2
group by 分组的字段 3
having 过滤条件 4
order by ......... 6
原则:能在where中过滤的数据,尽量在where中过滤,效率较高。having的过滤是专门对分组之后的数据进行过滤的。