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);
相关推荐
liangshanbo12151 分钟前
主系统登录后,子系统怎么实现自动登录?
java·网络·数据库
许彰午5 分钟前
05-静默安装常见报错与解决
数据库
害人终害己28 分钟前
redis修改密码的地方在哪里
数据库·redis·缓存
rannn_11128 分钟前
【Java面试题】高频面试题1|Java 后端、MySQL、Redis 与 RAG 面试整理
java·jvm·数据库·后端·面试
杨云龙UP44 分钟前
Oracle 19c RAC到RAC Active Data Guard标准搭建与巡检指南
运维·服务器·数据库·oracle·adg·data guard·rac到rac
许彰午1 小时前
06-Oracle卸载与重装完整流程
数据库·oracle
ss2731 小时前
AI全栈实战 | 3.6-01 数据库与 ORM:学过 MyBatis 再看 SQLAlchemy,才知道“半自动“和“全自动“差在哪
数据库·mybatis
我的xiaodoujiao1 小时前
Django 基础知识详细图文教程 13-Django 模型定义与使用 3
数据库·后端·python·测试工具·oracle·django
麦壳饼1 小时前
Docker 快速上手:5 分钟运行 SonnetDB
数据库·docker·sonnetdb
for_ever_love__1 小时前
缓存穿透、击穿、雪崩:三个经典问题与完整解决方案
java·数据库·redis·缓存·哈希算法·布隆过滤器·雪崩