数据库基础--MySQL多表查询之联表查询

联表查询

定义:多张表联合在一起查询,例如学生信息与学生班级表、部门与员工表

创建两张表,主表与从表

CREATE TABLE `TestMain`(
	`id` INT Not NULL AUTO_INCREMENT,
	 `name`VARCHAR(10),
	  `introduction` VARCHAR(255),
		PRIMARY KEY(`id`)
);
CREATE TABLE `Test`(
	`id` INT Not NULL AUTO_INCREMENT,
	 `name`VARCHAR(10),
	  `introduction` VARCHAR(255),
		`age` INT(3) DEFAULT '3',
		testid INT NOT NULL,
		PRIMARY KEY(`id`),
		CONSTRAINT TEST_ID FOREIGN KEY (testid) REFERENCES TestMain(id)
);

交叉连接查询

语法定义:SELECT * FROM 表名1,表名2 

运行结果:

缺陷:会产生数据冗余,出现了两条同样的从表数据

内连接查询

显示内连接

语法:Select * FROM 表名1 INNER JOIN 表名2 ON 条件

示例:

SELECT * FROM testmain INNER JOIN test ON testmain.id=testid

运行结果

隐式内连接

Select * FROM 表名1,表名2 WHERE 条件

示例:

SELECT * FROM testmain,test WHERE testmain.id=testid

运行结果

外连接查询

左连接

以左表数据为基准,左表有而右表没有,也会返回数据,只是返回值为null

SELECT * FROM testmain LEFT JOIN test ON testmain.id=testid

运行结果

右连接

以右表数据为基准,右表有而左表没有,也会返回数据,只是返回值为null

SELECT * FROM testmain RIGHT JOIN test ON testmain.id=testid

运行结果

左连接与右连接的查询结果进行连接并进行去重

SELECT * FROM testmain LEFT JOIN test ON testmain.id=testid;
UNION
SELECT * FROM testmain RIGHT JOIN test ON testmain.id=testid

运行结果

子查询

简单示例

定义:一个查询语句嵌套在另一个查询语句中的查询

SELECT * FROM test WHERE age IN(SELECT MAX(age) FROM test)

语法释义:查询出test表中年龄最大学生的所有信息

运行结果

需求2:查询testid为1和2的学生所有信息

从表数据:

主表数据:

SQL语句:

SELECT * FROM test JOIN testmain ON testid=testmain.id AND(testid=1 OR testid=2)

运行结果

需求:查询testid为1且年龄大于3的所有学生的信息

SQL语句

SELECT * FROM test JOIN testmain ON testid=testmain.id AND(testid=1 AND age>3)

运行结果

子查询相关关键字

ALL

需求1:查询年龄大于testid为1的学生的年龄的学生的所有信息

test表数据如下

SQL语句:

SELECT * FROM test WHERE age> ALL(SELECT age FROM test WHERE testid=1)

语法释义:简单理解就是ALL关键字把查询到的所有年龄,都装入了一个集合,比where age=这样的查询方式查询范围更大

运行结果

NOT IN

IN:判断所查询出的值是否在某个集合中

需求:查询testid=1和3的所有学生的信息

SQL语句:

SELECT * FROM test WHERE testid IN(1,3)

此处也可通过多表连接的方式进行查询

SELECT * FROM test WHERE testid IN (SELECT id FROM testmain WHERE testmain.id=1 OR testmain.id=3)

运行结果:

NOT IN:则可以取反

SQL语句:

SELECT * FROM test WHERE testid NOT IN (SELECT id FROM testmain WHERE testmain.id=1 OR testmain.id=3)

运行结果

EXISTS

定义:判断查询的结果是否存在,比In的效率要高,一般数据量大的情况下推荐使用EXISTS

查询到了返回TRUE,为查询到返回FALSE

编写EXISTS注意点:

SQL语句

SELECT * FROM test WHERE EXISTS(SELECT * FROM test WHERE age>4)

执行结果

大家可以发现,此时的查询结果显然有问题,这是因为我们在EXISTS后面的括号当中,将语句给写死了,就一直返回的为TRUE.

正确写法

SELECT * FROM test  S1 WHERE EXISTS(SELECT * FROM test S2 WHERE S1.age>4)

通过内嵌一次判断,来保证最终输出的结果为正确的,S1 ,S2为临时表名,就是为了区分开EXISTS里的test与EXISTS外的test

运行结果

表自关联

(测试数据库数据)

SQL语句

SELECT * FROM company type AS A,
company type AS B
WHERE A.ID=B.parent_id;

运行结果

写在最后:

多表查询在实际运用中十分广泛,本次分享的都是一些较为简单的用法。希望能够给大家带来帮助,SQL语句是需要大家去勤加练习的。笔者小,中,大厂均有面试经历,每日分享全栈知识与面试题,希望能够与大家共同进步。

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值