SQL语法练习3

文章提供了一系列SQL查询练习,包括使用内连接查询所有学生,按班级查询学生数量并排序,以及通过外连接查询有无学生的班级。同时,介绍了左连接、右连接和全外连接的概念,并展示了如何用UNION去除重复数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- 创建主表
DROP TABLE IF EXISTS shs_class;
CREATE TABLE shs_class (
  `id` int NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
)default charset = utf8;

-- 创建从表
DROP TABLE IF EXISTS shs_students;
CREATE TABLE shs_students (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `age` tinyint DEFAULT '0',
  `address` varchar(255) DEFAULT NULL,
  `class_id` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT shs_class_id  FOREIGN KEY (class_id)  REFERENCES  shs_class(id) -- 外键约束
)default charset = utf8;

-- 插入数据
INSERT INTO shs_class (`id`, `name`) VALUES ('1', '一班');
INSERT INTO shs_class (`id`, `name`) VALUES ('2', '二班');


INSERT INTO shs_students (`id`, `name`, `age`, `address`, `class_id`) VALUES ('1', 'shs1', '18', '武汉市', '1');
INSERT INTO shs_students (`id`, `name`, `age`, `address`, `class_id`) VALUES ('2', 'shs', '23', '上海市', '2');
INSERT INTO shs_students (`id`, `name`, `age`, `address`, `class_id`) VALUES ('3', '李思', '12', '孝感市', '1');
INSERT INTO shs_students (`id`, `name`, `age`, `address`, `class_id`) VALUES ('4', '刘流', '27', '武汉市', '1');

一、联表查询练习

1.交叉连接查询 (笛卡尔积)

SELECT *FROM shs_students,shs_class;

二、内连接查询

主要分为显示内连接:SELECT * FROM A INNER JOIN B ON 条件;
和隐示内连接:SELECT * FROM A,B WHERE 条件;
2.1查询第一期所有学生
2.2查询第一期和第二期所有的学生
2.3查询每个班级下的学生总数,并且学生总数升序排列
2.4查询班级总人数>2的班级,并且人数降序排列

-- 2.1查询第一期所有学生
SELECT * FROM shs_class INNER JOIN shs_students ON shs_class.id=shs_students.class_id and shs_class.id=1;

-- 2.2查询第一期和第二期所有的学生
SELECT * FROM shs_class,shs_students WHERE shs_class.id=shs_students.class_id and shs_class.id IN (1,2);

-- 2.3查询每个班级下的学生总数并且学生总数升序排列
SELECT shs_class.`name`,COUNT(*) FROM shs_class INNER JOIN shs_students ON shs_class.id=shs_students.class_id GROUP BY shs_students.class_id ORDER BY COUNT(*);

-- 2.4查询班级总人数>2的班级,并且人数降序排列
SELECT shs_class.`name`,COUNT(*) FROM shs_class INNER JOIN shs_students ON
shs_class.id=shs_students.class_id GROUP BY shs_students.class_id HAVING
COUNT(*)>2  ORDER BY COUNT(*) DESC;

三、外连接查询

外连接:左外连接、右外连接、全外连接(union)
插入两条数据:

java
INSERT INTO shs_class (`id`, `name`) VALUES ('3', '三班');
INSERT INTO shs_students (`id`, `name`, `age`, `address`, `class_id`) VALUES ('5', '刘流', '27', '武汉市', null);

3.1 查询哪些班级是有学生 哪些班级是没有学生
3.2 查询哪些学生是有班级,哪些学生是没有班级
3.3 使用union关键字实现左连接和右连接的并集 让去重复数据

-- 3.1 查询哪些班级是有学生 哪些班级是没有学生
SELECT * FROM shs_class LEFT JOIN shs_students ON shs_class.id=shs_students.class_id ;

-- 3.2 查询哪些学生是有班级,哪些学生是没有班级
SELECT * FROM shs_class RIGHT  JOIN shs_students ON shs_class.id=shs_students.class_id;

-- 3.3 使用union关键字实现左连接和右连接的并集 让去重复数据
SELECT * FROM shs_class LEFT JOIN shs_students ON shs_class.id=shs_students.class_id UNION SELECT * FROM shs_class RIGHT  JOIN shs_students ON shs_class.id=shs_students.class_id;

总结:
左连接,以左边为准,左变有该数据,就会返回,右变没有匹配上则直接返回为null;
右连接,以右边为准,右变有该数据,就会返回,左变没有匹配上则直接返回为null;
内连接左边与右边都是必须匹配才会返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值