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);
相关推荐
小Tomkk11 分钟前
数据库 变更和版本控制管理工具 --Bytebase 安装部署(linux 安装篇)
linux·运维·数据库·ci/cd·bytebase
qq_124987075336 分钟前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
倒流时光三十年1 小时前
SpringBoot 数据库同步 Elasticsearch 性能优化
数据库·spring boot·elasticsearch
码农小卡拉2 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
怣502 小时前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
wjhx2 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
冰暮流星2 小时前
javascript之二重循环练习
开发语言·javascript·数据库
万岳科技系统开发3 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
冉冰学姐3 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly3 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强