学习MySQL之多表操作(三)
##多表查询 ##使用数据库 mytest
USE mytest; ##删除,并重新创建表 t_dept
DROP TABLE t_dept;
CREATE TABLE t_dept (
deptno INT(11) NOT NULL,
dname VARCHAR(20) NOT NULL,
loc VARCHAR(40),
UNIQUE INDEX uk_deptno(deptno)
)
##创建测试表 t_a
CREATE TABLE t_A (
aId INT (11) AUTO_INCREMENT, ##主键,自增
aName VARCHAR (20) NOT NULL,
loc VARCHAR (40),
cId INT(11),
PRIMARY KEY pk_aId (aId)
) ;
##创建测试表 t_b
CREATE TABLE t_B (
bId INT (11) AUTO_INCREMENT, ##主键,自增
bStand VARCHAR (40) NOT NULL,
aId INT (11) NOT NULL,
PRIMARY KEY pk_bId (bId),
UNIQUE INDEX uk_aId (aId) ##唯一索引
) ;
##创建测试表 t_c
CREATE TABLE t_c (
cId INT (11) AUTO_INCREMENT, ##主键,自增
cvalue VARCHAR (20) NOT NULL,
PRIMARY KEY pk_cId (cId)
);
##创建测试表 t_d
CREATE TABLE t_d(
xname VARCHAR(11),
xsex VARCHAR(11)
);
##创建测试表 t_e
CREATE TABLE t_e(
xname VARCHAR(11),
xsex VARCHAR(11)
); ##删除唯一索引
ALTER TABLE t_b
DROP KEY uk_aId; ##插入测试数据
INSERT INTO t_dept(deptno,dname,loc)
VALUES
(10,'生产','生产部'),
(20,'业务','业务部'),
(30,'品质','品质部'),
(40,'人事','人事部'),
(50,'工程','工程部'); INSERT INTO t_a (aName, loc,cId)
VALUES
('Jay', 'Jay Chou',1),
('Join', 'Join Chang',3),
('Hebe', 'Hebe Young',2),
('Jack', 'Jack Son',2),
('Smile', 'Smile Kiss',1) ; INSERT INTO t_b (bStand, aId)
VALUES
('Jay-Jay Chou', 1),
('Hebe-Hebe Young', 3),
('Jack-Jack Son', 4),
('Smile-Smile Kiss', 5) ; INSERT INTO t_c (cvalue)
VALUES ('鸡'),('牛'),('马'); INSERT INTO t_d (xname,xsex)
VALUES ('章子怡','女'),('张筱雨','女'),('张雨涵','男'),('张予曦','女'),('张曦予','女'); INSERT INTO t_e (xname,xsex)
VALUES ('张曦予','女'),('汪峰','男'),('张馨予','女'); -- ----------- 内联、外联不推荐使用,根据笛卡尔积,执行效率低于子查询 ----------- --
##内联 □■□
##INNER JOIN …… ON。显示主副表数据交集
SELECT a.aid,a.aName,a.loc,b.bStand,c.cvalue
FROM t_a AS a
INNER JOIN t_b AS b
ON a.aId = b.aId
INNER JOIN t_c AS c
ON a.cId=c.cId; ##外联 ■■□ OR □■■
##外联显示的数据以主表为准,不管副表是否有对应数据都会显示,副表无数据的,显示null。■■□
##内联,副表无对应数据,则不会显示出。简而言之,显示数据为主副表的 交集。□■□ ##左联:以本表为主表,左联表为副表。■■□
SELECT a.aid,a.aName,a.loc,b.bStand
FROM t_a AS a
LEFT JOIN t_b AS b
ON a.aid=b.aid; ##右联:以本表为副表,右联表为主表。□■■
SELECT a.aid,a.aName,a.loc,b.bStand
FROM t_a AS a
RIGHT JOIN t_b AS b
ON a.aid=b.aid; ##合并查询:
SELECT * FROM t_d UNION SELECT * FROM t_e; ## UNION,去掉两表的重复数据。 ■■■
SELECT * FROM t_d UNION ALL SELECT * FROM t_e; ## UNION ALL, 未去掉两表的重复数据。 ■■■■ -- ----------- 子查询 推荐使用,根据笛卡尔积,执行效率高 ----------- -- SELECT COUNT(*) FROM t_a AS a,t_b AS b; ##笛卡尔积 SELECT * FROM t_a
WHERE cId=(SELECT cId FROM t_a WHERE aName = 'Jay'); ##结果集可以是多行 SELECT * FROM t_a
WHERE (aId,loc) = ( SELECT aId,loc FROM t_a WHERE cId=3); ##结果集只能是单行 SELECT * FROM t_employee
WHERE deptno IN ( SELECT deptno FROM t_dept); SELECT * FROM t_employee
WHERE deptno NOT IN ( SELECT deptno FROM t_dept); ##使用ANY。在使用上,用 <= 和 >= 更有意义 ■■□
## <ANY (<=ANY) ,结果集是比最小值(包含)大的结果。
## >ANY (>=ANY) ,结果集是比最大值(包含)小的结果。
## =ANY,与使用 IN 一样。
SELECT sal FROM t_employee
WHERE job='SALESMAN'; SELECT * FROM t_employee
WHERE sal>=ANY(SELECT sal FROM t_employee WHERE job='SALESMAN'); ##使用ALL。在使用上,用 < 和 > 更有意义 ■□□
## <ALL (<=ALL) ,结果集是比最大值(包含)更大的结果。
## >ALL (>=ALL) ,结果集是比最小值(包含)更小的结果。
## =ANY,与使用 IN 一样。
SELECT sal FROM t_employee
WHERE job='SALESMAN'; SELECT * FROM t_employee
WHERE sal>ALL(SELECT sal FROM t_employee WHERE job='SALESMAN'); ##使用 EXISTS 与IN 的使用效果类似,以下两条SQL语句执行结果一致。
SELECT *
FROM t_dept AS d
WHERE EXISTS( SELECT * FROM t_employee WHERE deptno=d.deptno); SELECT * FROM t_dept AS d
WHERE deptno IN( SELECT deptno FROM t_employee); -- 综合测试 --
##计算笛卡尔积
SELECT COUNT(empno) FROM t_employee;
SELECT COUNT(deptno) FROM t_dept;
SELECT COUNT(*) FROM t_employee,t_dept; ##使用内联,无字段为NULL,但效率低(笛卡尔积为 9X5=45)
SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) AS number, AVG(e.sal) AS average
FROM t_dept AS d INNER JOIN t_employee AS e
ON d.deptno = e.deptno
GROUP BY d.deptno; ##使用左联,有字段为NULL,且效率低(笛卡尔积为 9X5=45)
SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) AS number,AVG(e.sal) AS average
FROM t_dept AS d LEFT JOIN t_employee AS e
ON d.deptno=e.deptno
GROUP BY d.deptno; ##使用右联,虽无字段为NULL,但无法保证其他情况没NULL,且效率低(笛卡尔积为 9X5=45)
SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) AS number,AVG(e.sal) AS average
FROM t_employee AS e LEFT JOIN t_dept AS d
ON d.deptno=e.deptno
GROUP BY d.deptno; ##使用子查询。最好为每个表派生别名,并指出每个字段是哪张表的。(防止字段之间重名)
##效率高,笛卡尔积为(4+9=13)
SELECT d.deptno,d.dname,d.loc,e.number,e.average
FROM t_dept AS d,
(SELECT deptno, COUNT(empno) AS number,AVG(sal) AS average
FROM t_employee GROUP BY deptno) AS e
WHERE d.deptno=e.deptno;
所有代码,均为自学时用到的测试与注释,知识细节或知识点不会面面俱到,亦不会有任何讲解,只做为自己学习复习用。
学习MySQL之多表操作(三)的更多相关文章
- 学习MySQL之单表操作(二)
##单表操作 ##创建表 CREATE TABLE t_employee( empno ), ename ), job ), MGR ), Hiredate DATE DEFAULT '0000-00 ...
- {MySQL的库、表的详细操作}一 库操作 二 表操作 三 行操作
MySQL的库.表的详细操作 MySQL数据库 本节目录 一 库操作 二 表操作 三 行操作 一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset utf ...
- mysql数据库学习(二)--表操作
一.表操作 以下内容都是自己学习的时候看过的一些知识,作为笔记记录一下吧,大部分都是所看文章的内容. 1.创建表 前面的基础篇笔记是相当于搭建了一个方便管理的文件夹树根,下面要学习的是一些关于表的知识 ...
- day 46 Django 学习3 数据库单表操作以及反向解析
前情提要: Django 已经学了不少了, 今天学习链接数据库的操作.以及相关的反向解析等 一:反向解析 1:反向解析模板层 跳转时设定url会随着前面的路由改变而改变 2:反向解析之 ...
- 数据库之 MySQL --- 数据处理 之 表操作、CRUD(六)
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一. 表操作 创建数据库CREATE DATABASE demo-- 删除数据库DROP DATABAS ...
- MySQL之多表操作
前言:之前已经针对数据库的单表查询进行了详细的介绍:MySQL之增删改查,然而实际开发中业务逻辑较为复杂,需要对多张表进行操作,现在对多表操作进行介绍. 前提:为方便后面的操作,我们首先创建一个数据库 ...
- Database学习 - mysql 数据库 多表/复合/子 查询
多表查询 多表查询,基本规则,通过两表有关联字段的进行条件匹配查询 内连接查询 方式一: SELECT 查看字段名[,查看字段名] FROM 一表名,二表名 WHERE 一/二表.字段 = 一/二表. ...
- mysql 库与表操作
1. 库操作 1.1. 创建数据库 语法规则:create database 库名; CREATE DATABASE dt55; 在创建库时,希望指定编码语法:create database 库名 c ...
- mysql数据库之表操作及字段约束条件
目录 一.存储引擎 二.表介绍 三.创建表 四.查看表结构 五.数据类型 一.介绍 二.数值类型 整数类型 浮点型 三.字符串类型 四.日期类型 五.枚举类型与集合类型 六.约束条件 七.修改表 al ...
随机推荐
- MySQL高可用方案
高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.虽然互联网服务号称7*24小时不间断服务,但多多少少有一些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无法 ...
- 【MSSQL】MSSQL还原单mdf文件报1813错误
序: MS SQL Server 2008 r2附加无ldf日志的mdf数据库时报1813错误.提示数据库被强制分离,无日志不能还原之类的话. 可能的原因: 原因系统正在执行定时作业,没有主要到多次强 ...
- 《Ansible权威指南》笔记(1)——安装,ssh密钥登陆,命令
2016-12-23 读这本<Ansible权威指南>学习ansible,根据本书内容和网上的各种文档,以及经过自己测试,写出以下笔记.另,这本书内容很好,但印刷错误比较多,作者说第二版会 ...
- Android 强制设置横屏或竖屏 设置全屏
(转自:http://blog.csdn.net/yuejingjiahong/article/details/6636981) 强制横屏: @Override protected void onRe ...
- Java程序设计求出岁数
题目:我年龄的立方是个4位数.我年龄的4次方是个6位数.这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次,求出我今年几岁. 直接拷贝运行就可以了. public class Age { ...
- atom无法安装插件的解决方法之一
atom通过setting中无法下载插件,通过apm也无法下载插件,可能是网络.config配置的问题,不好解决. 下面的方法全手动,基本属于万金油方法: 1,在atom的setting页面中点击op ...
- 移动端web开发,click touch tap区别
转自: http://blog.csdn.net/sly94/article/details/51701188 移动端用tap时会有穿透问题 一:click与tap比较 click与tap都会触发点击 ...
- NPOI操作EXCEL(三)——反射机制进行excel表格数据的解析
我们先来回忆回忆上篇文章讲到的通过xml配置文件实现excel批量模板解析的整体思路: 1.对每个excel模板制定xml配置规则集,实现xml配置文件的解析服务 2.为每个excel模板制定DTO, ...
- Todo list and 学习心得
1. 理论实践要区分起来学习,结合起来运用. 2. 内事不决问百度外事不决问谷歌 3. 一个人走的快,一群人走得远或者更快 2016-09-01 23:27:58 九月目标:对程序从编译到执行的整个 ...
- 表单验证插件之jquery.validate.js
提到表单验证的插件,第一个想到的就是jquery.validate.js,所以小生想在这里稍微详细地说一下这款插件的具体使用方法,便于理解,我直接附上整段demo的代码(没怎么调样式,主要是看js): ...