MySQL-排序、limit、多表连接查询

排序规则

  • 使用 ORDER BY 子句排序,默认ASC
  • ASC(ascend):升序 
  • DESC(descend):降序
  • ORDER BY 子句在SELECT语句的结尾
  • 可以使用不在SELECT列表中的列排序
  • 在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序
# 单列排序
SELECT last_name, job_id, department_id, hire_date
FROM employees
ORDER BY hire_date DESC ;

# 多列排序
SELECT last_name, department_id, salary
FROM employees
ORDER BY department_id, salary DESC;

分页LIMIT

  • LIMIT [ 位置偏移量 ] , [ 显示的行数 ]
  • 第一个 “位置偏移量” 参数指MySQL从哪一行开始显示,是一个可选参数
    • 如果不指定“位置偏移量”,将会从表中的第一条记录开始
    • 第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推
  • 第二个参数 “行数” 指返回的记录条数
  • MySQL 8.0中可以使用 “LIMIT 3 OFFSET 4” ,意思是获取从第5条记录开始后面的3条记录,和 “LIMIT4,3;” 返回的结果相同
  • LIMIT 子句必须放在整个SELECT语句的最后
--前10条记录:
SELECT * FROM 表名 LIMIT 0,10;
-- 或者
SELECT * FROM 表名 LIMIT 10;

--第11至20条记录:
SELECT * FROM 表名 LIMIT 10,10;

--第21至30条记录:
SELECT * FROM 表名 LIMIT 20,10;
  • 其他数据库的“limit”使用
# 如果是 SQL Server 和 Access,需要使用 TOP 关键字
SELECT TOP 5 name, hp_max FROM heros ORDER BY hp_max DESC

# 如果是 DB2,使用 FETCH FIRST 5 ROWS ONLY 关键字
SELECT name, hp_max FROM heros ORDER BY hp_max DESC FETCH FIRST 5 ROWS ONLY

# 如果是 Oracle,你需要基于 ROWNUM 来统计行数
SELECT rownum,last_name,salary FROM employees WHERE rownum < 5 ORDER BY salary DESC;

多表连接

1. 数据库中的笛卡尔积,也称为交叉连接

  • 英文是 CROSS JOIN
  • 作用就是可以把任意表进行连接,即使这两张表不相关
  • 结果集最大为:a表行数 * b表行数

2. 表连接注意:

  • 适当添加where  ... and ... 条件
  • 多个表中有相同列时,必须在列名之前加上表名前缀
  • 使用表的别名,过滤条件中就只能使用别名进行代替,不能使用原有的表名,否则就会报错
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e , departments d
WHERE e.department_id = d.department_id;

3. 非等值连接

  • 两个表的连接条件不是等于
SELECT e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;

4. 自连接、非自连接

  • 自连接:当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义
SELECT CONCAT(worker.last_name ,' works for '
, manager.last_name)
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id ;

5. 内连接、外连接

  • 内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
  • 外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)
  • 如果是左外连接,则连接条件中左边的表也称为 主表右边的表称为 从表 
  • 如果是右外连接,则连接条件中右边的表也称为 主表左边的表称为 从表

6. 在 SQL92 中采用(+)代表从表所在的位置。即左或右外连接中,(+) 表示哪个是从表

#左外连接
SELECT last_name,department_name
FROM employees ,departments
WHERE employees.department_id = departments.department_id(+);

#右外连接
SELECT last_name,department_name
FROM employees ,departments
WHERE employees.department_id(+) = departments.department_id;

多表查询(SQL99)

1. 基本语法

  • JOIN ON
  • 可以使用 ON 子句指定额外的连接条件。 这个连接条件是与其它条件分开的
  • 关键字 JOIN、INNER JOIN、CROSS JOIN 的含义是一样的,都表示内连接
SELECT table1.column, table2.column,table3.column
FROM table1
JOIN table2 ON table1 和 table2 的连接条件
JOIN table3 ON table2 和 table3 的连接条件

2. 内连接 INNER JOIN

  • INNER 可省略
SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 等其他子句;

3. 外连接

  • 左外连接 LEFT OUTER JOIN 
  • 右外连接 RIGHT OUTER JOIN
  • OUTER 可省略
  • SQL92 中只能用 (+) 表示左外、右外连接
  • SQL99 及以后的标准中,使用LEFT JOIN 和 RIGHT JOIN
#实现查询结果是A
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 等其他子句;

#实现查询结果是B
SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 等其他子句;

4. 满外连接 FULL OUTER JOIN 

  • 满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据
  • SQL99是支持满外连接的。使用FULL JOIN 或 FULL OUTER JOIN来实现。
  • 需要注意的是,MySQL不支持FULL JOIN,但是可以用LEFT JOIN UNION RIGHT JOIN代替

5. 合集 UNION

  • UNION 操作符返回两个查询的结果集的并集,去除重复记录
  • UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重 
SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2

6. JOIN 示例

#左中图 实现A - A∩B
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;

#左中图 实现B - A∩B
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;

#左下图 实现查询结果是A∪B
#用左外的A,union 右外的B
select 字段列表
from A表 left join B表
on 关联条件
where 等其他子句
union
select 字段列表
from A表 right join B表
on 关联条件
where 等其他子句;

#右下图 实现A∪B - A∩B 或 (A - A∩B) ∪ (B - A∩B)
#使用左外的 (A - A∩B) union 右外的(B - A∩B)
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句
union
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句

7. 自然连接 NATURAL JOIN

  • SQL99语法增加
  • 自然连接可以理解为 SQL92 中的等值连接。它会帮你自动查询两张连接表中所有相同的字段,然后进行等值连接
# 在SQL92标准中
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`
AND e.`manager_id` = d.`manager_id`;

# 在SQL99中
SELECT employee_id,last_name,department_name
FROM employees e NATURAL JOIN departments d;

8. USING 连接

  • SQL99语法增加
  • 使用 USING 指定连接数据表里的同名字段进行等值连接。但是只能配合JOIN一起使用
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
USING (department_id);

# 等价于
SELECT employee_id,last_name,department_name
FROM employees e ,departments d
WHERE e.department_id = d.department_id;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值