有些时候数据在不同的表中,这个时候我们就需要用到多表联查
SQL join 用于把来自两个或多个表的行结合起来。
table_order表
CREATE TABLE `table_order` (
`orderId` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号',
`userId` int(11) DEFAULT NULL COMMENT '用户编号',
`orderName` varchar(32) DEFAULT NULL COMMENT '订单名称',
PRIMARY KEY (`orderId`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
table_user表
CREATE TABLE `table_user` (
`userId` int(32) NOT NULL AUTO_INCREMENT,
`username` varchar(32) DEFAULT NULL COMMENT '用户名',
`password` varchar(32) DEFAULT NULL COMMENT '密码',
`summary` varchar(128) DEFAULT NULL COMMENT '简介',
`age` int(2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;
,“Order” 表中的 “UserId” 列指向 “User” 表中的客户。上面这两个表是通过 “UserId” 列联系起来的。
先来个例子,方便理解
SELECT table_user.userId,table_order.orderId,table_user.username,table_order.orderName
FROM table_order
INNER JOIN table_user
ON table_order.userId=table_user.userId
上面已经有了INNER JOIN例子
取别名的形式简写SQL
SELECT u.userId,o.orderId,u.username,o.orderName
FROM table_order o
INNER JOIN table_user u
ON o.userId=u.userId
三个表INNER JOIN写法
SELECT .... FROM table_order
((INNER JOIN ...ON ...=...)
INNER JOIN ...ON ...=...)
左链接LEFT JOIN关键字返回左表(表1)中的所有行,即使在右表(表2)中没有匹配。如果在正确的表中没有匹配,结果是NULL。
SQL语句
SELECT u.userId,o.orderId,u.username,o.orderName
FROM table_order o
LEFT JOIN table_user u
ON o.userId=u.userId
右链接 RIGHT JOIN 关键字返回右表(table2)的所有行,即使在左表(table1)上没有匹配。如果左表没有匹配,则结果为NULL。
SQL语句
SELECT u.userId,o.orderId,u.username,o.orderName
FROM table_order o
RIGHT JOIN table_user u
ON o.userId=u.userId
SQL语句
MySQL不支持全连接 FULL OUTER JOIN
解决方法:left join + right join
不详述
自联接是一种常规联接,但表本身是连接的。
SQL语句
SELECT u.userId,o.orderId,u.username,o.orderName
FROM table_order o ,table_user u
WHERE o.userId=u.userId
运行结果:
可以看出,自连接可以实现内部连接的效果 而且更加灵活
UNION运算符用于组合两个或更多SELECT语句的结果集。
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
注释:默认情况下,UNION 运算符选择一个不同的值。如果允许重复值,请使用 UNION ALL。
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
其中userid为:2113245,,32323232
id为:2113245
SELECT a.ID,a.USER_NAME,b.userId FROM s_user a LEFT JOIN c_enterprise_info b
on b.userId LIKE concat('%',a.ID,'%')