SQL之前不懂,后来又学会的东西

集合问题

构建数据集

sql 复制代码
CREATE TABLE t_users(user_id INT, uname CHAR(20), upwd INT, age INT);
sql 复制代码
CREATE TABLE t_roles(r_id INT, r_name VARCHAR(20),remarks VARCHAR(50));

PRIMARY和UNIQUE的区别:

唯一约束UNIQUE:不能重复; 主键PRIMARY(自带唯一索引):不能重复; 主键不能为null, 一张表只能有一个主键;

user_id是PRIMARY主键,不能为null,uname是UNIQUE可以为NULL但是不能重复

INNER JOIN的另一种写法

从两个表中调用数据,取条件为两列相等

等值查询,取交集

sql 复制代码
select * from t_users u , t_roles r where u.`rid` = r.`r_id`;               # 等值查询,取交集; 
select * from t_users u inner join t_roles r on u.`rid` = r.`r_id`;   #   内连接查询,取交集;

从两个TABLE中同时取数据的结果就是,会拿着左表中每一行去和右表中每一行进行组合,穷举组合。

sql 复制代码
#39. 笛卡尔积,没有关联条件;全是重复的数据,应该避免; 6 * 9 = 54
select * from t_users u , t_roles r  ;  

求两个集合的并集

用两个集合的LEFT JOIN 和 RIGHT JOIN 的结果做UNION

sql 复制代码
SELECT * FROM t_users u LEFT JOIN t_roles r ON u.`rid`=r.`r_id`
UNION
SELECT * FROM t_users u RIGHT JOIN t_roles r ON u.`rid`=r.`r_id`

得到9条数据

不要用UNION ALL,这样并集不去重,中间交叉的部分会被算2次,就是6+9=15条数据

sql 复制代码
SELECT * FROM t_users u LEFT JOIN t_roles r ON u.`rid`=r.`r_id`
UNION ALL
SELECT * FROM t_users u RIGHT JOIN t_roles r ON u.`rid`=r.`r_id`

其实更高版本的MySQL支持下面这种方式做并集

sql 复制代码
SELECT * FROM t_user u FULL JOIN t_roles r ON u.`rid`=r.`r_id`;

左半月

先求并集,然后 左边不是null ,右边是null

sql 复制代码
select * from 
(SELECT * FROM t_users u  LEFT JOIN t_roles r ON u.`rid` = r.`r_id`
UNION  
SELECT * FROM t_users u RIGHT JOIN t_roles r ON u.`rid` = r.`r_id`)  t
where  t.`r_name` is null and t.`uname` is  not null;

右半月

先求并集,然后左边是null,右边不是null

sql 复制代码
SELECT * FROM 
(SELECT * FROM t_users u  LEFT JOIN t_roles r ON u.`rid` = r.`r_id`
UNION  
SELECT * FROM t_users u RIGHT JOIN t_roles r ON u.`rid` = r.`r_id`)  t
WHERE  t.`r_name` IS not  NULL AND t.`uname` IS   NULL;

左半月+右半月

sql 复制代码
SELECT * FROM 
(SELECT * FROM t_users u  LEFT JOIN t_roles r ON u.`rid` = r.`r_id`
UNION  
SELECT * FROM t_users u RIGHT JOIN t_roles r ON u.`rid` = r.`r_id`)  t
WHERE  t.`r_name` IS   NULL or  t.`uname` IS   NULL;


-- 更严谨的写法,但是除了这两个集合以外也没别的数据,所以没必要多写。
SELECT * FROM 
(SELECT * FROM t_users u  LEFT JOIN t_roles r ON u.`rid` = r.`r_id`
UNION  
SELECT * FROM t_users u RIGHT JOIN t_roles r ON u.`rid` = r.`r_id`)  t
WHERE  (t.`r_name` IS   NULL AND t.`uname` IS NOT  NULL) 
    or  (t.`uname` IS   NULL AND t.`r_name` IS NOT NULL);
相关推荐
倔强的石头_14 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest5 天前
数据库SQL学习
数据库·sql