在学习SQL必知必会这本书的时候,遇到的一些知识点想记录一下,防止以后对概念说不清
外键
外键是表的一列,它的值必须在另外一个表的主键中,可以保证引用的完整性。假设有订单表Orders,通过user_id 与用户表进行关联,这时候在Orders表的user_id中定义一个外键,此时该列只能接受用户表的主键值。
作用:能防止意外删除,这样子不能直接删除顾客,必须把相关的订单先删除。
唯一约束
保证一列或者一组列的数据是唯一的,类似主键的,但是有下面的区别
- 表可以有多个唯一约束,但是只有一个主键
- 唯一约束可以有NULL
- 唯一约束可以修改更新
- 唯一约束不能定义外键
检查约束
保证一列或者一组列的数据满足某些条件
- 检查最小或者最大值,防止出现0个物品的订单
- 指定范围,在xx时间范围内
- 只允许特定值,可以思考成强行枚举
索引
排序数据以加快搜索和排序操作的速度,类似一本书的索引,能快速找到想要的内容
索引靠什么作用:在一个或多个列定义索引后,DBMS保存其内容的一个排过序的列表,DBMS搜索排过序的索引,找出匹配的位置,然后检索这些行
一些应该记住的内容:
- 索引改善检索的性能,但是减低了插入、修改、删除的性能,在执行这些操作的时候也要动态的更新索引
- 占用大量的空间
- 适合数据过滤和排序,如果经常使用某列排序,可以考虑索引
连接
假设我们有两个表,一个是orders表,另一个是customers表。
orders表:order_id, customer_id, order_date, total_price
customers:customer_id, name, address
内连接
返回两表中相符合条件的记录
返回orders表中有相应customers表记录的数据,如果这条记录在orders表中有,但是customers中没有,这条记录是不会返回的
SELECT orders.order_id, customers.name, orders.order_date, orders.total_price
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
左连接
返回左表中所有记录与右表相匹配的
返回所有orders中的记录,即使customers中也没有相匹配的记录。如果orders表的某个记录在customers表中没有,到时候查询结果得到的customers.name会是null
SELECT orders.order_id, customers.name, orders.order_date, orders.total_price
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id;