目录
- 一.分页查询
- 二.多表查询
- 三.自连接
- 四.子查询
- 4.1单行子查询
- 4.2多行子查询
- 4.3临时表子查询
- 4.4多行子查询
- 4.5多列子查询
一.分页查询
select...limit start,rows
表示从start+1行开始取,取出rows行,start从0开始算
公式:limit 每页显示记录数*(第几页-1),每页显示记录数
SELECT
*
FROM
emp
WHERE
deptno = 20
LIMIT 0,4
二.多表查询
多表查询的条件不能少于表的个数-1, 否则会出现笛卡尔集
查询一:显示雇员名,雇员工资及所在部门的名字
雇员名,雇员工资 来自 emp 表
部门的名字 来自 dept 表
SELECT
ename,
sal,
dname,
emp.deptno
FROM
emp,
dept
WHERE
emp.deptno = dept.deptno
查询二:显示部门号为 10 的部门名、员工名和工资
SELECT
ename,
sal,
dname,
emp.deptno
FROM
emp,
dept
WHERE
emp.deptno = dept.deptno
AND emp.deptno = 10
查询三:显示各个员工的姓名,工资,及其工资的级别
姓名,工资 来自 emp
工资级别 salgrade
SELECT
ename,
sal,
grade
FROM
emp,
salgrade
WHERE
sal BETWEEN losal
AND hisal;
三.自连接
在同一张表的连接查询(元素之间通过表中的某一列关联,把一张表都当做两张表来使用
),在进行查询时一般要起别名!
查询一:显示公司员工名字和他的上级的名字
员工名字 在 emp, 上级的名字的名字 emp
员工和上级是通过 emp 表的 mgr 列关联
SELECT
worker.ename AS '职员名',
boss.ename AS '上级名'
FROM
emp worker,
emp boss
WHERE
worker.mgr = boss.empno;
四.子查询
子查询是指嵌入在其它sql语句中的select语句,也叫嵌套查询
4.1单行子查询
单行子查询是指只返回一行数据的子查询语句
查询一:如何显示与SMITH同一部门的所有员工?
先查出Smith的部门号,再根据查到的部门号来查询其他信息
SELECT DISTINCT
ename,
job,
sal,
deptno
FROM
emp
WHERE
deptno IN (
SELECT
deptno
FROM
emp
WHERE
ename = 'SMITH')
4.2多行子查询
多行子查询指返回多行数据的子查询使用关键字in
查询二:查询和10号部门工作相同的员工,但不包括10号部门
查询10号部门有哪些工作,再把查询结果当作子查询使用
SELECT
ename,
deptno
FROM
emp
WHERE
job IN
( SELECT
job
FROM
emp
WHERE
deptno = 10 )
AND deptno != 10
4.3临时表子查询
将子查询当作一张临时表来使用
查询一:查询表中各个类别里,价格最高的商品
先得到各个类别中,价格最高的商品当作临时表,在针对临时表查询其他字段
SELECT
goods_id,
ecs_goods.cat_id,
goods_name,
shop_price
FROM
( SELECT cat_id, MAX( shop_price )
AS max_price
FROM ecs_goods
GROUP BY cat_id )
temp,ecs_goods
WHERE
temp.cat_id = ecs_goods.cat_id
AND temp.max_price = ecs_goods.shop_price
注意针对临时表和原始表共存的字段要做声明,比如使用ecs_goods.cat_id来作为字段名
4.4多行子查询
查询一:查询工资比30号部门的所有员工工资高的员工的姓名、工资和部门号
使用all操作符实现
还可以使用MAX()
SELECT
ename,
sal,
deptno
FROM
emp
WHERE
sal > ALL (
SELECT
sal
FROM
emp
WHERE
deptno = 30)
查询二:查询工资比30号部门其中一个员工工资高的员工的姓名、工资、部门编号
使用ANY操作符实现
也可以使用MIN()
SELECT
ename,
sal,
deptno
FROM
emp
WHERE
sal > ANY (
SELECT
sal
FROM
emp
WHERE
deptno = 30 )
4.5多列子查询
(字段1,字段2…)=(select 字段1,字段2 from…)
查询一:查询和Allen部门和岗位相同的元素
SELECT * FROM emp
WHERE
( deptno, job )=(
SELECT deptno, job
FROM emp
WHERE ename = 'ALLEN'
)
AND ename != 'ALLEN'