连接查询
也就是多表查询
按功能分:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉链接
---------------------------------------
内连接
等值连接
select 查询列表
from 表1 别名,表2 别名...
where 等值连接的条件( 用= )
----------------------------------------------------------------------------
SELECT `name` , `boyName`
FROM beauty 女,boys 男
WHERE 女.`boyfriend_id` = 男.`id`;
列名重复的用点操作符查询
特点:
1.为了解决不同表同名问题,往往为表起个别名,也是用as或者空格起名
2.表顺序无要求
----------(之前都是92语法,以后更换为99语法,新值join和on)----------------------------
非等值连接:
就是不使用等号,使用其他符号,不是什么表都能用,也不是重点
自连接:
在同一个表内查询,自己连接自己
SELECT e.`last_name`,e.`manager_id`,f.`employee_id`,f.`last_name`
FROM employees e
JOIN employees f
ON e.`manager_id` = f.`employee_id`;
外连接
内连接的话两个表是等价的,只有复合链接条件的数据会被添加到新表
外连接的话两个表不等价,有主副之分,根据链接条件,把副表的内容添加到主表内去,附表没有这个数据的话,主表内显示为null
因为有了主从之分,所以说两个表不能随意换位置
左连接:左边为主表
右连接:右边为主表
select 查询列表
from 表名1 别名
left|right|full join 表名2 别名 左连接表1是主表,右连接表2时主表,full全连接,每个表的内容都不会少,没的话就为null,都为主表。
on 链接条件
where 筛选条件
group by
having
order by
左连接:
SELECT `name`,`boyName`
FROM `beauty` a
LEFT JOIN `boys` b
ON a.`boyfriend_id` = b.`id`;
右连接:
SELECT `name`,`boyName`
FROM `boys` b
RIGHT JOIN `beauty` a
ON a.`boyfriend_id` = b.`id`
子查询
一个查询语句内嵌套了另一个完整的select语句,被嵌套的称为子查询,外面的称为父查询。
出现位置:
- select语句后面,要求子查询结果为单行单列
- from后面,结果可以为多行多列,当作一个新表
- where或having后面,要求子查询结果为单列,可以是多行
- exists后面,结果必须为单列
特点
- 子查询放在条件中,尽量要放在条件的右侧
- 子查询一般放在小括号内
- 子查询优先于父查询
- 单行子查询对应单行操作符:>, < ,>=, <= ,= ,<>
- 多行子查询:any,some,all,in
1.查询谁的工资大于Abel
SELECT last_name
FROM employees
WHERE salary > (
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);
--------------------------
SELECT `last_name`,`job_id`,`salary`
FROM employees
WHERE `job_id` = (
SELECT `job_id`
FROM employees
WHERE `employee_id` = 141) AND salary >
(
SELECT salary
FROM employees
WHERE `employee_id` = 143
);
2.多行子查询
any/some: x > any(10 ,30 ,50) x大于括号内任意一个值都可以,即大于最小值
all: x > all(10,30,50) 大于括号内全部,也就是大于最大值
in 这就是where那里的in,后面根多行子查询,看作一个列表
SELECT `employee_id`,`last_name`,`job_id`,`salary`
FROM `employees`
WHERE `salary` < ALL(
SELECT DISTINCT salary
FROM employees
WHERE `job_id` = 'IT_PROG'
);
3.放在select后面:知道存在就行,不用了解。
4.放在from后面:因为from后面跟的是表名,所以此处的含义表示的是这个表实际不存在,是经过筛选得到的,并且为了后面的引用,需要给表起别名。
一般来说还需要用上连接查询。
5.放在exists后面,exists是存在的意思。
查找是否存在Colmenares这个人
以前:
SELECT *
FROM `employees`
WHERE `last_name`="Colmenares";
现在:
SELECT EXISTS(
SELECT *
FROM `employees`
WHERE `last_name`="Colmenares"
)AS 有无;
有的话返回1,无的话是0
分页查询
一页显示不完,需要分页,很常见
7.select 查询表名
1.from 表名1 别名
2.join 表名2 别名
3.on 连接条件
4.where 分组前筛选
5.group by 分组
6.having 分组后筛选
8.order by排序
9.limit 起始条目索引,显示的条目数 ★★★★★运行次序是最后一个
limit:
起始条目索引默认从0开始,可以不写
显示的条目数设置要显示的条目个数
联合查询
查询结果来自多张表,但是这些表之间没有关联,用union
SELECT `name` 姓名 FROM `beauty`
UNION
SELECT `boyName` FROM `boys`;
- 两张表合成一张表,但是两张表的列数要相同,每列的数据类型最好相同
- 不止可以两个相连,理论上可以n个表相连
- union会自动去重,两个表内有相同的数据的话会只显示一个
- union all 不会自动去重