多表查询
使用单个select语句从多个表格中取出相关的查询结果,多表连接通常是有相互关系的父子表。
所以,多表查询分为: 交叉连接、内连接、外连接、子查询
- 交叉连接
笛卡尔乘积,能产生多少行。新表格左右两边的字段由下面命令行中表格先后顺序决定。
SELECT * FROM customers,orders;
SELECT * FROM orders,customers;
上面命令不适用关键字,是隐式语法。
下面使用关键字,是显示语法。效果一样。
select * from customers CROSS JOIN orders;
select * from orders CROSS JOIN customers;
- 内连接
交叉连接的结果是错误的。本应该通过id找数据行,但乘积使得多个错误行产生。
内连接是在交叉连接里面选出正确的结果。
隐式语法
select * from customers,orders where customers.id=orders.customer_id;
显示语法
select * from customers c INNER JOIN orders o ON c.id=o.customer_id;
select * from orders,customers where customers.id=orders.customer_id;
- 外链接
如下图,王五没有订单,在内连接中不会显示。
如果在外连接中把customers作为基表,则新表就有王五。
外连接分为 左外连接 和 右外连接。
左外,以关键字左边为基表。
SELECT * FROM customers AS c LEFT JOIN orders as o ON c.id=o.customer_id;
右外,以关键字右边表格为基表。
SELECT * FROM orders o RIGHT JOIN customers c ON c.id=o.customer_id;
- 子查询
进行查询的时候,需要的条件是另外一个select语句的结果,这个时候就会用到子查询。
为了给主查询(外部查询) 提供数据而首先执行的查询(内部查询)被叫做子查询。
子查询分为嵌套子查询和相关子查询。
嵌套子查询:
内部查询的执行独立于外部查询,内部查询仅执行一次,执行完毕后将结果作为外部查询的条件使用。
嵌套子查询中的子查询语句可以拿出来单独运行。
所以可以先单独写出内外查询的语句,然后拼