在数据量庞大的数据库中,为了发挥数据库的作用,便开发了多种数据库操作语言来查询数据,其中多表连接查询就是常用的一个模块。
多表连接查询,顾名思义,就是将多张表的信息数据进行归纳查询,从而得到我们想要的的数据。
接下来我们便来学习常用的查询方式吧。
笛卡尔集就是在查询数据时简单的将表关联在一起,数据以m*n的形式组合,类似于矩阵相乘,造成了大量重复的无逻辑的数据,丧失了最初筛选数据的初衷。
造成笛卡尔集的原因:
* 产生条件:
1. 省略连接条件
2. 连接条件无效
3. 所有表中所有行互相连接
* 解决方案:
添加有效筛选条件
* SQL92语法:
- SELECT 查询列表
- FROM 表名1 别名1 ,表名2 别名2
- WHERE 连接条件
- AND 筛选条件
- GROUP BY 分组列表
- HAVING 分组后筛选条件
- ORDER BY 排序列表
* SQL99语法:
- select 字段列表
- from 表名1
- [inner] join 表名2 on 条件
- where 筛选条件
- group by 分组条件
- having 分组后的筛选条件
- order by 排序字段
* 注意:
1. 使用表名前缀在多个表中区分相同的列
2. 在不同表中具有相同列名的列可以用表的别名加以区分
3. 如果使用了表别名,则在select语句中需要使用表别名代替表名
4. 表别名最多支持32个字符长度,但建议越少越好
左外连接
- * 语法:
- select 字段列表
- from 表1
- left [outer] join 表2 on 条件
- ...
* 注意:
左外连接查询的是左表所有数据以及其交集部分,表1为查询主表
-------------------------------------------------------------------------
5. 右外连接
* 语法:
- select 字段列表
- from 表1
- right [outer] join 表2 on 条件
- ...
* 注意:
右外连接查询的是右表所有数据以及其交集部分,表2为查询主表
简单来说就是将复杂的查询要求拆分实现,括号内为拆分的查询结果或者内容。
特点:
1、子查询都放在小括号内
2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
3、子查询优先于主查询执行,主查询使用了子查询的执行结果
4、子查询根据查询结果的行数不同分为以下两类:
① 单行子查询
结果集只有一行
一般搭配单行操作符使用:> < = <> >= <=
非法使用子查询的情况:
a、子查询的结果为一组值
b、子查询的结果为空
② 多行子查询
结果集有多行
一般搭配多行操作符使用:any、all、in、not in
in: 属于子查询结果中的任意一个就行
any和all往往可以用其他查询代替
分页查询:顾名思义,就是将查询结果的显示做出页数上的调整。
* 语法:
- select 字段|表达式,...
- from 表
- where 条件
- group by 分组字段
- having 条件
- order by 排序的字段
- limit 起始的条目索引,条目数;
- * 示例:每页显示3条记录
- * SELECT * FROM student LIMIT 0,3; -- 第1页
-
- * SELECT * FROM student LIMIT 3,3; -- 第2页
-
- * SELECT * FROM student LIMIT 6,3; -- 第3页
* 特点:
1.起始条目索引从0开始
2.limit子句放在查询语句的最后
3.公式:select * from 表 limit (page-1)*sizePerPage,sizePerPage
假如:
每页显示条目数sizePerPage
要显示的页数 page
* 语法:
- select 字段|常量|表达式|函数 from 表 where 条件 union 【all】
- select 字段|常量|表达式|函数 from 表 where 条件 union 【all】
- select 字段|常量|表达式|函数 from 表 where 条件 union 【all】
- .....
- select 字段|常量|表达式|函数 from 表 where 条件
* 特点:
1、多条查询语句的查询的列数必须是一致的
2、多条查询语句的查询的列的类型几乎相同
3、union代表去重,union all代表不去重
一点小思考:如何不使用max函数查询数据,以最高工资为例:
方法一:利用排序和分页查询:
- SELECT employee_id,salary
- FROM employees
- ORDER BY salary DESC
- LIMIT 1;
方法二:子查询
- SELECT
- employee_id,salary
- FROM
- employees e
- WHERE
- e.salary NOT IN (
- SELECT DISTINCT
- a.salary
- FROM
- employees a
- JOIN employees b ON a.salary < b.salary
- )