select .. from .. where .. group by .. having .. order by .. limit ..; 顺序:5 1 2 3 4 6 7
简单查询
语法格式
1
select 字段名1,字段名2,... from 表名;
查询一个字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
mysql>select ename from emp; +--------+ | ename | +--------+ | SMITH | | ALLEN | | WARD | | JONES | | MARTIN | | BLAKE | | CLARK | | SCOTT | | KING | | TURNER | | ADAMS | | JAMES | | FORD | | MILLER | +--------+
查询多个字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
mysql>select ename,sal from emp; +--------+---------+ | ename | sal | +--------+---------+ | SMITH |800.00| | ALLEN |1600.00| | WARD |1250.00| | JONES |2975.00| | MARTIN |1250.00| | BLAKE |2850.00| | CLARK |2450.00| | SCOTT |3000.00| | KING |5000.00| | TURNER |1500.00| | ADAMS |1100.00| | JAMES |950.00| | FORD |3000.00| | MILLER |1300.00| +--------+---------+
查询全部字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
mysql>select*from emp; +-------+--------+-----------+------+------------+---------+---------+--------+ | EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO | +-------+--------+-----------+------+------------+---------+---------+--------+ |7369| SMITH | CLERK |7902|1980-12-17|800.00|NULL|20| |7499| ALLEN | SALESMAN |7698|1981-02-20|1600.00|300.00|30| |7521| WARD | SALESMAN |7698|1981-02-22|1250.00|500.00|30| |7566| JONES | MANAGER |7839|1981-04-02|2975.00|NULL|20| |7654| MARTIN | SALESMAN |7698|1981-09-28|1250.00|1400.00|30| |7698| BLAKE | MANAGER |7839|1981-05-01|2850.00|NULL|30| |7782| CLARK | MANAGER |7839|1981-06-09|2450.00|NULL|10| |7788| SCOTT | ANALYST |7566|1987-04-19|3000.00|NULL|20| |7839| KING | PRESIDENT |NULL|1981-11-17|5000.00|NULL|10| |7844| TURNER | SALESMAN |7698|1981-09-08|1500.00|0.00|30| |7876| ADAMS | CLERK |7788|1987-05-23|1100.00|NULL|20| |7900| JAMES | CLERK |7698|1981-12-03|950.00|NULL|30| |7902| FORD | ANALYST |7566|1981-12-03|3000.00|NULL|20| |7934| MILLER | CLERK |7782|1982-01-23|1300.00|NULL|10| +-------+--------+-----------+------+------------+---------+---------+--------+
计算员工的年薪
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
mysql>select ename,sal*12from emp; +--------+----------+ | ename | sal*12| +--------+----------+ | SMITH |9600.00| | ALLEN |19200.00| | WARD |15000.00| | JONES |35700.00| | MARTIN |15000.00| | BLAKE |34200.00| | CLARK |29400.00| | SCOTT |36000.00| | KING |60000.00| | TURNER |18000.00| | ADAMS |13200.00| | JAMES |11400.00| | FORD |36000.00| | MILLER |15600.00| +--------+----------+
将查询出来的字段重命名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
mysql>select ename,sal*12as yearsal from emp; +--------+----------+ | ename | yearsal | +--------+----------+ | SMITH |9600.00| | ALLEN |19200.00| | WARD |15000.00| | JONES |35700.00| | MARTIN |15000.00| | BLAKE |34200.00| | CLARK |29400.00| | SCOTT |36000.00| | KING |60000.00| | TURNER |18000.00| | ADAMS |13200.00| | JAMES |11400.00| | FORD |36000.00| | MILLER |15600.00| +--------+----------+
其中as也可以省略,如果要替换成中文时,要用单引号括起来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
mysql>select ename,sal*12'年薪'from emp; +--------+----------+ | ename | 年薪 | +--------+----------+ | SMITH |9600.00| | ALLEN |19200.00| | WARD |15000.00| | JONES |35700.00| | MARTIN |15000.00| | BLAKE |34200.00| | CLARK |29400.00| | SCOTT |36000.00| | KING |60000.00| | TURNER |18000.00| | ADAMS |13200.00| | JAMES |11400.00| | FORD |36000.00| | MILLER |15600.00| +--------+----------+
条件查询
语法格式
1
select 字段1,字段2,... from 表名 where 条件;
等号操作符
1 2 3 4 5 6 7
找出SMITH的工资 mysql>select sal from emp where ename ='SMITH'; +--------+ | sal | +--------+ |800.00| +--------+
< >操作符
1 2 3 4 5 6 7 8 9 10 11
找出emp表中工资大于2500的员工 mysql>select ename,sal from emp where sal>2500; +-------+---------+ | ename | sal | +-------+---------+ | JONES |2975.00| | BLAKE |2850.00| | SCOTT |3000.00| | KING |5000.00| | FORD |3000.00| +-------+---------+
1 2 3 4 5 6 7 8
找出emp表中工资小于1000的员工 mysql>select ename,sal from emp where sal<1000; +-------+--------+ | ename | sal | +-------+--------+ | SMITH |800.00| | JAMES |950.00| +-------+--------+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
找出emp表中工资不等于3000的员工,<>与!=都是不等于的意思 mysql>select ename,sal from emp where sal<>3000; +--------+---------+ | ename | sal | +--------+---------+ | SMITH |800.00| | ALLEN |1600.00| | WARD |1250.00| | JONES |2975.00| | MARTIN |1250.00| | BLAKE |2850.00| | CLARK |2450.00| | KING |5000.00| | TURNER |1500.00| | ADAMS |1100.00| | JAMES |950.00| | MILLER |1300.00| +--------+---------+
between…and…操作符
1 2 3 4 5 6 7 8 9 10 11
找出工资在2000到3000之间的员工,between...and... 是闭区间 mysql>select ename,sal from emp where sal between2000and3000; +-------+---------+ | ename | sal | +-------+---------+ | JONES |2975.00| | BLAKE |2850.00| | CLARK |2450.00| | SCOTT |3000.00| | FORD |3000.00| +-------+---------+
is null
数据库中null不是一个值,代表为空,不能用=进行判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
找出没有津贴的员工或津贴为null mysql>select ename,comm from emp where comm isnull; +--------+------+ | ename | comm | +--------+------+ | SMITH |NULL| | JONES |NULL| | BLAKE |NULL| | CLARK |NULL| | SCOTT |NULL| | KING |NULL| | ADAMS |NULL| | JAMES |NULL| | FORD |NULL| | MILLER |NULL| +--------+------+
1 2 3 4 5 6 7 8 9 10
找出津贴不为null的员工 mysql>select ename,comm from emp where comm isnotnull; +--------+---------+ | ename | comm | +--------+---------+ | ALLEN |300.00| | WARD |500.00| | MARTIN |1400.00| | TURNER |0.00| +--------+---------+
and or
and 并且 or 或
1 2 3 4 5 6 7 8 9 10 11 12 13
找出工作岗位为salesman或manager的员工 mysql>select ename,job from emp where job='manager'or job='salesman'; +--------+----------+ | ename | job | +--------+----------+ | ALLEN | SALESMAN | | WARD | SALESMAN | | JONES | MANAGER | | MARTIN | SALESMAN | | BLAKE | MANAGER | | CLARK | MANAGER | | TURNER | SALESMAN | +--------+----------+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
找出部门编号是20或30中薪资大于1000的员工 mysql>select ename,sal,deptno from emp where sal>1000and (deptno=20or deptno=30); +--------+---------+--------+ | ename | sal | deptno | +--------+---------+--------+ | ALLEN |1600.00|30| | WARD |1250.00|30| | JONES |2975.00|20| | MARTIN |1250.00|30| | BLAKE |2850.00|30| | SCOTT |3000.00|20| | TURNER |1500.00|30| | ADAMS |1100.00|20| | FORD |3000.00|20| +--------+---------+--------+
in/not in
in不是一个区间,括号里指的是具体的某几个值
1 2 3 4 5 6 7 8 9 10 11 12 13
找出工作岗位为salesman或manager的员工 mysql>select ename,job,deptno from emp where job in ('SALESMAN', 'MANAGER'); +--------+----------+--------+ | ename | job | deptno | +--------+----------+--------+ | ALLEN | SALESMAN |30| | WARD | SALESMAN |30| | JONES | MANAGER |20| | MARTIN | SALESMAN |30| | BLAKE | MANAGER |30| | CLARK | MANAGER |10| | TURNER | SALESMAN |30| +--------+----------+--------+
like模糊查询
% 任意多个字符 _任意一个字符
1 2 3 4 5 6 7 8 9
找出名字中含有O的员工 mysql>select ename from emp where ename like'%O%'; +-------+ | ename | +-------+ | JONES | | SCOTT | | FORD | +-------+
1 2 3 4 5 6 7 8 9
找出名字中第二个字母是A的员工 mysql>select ename from emp where ename like'_A%'; +--------+ | ename | +--------+ | WARD | | MARTIN | | JAMES | +--------+
1 2 3
找出名字中带有下划线的员工 \转义字符 select ename from emp where ename='%\_%';
排序
代码格式
1 2 3
select 字段 from 表名 orderby 字段 升降序; 默认升序排列,asc表示升序,desc表示降序 越靠前的字段越能起主导作用,如多种排序时,只有当前一种排序的值相同时,相同值的数据再按照下一个排序规则进行排序
按照工资进行排序,默认升序 mysql>select ename,sal from emp orderby sal asc; +--------+---------+ | ename | sal | +--------+---------+ | SMITH |800.00| | JAMES |950.00| | ADAMS |1100.00| | WARD |1250.00| | MARTIN |1250.00| | MILLER |1300.00| | TURNER |1500.00| | ALLEN |1600.00| | CLARK |2450.00| | BLAKE |2850.00| | JONES |2975.00| | SCOTT |3000.00| | FORD |3000.00| | KING |5000.00| +--------+---------+
按照工资的降序排列,当工资相同时,再按照名字的升序排 mysql>select ename,sal from emp orderby sal desc,ename asc; +--------+---------+ | ename | sal | +--------+---------+ | KING |5000.00| | FORD |3000.00| | SCOTT |3000.00| | JONES |2975.00| | BLAKE |2850.00| | CLARK |2450.00| | ALLEN |1600.00| | TURNER |1500.00| | MILLER |1300.00| | MARTIN |1250.00| | WARD |1250.00| | ADAMS |1100.00| | JAMES |950.00| | SMITH |800.00| +--------+---------+
1 2 3 4 5 6 7 8 9 10
找出工作岗位是SALESMAN的员工,并且按照员工薪资的降序进行排列 mysql>select ename,job,sal from emp where job in ('salesman') orderby sal desc; +--------+----------+---------+ | ename | job | sal | +--------+----------+---------+ | ALLEN | SALESMAN |1600.00| | TURNER | SALESMAN |1500.00| | WARD | SALESMAN |1250.00| | MARTIN | SALESMAN |1250.00| +--------+----------+---------+
分组函数
分组函数一共5个,都是对某一组数据进行操作 分组函数自动忽略空 分组函数不能应用到where语句中 count 计数 sum 求和 avg 平均 max 最大值 min 最小值
获取工资大于平均工资的员工 mysql>select ename,sal from emp where sal>(selectavg(sal) from emp); +-------+---------+ | ename | sal | +-------+---------+ | JONES |2975.00| | BLAKE |2850.00| | CLARK |2450.00| | SCOTT |3000.00| | KING |5000.00| | FORD |3000.00| +-------+---------+
查询每个员工的部门名称,要求显示员工名和部门名 mysql>select e.ename,d.dname from emp e innerjoin dept d on e.deptno=d.deptno; +--------+------------+ | ename | dname | +--------+------------+ | SMITH | RESEARCH | | ALLEN | SALES | | WARD | SALES | | JONES | RESEARCH | | MARTIN | SALES | | BLAKE | SALES | | CLARK | ACCOUNTING | | SCOTT | RESEARCH | | KING | ACCOUNTING | | TURNER | SALES | | ADAMS | RESEARCH | | JAMES | SALES | | FORD | RESEARCH | | MILLER | ACCOUNTING | +--------+------------+
找出每个员工的工资等级,要求显示员工名、工资、工资等级 mysql>select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and hisal; +--------+---------+-------+ | ename | sal | grade | +--------+---------+-------+ | SMITH |800.00|1| | ALLEN |1600.00|3| | WARD |1250.00|2| | JONES |2975.00|4| | MARTIN |1250.00|2| | BLAKE |2850.00|4| | CLARK |2450.00|4| | SCOTT |3000.00|4| | KING |5000.00|5| | TURNER |1500.00|3| | ADAMS |1100.00|1| | JAMES |950.00|1| | FORD |3000.00|4| | MILLER |1300.00|2| +--------+---------+-------+
自连接
特点:一张表看做两张表,自己连接自己
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
找出每个员工的上级领导,显示员工名和对应的领导 mysql>select e.ename as'员工名',m.ename as'领导名'from emp e join emp m on e.mgr=m.empno; +--------+--------+ | 员工名 | 领导名 | +--------+--------+ | SMITH | FORD | | ALLEN | BLAKE | | WARD | BLAKE | | JONES | KING | | MARTIN | BLAKE | | BLAKE | KING | | CLARK | KING | | SCOTT | JONES | | TURNER | BLAKE | | ADAMS | SCOTT | | JAMES | BLAKE | | FORD | JONES | | MILLER | CLARK | +--------+--------+
左连接,比内连接多了king的一行 mysql>select e.ename as'员工名',m.ename as'领导名'from emp e leftjoin emp m on e.mgr=m.empno; +--------+--------+ | 员工名 | 领导名 | +--------+--------+ | SMITH | FORD | | ALLEN | BLAKE | | WARD | BLAKE | | JONES | KING | | MARTIN | BLAKE | | BLAKE | KING | | CLARK | KING | | SCOTT | JONES | | KING |NULL| | TURNER | BLAKE | | ADAMS | SCOTT | | JAMES | BLAKE | | FORD | JONES | | MILLER | CLARK | +--------+--------+
找出没有员工的部门 mysql>select d.*from emp e rightjoin dept d on e.deptno=d.deptno where e.empno isnull; +--------+------------+--------+ | DEPTNO | DNAME | LOC | +--------+------------+--------+ |40| OPERATIONS | BOSTON | +--------+------------+--------+
找出每一个员工的部门名称以及工资等级 mysql>select e.ename,d.dname,s.grade from emp e join dept d on e.deptno=d.deptno join salgrade s on e.sal between s.losal and s.hisal; +--------+------------+-------+ | ename | dname | grade | +--------+------------+-------+ | SMITH | RESEARCH |1| | ALLEN | SALES |3| | WARD | SALES |2| | JONES | RESEARCH |4| | MARTIN | SALES |2| | BLAKE | SALES |4| | CLARK | ACCOUNTING |4| | SCOTT | RESEARCH |4| | KING | ACCOUNTING |5| | TURNER | SALES |3| | ADAMS | RESEARCH |1| | JAMES | SALES |1| | FORD | RESEARCH |4| | MILLER | ACCOUNTING |2| +--------+------------+-------+
找出每一个员工的部门名称、工资等级、以及上级领导 mysql>select e.ename,d.dname,s.grade,m.ename from emp e join dept d on e.deptno=d.deptno join salgrade s on e.sal between s.losal and s.hisal leftjoin emp m on e.mgr=m.empno; +--------+------------+-------+-------+ | ename | dname | grade | ename | +--------+------------+-------+-------+ | SMITH | RESEARCH |1| FORD | | ALLEN | SALES |3| BLAKE | | WARD | SALES |2| BLAKE | | JONES | RESEARCH |4| KING | | MARTIN | SALES |2| BLAKE | | BLAKE | SALES |4| KING | | CLARK | ACCOUNTING |4| KING | | SCOTT | RESEARCH |4| JONES | | KING | ACCOUNTING |5|NULL| | TURNER | SALES |3| BLAKE | | ADAMS | RESEARCH |1| SCOTT | | JAMES | SALES |1| BLAKE | | FORD | RESEARCH |4| JONES | | MILLER | ACCOUNTING |2| CLARK | +--------+------------+-------+-------+
子查询
select语句中嵌套select语句,被嵌套的select语句就是子查询
where后面嵌套子查询
1 2 3 4 5 6 7 8 9 10 11
mysql>select ename,sal from emp where sal>(selectavg(sal) from emp); +-------+---------+ | ename | sal | +-------+---------+ | JONES |2975.00| | BLAKE |2850.00| | CLARK |2450.00| | SCOTT |3000.00| | KING |5000.00| | FORD |3000.00| +-------+---------+
from后面嵌套子查询
1 2 3 4 5 6 7 8 9 10 11
找出每个部门平均薪水的薪资等级 mysql>select avg.*,grade from (select deptno,avg(sal) as avgsal from emp groupby deptno) avg join salgrade s on avg.avgsal between s.losal and s.hisal; +--------+-------------+-------+ | deptno | avgsal | grade | +--------+-------------+-------+ |20|2175.000000|4| |30|1566.666667|3| |10|2916.666667|4| +--------+-------------+-------+
找出每个部门
select后面嵌套子查询
union
可以将查询结果集相加
1 2 3 4 5 6 7 8 9 10 11 12 13
找出工作岗位是salesman和manager的员工 mysql>select ename,job from emp where job='SALESMAN'unionselect ename,job from emp where job='MANAGER'; +--------+----------+ | ename | job | +--------+----------+ | ALLEN | SALESMAN | | WARD | SALESMAN | | MARTIN | SALESMAN | | TURNER | SALESMAN | | JONES | MANAGER | | BLAKE | MANAGER | | CLARK | MANAGER | +--------+----------+
取出工资前五名的员工 mysql>select ename,sal from emp orderby sal desc limit 0,5; +-------+---------+ | ename | sal | +-------+---------+ | KING |5000.00| | SCOTT |3000.00| | FORD |3000.00| | JONES |2975.00| | BLAKE |2850.00| +-------+---------+
找出工资排名第四到第九名的员工 mysql>select ename,sal from emp orderby sal desc limit 3,6; +--------+---------+ | ename | sal | +--------+---------+ | JONES |2975.00| | BLAKE |2850.00| | CLARK |2450.00| | ALLEN |1600.00| | TURNER |1500.00| | MILLER |1300.00| +--------+---------+