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