SELECT order_id,o.product_id,quantity,o.unit_price FROM order_items o (INNER) JOIN products p --实际INNER可写可不写,结果一致 ON o.product_id = p.product_id
跨表连接
用于连接不同数据库的多张表的数据,通过在表名前加上相应的数据库前缀来实现
1 2 3 4 5 6
USE sql_store;
SELECT* FROM order_items oi JOIN sql_inventory.products p ON oi.product_id = p.product_id;
自连接
通过给同一张表取两个别名来实现自连接
1 2 3 4 5 6 7
SELECT e.employee_id, e.first_name, m.first_name FROM employees e JOIN employees m ON e.reports_to = m.employee_id;
多表连接
通过多个JOIN语句来实现多表连接
1 2 3 4 5 6 7 8 9 10 11 12
SELECT p.payment_id, c.name AS name, p.invoice_id, p.date, p.amount, pm.name AS payment_method FROM payments p JOIN payment_methods pm ON p.payment_method = pm.payment_method_id JOIN clients c ON p.client_id = c.client_id;
复合连接
当表的记录是通过多列作为复合主键来作为唯一标识时,需要通过复合条件来实现连接
1 2 3 4 5
SELECT* FROM order_items oi JOIN order_item_notes oin ON oi.order_id = oin.order_id AND oi.product_id = oin.product_id;
隐式连接
除了使用JOIN语句,还可以使用WHERE子句来实现连接
1 2 3
SELECT* FROM orders o, customers c WHERE o.customer_id = c.customer_id; -- 注意:不写WHERE子句会出笛卡尔积的情况
SELECT p.product_id, p.name, oi.quantity FROM products p LEFT (OUTER) JOIN order_items oi --OUTER与INNER一样可写可不写 ON p.product_id = oi.product_id;
多表外连接
根据实际需要查询的情况,来使用相应的外连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
USE sql_store;
SELECT o.order_date, o.order_id, c.first_name, sh.name AS shipper, os.name AS status FROM orders o LEFTJOIN shippers sh -- 因为orders表里部分订单没有发货人信息,如果不使用外连接,我们无法得到所有订单的信息 ON sh.shipper_id = o.shipper_id JOIN order_statuses os ON os.order_status_id = o.status JOIN customers c ON c.customer_id = o.customer_id;
SELECT customer_id, first_name, points, "Bronze" AS types FROM customers WHERE points <2000 UNION SELECT customer_id, first_name, points, "Silver" AS types FROM customers WHERE points between2000and3000 UNION SELECT customer_id, first_name, points, "Gold" AS types FROM customers WHERE points >3000 ORDERBY first_name;