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);
相关推荐
I Am a robert girl1 小时前
从 GameHorizon 拆解多时间尺度游戏评测:数据管线、离线基准与在线回放的三层设计
数据库·游戏·多时间尺度·数据管线·游戏评测·离线基准·在线回放
躺柒1 小时前
读数据安全架构设计与实践17安全架构案例(下)
数据库·安全·零信任·安全架构·防火墙·无边界
SelectDB2 小时前
实时更新排错现场:导入了却查到旧数据,和 FINAL 越加越慢的两条路
大数据·数据库·数据分析
SelectDB2 小时前
拿 Planet 的账单一行行对下来,我总结出三个可自查的校验点
大数据·数据库·数据分析
SelectDB2 小时前
Apache Doris + Vane:让多模态数据进入业务分析
大数据·数据库·数据分析
pjj198544 小时前
ClickHouse 与 Doris 数据库技术梳理:看懂分析型数据库
数据库·clickhouse
1024奇点4 小时前
【仓颉语言入门 · 第二篇 第 12 课】
开发语言·数据库·ide·mysql·开源
冰暮流星4 小时前
mysql之insert优化
数据库·mysql
海鸥-w5 小时前
数据库冗余字段设计笔记
java·数据库·笔记·oracle