数据插入到数据库中后,就可以用 select 命令进行各种各样的查询。

1.简单查询数据

a.语法

mysql> select * from 表名 [where 条件];
mysql> select 全部字段 from 表名 [where 条件];

b.实例

实例:
	-- 查询出 emp 表的全部数据
	
代码:
mysql> select * from emp;
mysql> select ename,hiredate,sal,deptno from emp;

1.png

2.查询不重复的数据

a.语法

mysql> select distinct 字段 from 表名;

b.实例

实例:
	-- 查询出 emp 表的 deptno 不重复数据
	
代码:
mysql> select distinct deptno from emp;

2.png

3.条件查询

a.语法

mysql> select * from 表名 where 条件;

b.实例

实例:
	-- 查询出 emp 表的 所有 deptno 为 1 的数据
	-- 查询出 emp 表的 所有 deptno 为 1 且 hiredate 大于 2001-01-01 的数据
代码:
mysql> select * from emp where deptno=1;
mysql> select * from emp where deptno=1 and hiredate > '2001-01-01';

3.png

4.排序和限制

a.语法

mysql> select * from 表名 [where 条件] [order by 字段1 [desc|asc],字段2 [desc|asc],...,字段n [desc|asc]]

b.实例1

实例:
	--把 emp 表中的数据按工资高低进行显示。
代码:
mysql> select * from emp order by sal;

4.png

c.实例2

实例:
	--把 emp 表中的数据按部门编号 deptno 字段排序
代码:
mysql> select * from emp order by deptno;

5.png

d.实例3

实例:
	--对于 deptno 相同的前两条数据,如果要按照工资由高到低排序,可以使用以下命令
代码:
mysql> select * from emp order by deptno,sal desc;

6.png

e.语法

mysql> select * from 表名 [where 条件] [order by 字段1 [desc|asc],字段2 [desc|asc],...,字段n [desc|asc]][limit 偏移量,显示行数]

f.实例1

实例:
	--显示 emp 表中按照 sal 排序后的前 3 条数据
	--显示 emp 表中按照 sal 排序后从第二条开始的 3 条数据
代码:
mysql> select * from emp order by sal limit 3;
mysql> select * from emp order by sal limit 1,3;

7.png

5.聚合

a.语法

mysql> select [字段1,字段2,...字段n] 聚合函数 from 表名 [where 条件] [group by 字段1,字段2,...字段n[with rollup]] [having 条件]

b.实例1

实例:
	-- 要在 emp 表中统计公司的总人数。
	-- 在此基础上,要统计各个部门的人数。
	-- 既要统计各部门人数,又要统计总人数。
代码:
mysql> select count(1) from emp;
mysql> select deptno, count(1) from emp group by deptno;
mysql> select deptno, count(1) from emp group by deptno with rollup;

8.png

c.实例2

实例:
	-- 统计人数大于 1 人的部门
	-- 统计公司所有员工的薪水总额、最高和最低薪水。
代码:
mysql> select deptno, count(1) from emp group by deptno having count(1)>1;
mysql> select sum(sal),max(sal),min(sal) from emp;

9.png

6.表连接

a.实例1

实例:
	-- 查询出所有雇员的名字和所有的部门名称,因为雇员名称和部门分别存放在表 emp 和 dept 中,因此,需要表连接来进行查询
代码:
mysql> select ename, deptname from emp,dept where emp.deptno=dept.deptno;

10.png

b.实例2

实例:
	-- 查询 emp 中所有用户名和所有在部门名称
代码:
mysql> select ename, deptname from emp left join dept on emp.deptno=dept.deptno;
mysql> select ename, deptname from dept right join emp on dept.deptno=emp.deptno;

11.png

7.子查询

某些情况下,当进行查询的时候,需要的条件是另外一个 select 语句的结果,这时候,就要用到子查询。

a.实例1

实例:
	-- 从 emp 表中查询出所有部门在 dept 表中的所有记录。
代码:
mysql> select * from emp where deptno in(select deptno from dept);

12.png

b.实例2

实例:
	-- 如果子查询记录数唯一,还可以用=代替in
代码:
mysql> select * from emp where deptno = (select deptno from dept limit 1);

实例:
	-- 某种情况下,子查询可以转化为表连接
代码:
mysql> select emp.* from emp ,dept where emp.deptno=dept.deptno;

13.png

8.记录联合

将两个表的数据安装一定的查询条件查询出来后,将结果合并到一起显示出来,这个时候,就需要用 union 和 union all 关键字来实现这样的功能。

a.语法

mysql> select * from 表名1 union|union all select 全部字段 from 表名2 ...union|union all select 全部字段 from 表名n;

a.实例1

实例:
	-- 将 emp 和 dept 表中的部门编号的集合显示出来。
代码:
mysql> select deptno from emp union all select deptno from dept;

实例:
	-- 将以上结果去掉重复记录后显示。
代码:
mysql> select deptno from emp union select deptno from dept;

14.png 15.png

参考书籍

-- 书名: 深入浅出MySQL --数据库开发、优化与管理维护(第3版) -- 作者:翟振兴 崔春华 黄荣 董骐铭