【Mysql】记录一些特殊的select语句

一.分页查询

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来作为字段名
查询二:
查询每个部门的信息(部门名,编号,地址)和人数
在这里插入图片描述

SELECT
	COUNT(*) AS per_num,
	deptno 
FROM
	emp 
GROUP BY
	deptno 
	--临时表

SELECT
	dname,
	dept.deptno,
	loc,
	per_num 
FROM
	dept,(
	SELECT
		COUNT(*) AS per_num,
		deptno 
	FROM
		emp 
	GROUP BY
		deptno 
	) temp 
WHERE
	dept.deptno = temp.deptno

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'

猜你喜欢

转载自blog.csdn.net/weixin_57535055/article/details/128212086
今日推荐