多表操作
外键约束:
一个实体的某个字段指向另一个实体的主键, 就称为外键被指向的实体
它的作用: 用于约束处于关系内的实体. 保证引用完整性, 也就是说数据的准确
tips:
1.外键一定要指向主键, 有主键才有外键
2.外键列的类型和长度一定要和参照的主键的类型和约定长度一致
添加外键:
有两张表分别为student表和score表:
student表为:
sex表为:
// 把student中的sex做为外键
ALTER TABLE student ADD CONSTRAINT fk_sex FOREIGN KEY(sex) REFERENCES sex(sid);
通过student表中的sex列找到sex表中对应的sex列的字段值, 应该会很好理解吧
多表的分类有3种, 分别为:
A)内连接:join,inner join
B)外连接:left join,left outer join,right join,right outer join,union
C)交叉连接:cross join
内连接: 关键字 [INNER, JOIN]
隐式内连接:
SELECT a.*, b.* FROM a, b WHERE 连接条件; // a为表a, b为表b
或者:
SELECT * FROM a, b WHERE 连接条件;
显示内连接:
SELECT a.*, b.* FROM a [INNER] JOIN b ON 连接条件;
SELECT * FROM a [INNER] JOIN b ON 连接条件 WHERE 其他条件;
SELECT * FROM student u JOIN sex s ON u.sex = s.sid;
结果如下:
外连接: 关键字 [LEFT JOIN, LEFT OUTER JOIN, RIGHT JOIN, RIGHT OUTER JOIN, UNION]
左外连接:
以JOIN左边的表为主表,展示主表的所有数据,根据条件查询连接右边表的数据,若满足条件则展示,若不满足则以null显示
SELECT a.*, b.* FROM a LEFT [OUTER] JOIN b ON 连接条件;
SELECT * FOMR a LEFT [OUTER] JOIN b ON 连接条件;
SELECT * FROM student u LEFT JOIN sex s ON u.sex = s.sid;
结果如下:
右外连接:
以JOIN右边的表为主表,展示它的所有数据,根据条件查询JOIN左边表的数据,若满足则展示,若不满足则以null显示
SELECT a.*, b.* FROM a RIGHT [OUTER] JOIN b ON 连接条件;
SELECT * FOMR a RIGHT [OUTER] JOIN b ON 连接条件;
子查询:
什么书子查询?
- 一个SELECT语句中包含另一个完整的SELECT语句。
- 子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
需求: 查询成绩比小明高的所有同学信息
-- 按以前的做法我们可以分为2个步骤去完成
-- 首先我们要知道小明的成绩
SELECT score from student WHERE name = '小明'; -- 比如查询到小明成绩为80
-- 得到小明的成绩80后, 可用80来查询比小明成绩高的同学信息
SELECT * FROM student WHERE score > 80;
-- 下面用子查询来完成这个需求
SELECT * FROM student WHERE SCORE > (SELECT score FROM student WHERE name = '小明');
分页查询: 关键字 [LIMIT]
我们在百度查询某个关键字的时候, 比如页面会给我显示15条相关信息, 在页面最下面会有一条分页按钮
当我按下2按钮时, 页面上会继续显示不同的15条相关信息. 这就是分页.
比如我们想要在页面上每页显示5条信息, 我们来模拟一下
SELECT * FROM info LIMIT 0,5; -- 第一页显示5个
SELECT * FROM info LIMIT 5,5; -- 第二页显示5个
SELECT * FROM info LIMIT 10,5; -- 第三页显示5个
...
LIMIT A, B;
A为从第几个开始显示, B为显示的个数;
通过上面的代码我们可以发现一个规律;
A = (当前页数 - 1) * B;