MySQL数据库(四)多表查询
两张假设有两张表格A和B,把表格当作一个集合,那么表格中的记录就是集合中的一个元素。
两张表格如下:
TableA:TableB:
2.1 内连接(只有一种场景)
inner join 或者join(等同于inner join)
- select a.*, b.* from tablea a
- inner join tableb b
- on a.id = b.id
或
- select a.*, b.* from tablea a
- join tableb b
- on a.id = b.id
结果如下:
应用场景:
这种场景下得到的是满足某一条件的A,B内部的数据;正因为得到的是内部共有数据,所以连接方式称为内连接。
2.2 外连接(六种场景)
2.2.1 left join 或者left outer join(等同于left join)
- select a.*, b.* from tablea a
- left join tableb b
- on a.id = b.id
或者
- select a.*, b.* from tablea a
- left outer join tableb b
- on a.id = b.id
结果如下,TableB中更不存在的记录填充Null:
应用场景:
这种场景下得到的是A的所有数据,和满足某一条件的B的数据;
2.2.2 [left join 或者left outer join(等同于left join)] + [where B.column is null]
- select a.id aid,a.age,b.id bid,b.name from tablea a
- left join tableb b
- on a.id = b.id
- Where b.id is null
结果如下:
应用场景:
这种场景下得到的是A中的所有数据减去"与B满足同一条件 的数据",然后得到的A剩余数据;
2.2.3 right join 或者fight outer join(等同于right join)
- select a.id aid,a.age,b.id bid,b.name from tablea a
- right join tableb b
- on a.id = b.id
结果如下,TableB中更不存在的记录填充Null:
应用场景:
这种场景下得到的是B的所有数据,和满足某一条件的A的数据;
2.2.4 [left join 或者left outer join(等同于left join)] + [where A.column is null]
- select a.id aid,a.age,b.id bid,b.name from tablea a
- right join tableb b
- on a.id = b.id
- where a.id is null
结果如下:
应用场景:
这种场景下得到的是B中的所有数据减去 "与A满足同一条件 的数据“,然后得到的B剩余数据;
2.2.5 full join (mysql不支持,但是可以用 left join union right join代替)
- select a.id aid,a.age,b.id bid,b.name from tablea a
- left join tableb b
- on a.id = b.id
- union
- select a.id aid,a.age,b.id bid,b.name from tablea a
- right join tableb b
- on a.id = b.id
union过后,重复的记录会合并(id为2,3,4的三条记录),所以结果如下:
应用场景:
这种场景下得到的是满足某一条件的公共记录,和独有的记录
2.2.6 full join + is null(mysql不支持,但是可以用 (left join + is null) union (right join+isnull代替)
- select a.id aid,a.age,b.id bid,b.name from tablea a
- left join tableb b
- on a.id = b.id
- where b.id is null
- union
- select a.id aid,a.age,b.id bid,b.name from tablea a
- right join tableb b
- on a.id = b.id
- where a.id is null
结果如下:
应用场景:
这种场景下得到的是A,B中不满足某一条件的记录之和
注:上面共有其中七(2^3-1)种应用场景,还有一种是全空白,那就是什么都不查,七种情形包含了实际应用所有可能的场景
2.3 交叉连接 (cross join)
2.3.1 实际应用中还有这样一种情形,想得到A,B记录的排列组合,即笛卡儿积,这个就不好用集合和元素来表示了。需要用到cross join:
- select a.id aid,a.age,b.id bid,b.name from tablea a
- cross join tableb b
2.3.2 还可以为cross join指定条件 (where):
- select a.id aid,a.age,b.id bid,b.name from tablea a
- cross join tableb b
- where a.id = b.id
结果如下;
注:这种情况下实际上实现了内连接的效果
三 注意事项
上面仍然存在遗漏,那就是mysql对sql语句的容错问题,即在sql语句不完全符合书写建议的情况,mysql会允许这种情况,尽可能地解释它:
3.1 一般cross join后面加上where条件,但是用cross join+on也是被解释为cross join+where;
3.2 一般内连接都需要加上on限定条件,如上面场景2.1;如果不加会被解释为交叉连接;
3.3 如果连接表格使用的是逗号,会被解释为交叉连接;
注:sql标准中还有union join和natural inner join,mysql不支持,而且本身也没有多大意义,其结果可以用上面的几种连接方式得到
外键约束:
创建新闻分类表:news_cate
CREATE TABLE news_cate(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
cate_name VARCHAR(50) NOT NULL UNIQUE,
cate_desc VARCHAR(100) NOT NULL DEFAULT ' '
);
创建新闻表:news
CREATE TABLE news(
id INT UNSIGNED AUTO_INCREMENT KEY,
title VARCHAR(100) NOT NULL UNIQUE,
content VARCHAR(100) NOT NULL,
cate_id TINYINT UNSIGNED NOT NULL
);
创建成功以后,我们插入一些记录.
INSERT INTO news_cate(cate_name) values('chineses news'),('glocal news'),('sports news'),('entertainment news');
INSERT INTO news(title,content,cate_id) VALUES('a1','aaa1',1),('a2','aaa2',2),('a3','aaa3',3),('a4','aaa4',4),('a5','aaa5',15);
查询news表中的id title content,news_cate表中的cate_name
(用到我们刚刚学到的多表联查)
SELECT n.id,n.title,n.content,c.cate_name from news AS n
JOIN news_cate AS c
ON n.cate_id = c.id;
这时候news_cate新闻分类中,去掉了国际新闻
DELETE FROM news_cate where id = 2;
成功删除了,但是我们再看看新闻表news,表中的cate_id还有2,显然这是不合适的
INSERT INTO news(title,content,cate_id) VALUES('a6','aaa6',45);
这条数据也插进去了,这两个记录的cate_id,都不在新闻分类里面,这就是所谓的脏数据,此时我们就要用外键,来保持数据的一致性和完整性.
创建外键的两种方法:
1 建表时指定外键盘:FOREIGN KEY(字段名) REFERENCES 主表(字段名)
注意:子表关联的必须是父表的主键
2动态添加外键
ALTER TABLE 表名 drop foreign key 外键名
ALTER TABLE 表名 ADD FOREIGN KEY(外键字段) REFERENCES 主表(主键字段);
**注意,动态添加外键时,不能有脏数据,否则不能成功添加外键
所以为了自动去掉脏数据,我们把新闻表news删掉,重新建有外键的news表
CREATE TABLE news(
id INT UNSIGNED AUTO_INCREMENT KEY,
title VARCHAR(100) NOT NULL UNIQUE,
content VARCHAR(100) NOT NULL,
cate_id TINYINT UNSIGNED NOT NULL,
FOREIGN KEY(cate_id) REFERENCES news_cate(id)
);
重新插入一下数据,现在非法记录就不可以插入了,这就是有外键和无外键的区别和约束
INSERT INTO news(title,content,cate_id) VALUES('a1','aaa1',1),('a2','aaa2',1),('a3','aaa3',3),('a4','aaa4',4),('a5','aaa5',3);
参考连接:https://blog.csdn.net/jintao_ma/article/details/51260458
MySQL数据库(四)多表查询的更多相关文章
- MySQL数据库语法-多表查询练习一
MySQL数据库语法-多表查询练习一 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍的多表查询的外键约束,以及如何使用外链接和内连接查询数据信息. 一.数据表和测试 ...
- MySQL数据库之单表查询中关键字的执行顺序
目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...
- MySQL数据库语法-单表查询练习
MySQL数据库语法-单表查询练习 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要是对聚合函数和分组的练习. 一.数据表和测试数据准备 /* @author :yinz ...
- mysql数据库之单表查询多表查询
单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex e ...
- mysql数据库之联表查询
表准备: 这次我们用到5张表: class表: student表: score表: course表: teacher表: 表结构模型: 我们针对以下需求分析联表查询: 1.查询所有的课程的名称以及对应 ...
- mysql数据库之单表查询
单标查询 单表查询语句 关键字执行的优先级 简单查询 where约束 group by 聚合函数 HAVING过滤 order by 查询排序 LIMIT限制查询的记录数 使用正则表达式查询 单表查询 ...
- nodejs MYSQL数据库执行多表查询
1.设计数据库 2.设计数据库表 genres表: books表: 3.安装MySQL模块 4. 代码编写 (1) 第一种方法: 在query中使用nextTables属性,将属性值设置为ture d ...
- mysql数据库之多表查询
准备 ...
- 关于Mysql数据库进行多表查询时设计编程思想
SQL代码:
- MySQL/MariaDB数据库的多表查询操作
MySQL/MariaDB数据库的多表查询操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.单表查询小试牛刀 [root@node105.yinzhengjie.org.cn ...
随机推荐
- [原创] debian 9.3 搭建seafile企业私有网盘
[原创] debian 9.3 搭建seafile企业私有网盘 需求是这样的, 个人疲惫于 "成为大伙的文件中转站" ,公司不管大大小小的文件,都要打电话过来“转个xx文件”.“帮 ...
- Taro开发写密码支付弹层
在支付的时候弹出填写密码,模仿了支付宝支付填写密码.主要是利用遮罩的来实现.直接上代码吧. html设计,通过标记控制显示. { showPayPwdInput ? <View classNam ...
- 【练习】Python第四次:实现对文件的增删改查
一,实现对文件的增删改查 (一),三级菜单的处理结构及退出技巧:使用TAG标记 tag=True while tag: print('leve1') choice=input("level1 ...
- 【笔记】Python基础二:数据类型之集合,字符串格式化,函数
一,新类型:集合 集合出现之前 python_l = ['lcg','szw','zjw'] linux_l = ['lcg','szw','sb'] #循环方法求交集 python_and_linu ...
- vue2 -- axios
4. 通过axios实现数据请求 vue.js默认没有提供ajax功能的. 所以使用vue的时候,一般都会使用axios的插件来实现ajax与后端服务器的数据交互. 注意,axios本质上就是java ...
- 按enter 导致整个页面刷新的解决办法
1.如果用的又from表单的存在,则在form中添加事件 <form onsubmit="return false;">.......</form> 2.增 ...
- 利用Crosstool-ng制作交叉编译工具链
1.什么是crosstool-ng crosstool-ng,全称是crosstool Next Generation,即下一代crosstool,即crosstool的升级版.那么什么是crosst ...
- makefile入门-初步了解
自己开始学习makefile是由于VScode配置工程文件,看别人的配置不是很懂,于是决定入门学习下makefile. 先来说说makefile是做什么用的:makefile可以实现工程的自动化编译, ...
- Isight 命令行运行任务
说明书参考:https://abaqus-docs.mit.edu/2017/English/DSSIMULIA_Established.htm 不一定对版本.但是大部分还可以. 不对的可以在命令里敲 ...
- spring 406 (Not Acceptable)错误
@Controller @RequestMapping("/login") public class LoginController { @ResponseBody @Reques ...