一.表连接
多个表一起查询
连接方式: 1.内链接 2.外连接
外连接又分为**左外连接,右外连接**
注: 常用的术语
冗余 合理的把一个数据存储多份, 以提高查询数据;
主键 主键是值一定要是唯一的, 同时一个表只能存在一个主键;
外键 另一表的ID(标识符), 用于连接连个表
1.内连接
INNER JOIN 或者 JOIN
在连接中 WHERE LIMIT ORDER BY GROUP BY 一样可以使用
SELECT 字段1, 字段2 …** FROM 表1 _INNER JOIN_ 表2 ON 表1.外键 = 表2.主键 ;
假设要查询对应学生student的学校college
常规做法 直接查询 全部表,拼接在一起在筛选数据
手动查询步骤:
1. 首先查询出学生信息
SELECT * FROM student;
2.查询出表2 学校信息
_ SELECT_ _* FROM_ college;
3. 结合学生表中的学校id去学校信息表内去查找对应id的学校手动组合为一个表格;
////**手动组合表格也是有条件的; 查询的外键与表**2的标识主键符要一致
_SE__LECT_ name,collegename** FROM student,college _WHERE student.college_id=college.college_id;
拼接条件

内连接
表1 . 字段 表2 . 字段 表1 [外键] 表2
__SELECT student.name, college.college_name FROM student INNER JOIN **college _ON_
多表连接条件
student.collegeid=college.college_id** ORDER BY name DESC;
结果如下:
mysql> SELECT student.name,college.college_name FROM student INNER JOIN college ON student.college_id=college.college_id ORDER BY name DESC ;
+————+———————+
| name | college_name |
+————+———————+
| 赵六 | 吓大 |
| 王五 | 浙大 |
| 李四 | 北大 |
| 张三 | 清华 |
+————+———————+
4 rows in set (0.00 sec)
注意 **建议明确查询字段, 两个不同的表中有可能会出同名字段;
2.外连接
(1) 左外连接语法
以左表为标准, 只查询左边表存在的数据;
LEFT OUTER JOI_N 或者 LEFT JOIN;
_SELECT_ 列名1… _FROM_ 表1 _LEFT OUTER JOIN_ 表2 _ON_ 表1.外键=表2.主键;**
//只查询左表内容,拼接右表内容
例: __SELECT student.name, college.college_name FROM student **LEFT OUTER JOIN college ON** student.college_id=college.college_id;
发现与内连接不同,左外连接将匹配内容都显示出来,没有配匹为空,内连匹配失败则不显示
手动查询步骤:
1. 首先查询出学生信息
SELECT * FROM student;
2.查询出表2 学校信息
_ SELECT_ _* FROM_ college;**
3. 左连接是以左表的数据为主, 不将右表的数据纳入到结果中;
而是依照左表的数据去右表中查询指定的数据然后将指定的结果纳入到左表的查询结果
首先在college表中获取name指定数据,通过外键条件筛选出主键,将结果纳入到左表,以此类推往下继续查询
+————+———————+
| name | collegename |
+————+———————+
| 赵六 | 吓大 |
| 王五 | 浙大 |
| 李四 | 北大 |
| 张三 | 清华 |
+————+———————+
4 rows in set (0.00 sec)
(2) 右外连接语法
其实和左连接是一回事, 只不过由右表的数据为主;**
RIGHT OUTER JOIN 或 RIGHT JOIN
SELECT 列名1… FROM 表1 RIGHT OUTER JOIN 表2 ON 表1.外键 = 表2.主键 ;
例:与左连接基本无异,将右表去匹配左表的值,结果如下
SELECT student.name, college.college_name FROM student RIGHT OUTER JOIN college ON student.college_id=college.college_id;
+————+———————+
| name | college_name |
+————+———————+
| 张三 | 清华 |
| 李四 | 北大 |
| 王五 | 浙大 |
| 赵六 | 吓大 |
+————+———————+
4 rows in set (0.00 sec)
可以发现此处右表由于最后的数据为空,则没有将左表数据纳入,将右边结果全部显示
由此我们得出结论:
**左连接与右链接, 无论如何一定对应表(左表或右表)的数据查出来; 不管条件(ON)是否成
内连接, 后面的条件必须匹配才能得到结果, 不匹配的数据不出被查出来; 直接丢弃;
二.子查询
在语句中再嵌套一个查询语句
降低语句复杂程度
**将子集查询作为父级查询的基础
子查询时必须取别名不然会报错
语句:
_SELECT_ 字段 FROM [表名 | 子查询 ]_ WHERE**_ [表名 | 子查询 ]
AS** 取别名
字段 字段名 AS XX
表名 FROM student AS xx
例:假设只知道学校名(条件) 去查询出学生信息的列表
使用内连接,于子查询方式**
命令:
__SELECT * FROM (
SELECT student.name, college.college_name FROM
student JOIN college ON
student.college_id= college.college_id ) AS** **n WHERE college_name = ‘吓大’;

注意此处子查询时必须取别名不然会报错
然后,我们将此命令中的表与字段名都AS取名,看看他的区别
_SELECT FROM_ (
SELECT s.name** AS **xm, c.collegename** AS **xxm** FROM
student ** **AS **s** JOIN college** **AS **c** ON
s** .college_id= c .college_id
) **A_S n WHERE xxm** = ‘吓大’;
这里发原字段名与表名在取出时改变了,取名可以简化表名字段名的书写(就是有点乱*
**起了别名,外层查询也要改变
另外,子查询也可作为条件在查询中,也可以多条表查询 如:
1.假设: 知道学校的名字, 如何查询出学生列表, 同时不显示学校, 只需要查询出列表;不使用连表;
把子查询当成条件来用
注意: 只能查询出一个值(一个字段);
SELECT name FROM student
WHERE college_id=(
SELECT college_id FROM college
WHERE college_name=’华联’
);
2.在子查询后面再加连接一个表
SELECT * FROM (
SELECT 表.字段,表,字段 FROM
表 JOIN 表 ON
表.字段=表.字段 …)
JOIN 表
AS n WHERE 。。。。

