MySQL—数据处理之查询(二)

一、数据准备

-- 数据准备
-- 1 创建学生表
CREATE TABLE student(
		stu_num VARCHAR(10),
		name VARCHAR(30),
		gender CHAR(2),
		age INT,
		birthday DATE,
		major VARCHAR(30),
		institute VARCHAR(50),
		fee DOUBLE,
		tea_num VARCHAR(10),
		create_time datetime
);

-- 1.1 插入数据
-- 学号=2023000000,姓名=宇智波佐助,性别=男,13岁,出生日期2001-07-12,专业为先轮眼,学院为火影学院,学费为200.1,tea_num为"100001",create_time设定为插入数据时间。
INSERT INTO student
VALUES("2023000000","宇智波佐助","男",13, '2001-07-12',"写轮眼","火影学院",200.1,"100001",NOW());
-- 学号=2023000001,姓名=鸣人,性别=男,12岁,出生日期2001-01-02,专业为多重影分身,学院为火影学院,学费为200.1,tea_num为"100001",create_time设定为插入数据时间。
INSERT INTO student
VALUES("2023000001","鸣人","男",12, '2001-01-02',"影分身","火影学院",200.1,"100001",NOW());
-- 学号=2023000002,姓名=小樱,性别=女,14岁,出生日期2001-05-18,专业为治疗,学院为火影学院,学费为200.1,tea_num为"100001",create_time设定为2023-01-12 20:04:11插入数据时间。
INSERT INTO student
VALUES('2023000002','小樱', '女', 14, '2001-05-18', '治疗', '火影学院', '200.1',"100001",'2023-01-12 20:04:11');
-- 学号=2023000003,姓名=我爱罗,性别=男,16岁,出生日期1999-12-31,专业为砂之术,学院为风影学院,学费为400,tea_num为"100004",create_time设定为插入数据时间。
INSERT INTO student
VALUES("2023000003","我爱罗","男",16, "1999-12-31","砂之术","风影学院",400,"100004",NOW());
-- 学号=2023000004,姓名=小李,性别=男,专业为体术,学院为火影学院,学费为100,tea_num为"100002",create_time设定为插入数据时间。
INSERT INTO student(stu_num,name,gender,age,birthday,major,institute,fee,tea_num,create_time)
VALUES("2023000004","小李","男",NULL, NULL,"体术","火影学院",100,"100002", NOW());
-- 学号=2023000005,姓名=手鞠,性别=女,18岁,出生日期1995-01-25,专业为三星扇,学院为风影学院,学费为200.1,tea_num为"100004",create_time设定为插入数据时间。
INSERT INTO student
VALUES('2023000005','手鞠', '女', 18, '1995-01-25', '三星扇', '风影学院', '200.1',"100004", NOW());


-- 2 创建老师表,名为teacher表,属性包含:tea_num(字符类型),name(字符类型),gender(字符类型),age(整型),department(字符类型)
--                                                ,institute(字符类型),salary(浮点类型),hire_date(date类型)。
CREATE TABLE teacher(
		tea_num VARCHAR(10),
		name VARCHAR(30),
		gender CHAR(2),
		age INT,
		department VARCHAR(30),
		institute VARCHAR(50),
		salary DOUBLE,
		hire_date date
);

-- 2.1 插入数据
-- 教师号为100001,姓名为旗木卡卡西,性别男,年龄30,科室为综合科,就职学院为火影学院,薪水2000,入职日期为1988-12-21
INSERT INTO teacher
VALUES("100001","旗木卡卡西","男",30,"综合科","火影学院",2000,"1988-12-21");
-- 教师号为100002,姓名为迈特凯,性别男,年龄31,科室为体术科,就职学院为火影学院,薪水2100,入职日期为1987-10-21
INSERT INTO teacher
VALUES("100002","迈特凯","男",31,"体术科","火影学院",2100,"1987-10-21");
-- 教师号为100003,姓名为孙悟空,性别男,年龄100,科室为猴科,就职学院为西游学院,薪水1500,入职日期为1966-11-01
INSERT INTO teacher
VALUES("100003","孙悟空","男",100,"猴科","西游学院",1500,"1966-11-01");
-- 教师号为100004,姓名为马基,性别男,年龄42,科室为风科,就职学院为风影学院,薪水3000,入职日期为1975-04-21
INSERT INTO teacher
VALUES("100004","马基","男",42,"风科","风影学院",3000,"1975-04-21");

二、实操练习

-- 实操练习
-- 1 查询属性
-- 1.1 查询所有属性 *:表示所有属性
SELECT * FROM student;
-- 1.2 查询个别属性
SELECT stu_num,NAME,gender FROM student;
-- 2 列的别名 AS 是可以省略的
SELECT stu_num AS "学号",name AS "姓名",gender AS "性别",age AS "年龄",birthday AS "生日",major AS "专业",institute AS "学院",fee AS "学费",create_time AS "创建时间"
FROM student;
-- 或
SELECT stu_num,name,gender,age,birthday,major,institute,fee,create_time
FROM student;
-- 3 使用WHERE进行条件过滤
-- 3.1 比较运算
-- 3.1.1 查询姓名为"鸣人"的信息
SELECT *
FROM student
WHERE name = "鸣人";
-- 3.1.2 查询年龄小于等于12的学生姓名
SELECT NAME
FROM student
WHERE age <= 12;
-- 3.2 BETWEEN ... AND  在两个值直接,包含边界
-- 3.2.1 查询年龄在12到14直接的学生姓名和生日
SELECT name,birthday
FROM student
WHERE age BETWEEN 12 AND 14;
-- 等同于
SELECT name,birthday
FROM student
WHERE age >= 12 AND age <= 14;
-- 3.3 IN
-- 3.3.1 查询学号为2023000003和2023000002的学生
SELECT *
FROM student
WHERE stu_num IN ('2023000003','2023000002');
-- 3.4 LIKE  %匹配任意字符  _只匹配一个字符
-- 3.4.1 查询name第一个字是鸣的学生
SELECT * FROM student WHERE `name` LIKE "鸣%";
-- 3.4.2 查询name中第二个字是爱的学生
SELECT * FROM student WHERE `name` LIKE "_爱%";
-- 3.5 空值判断
-- 3.5.1 查询年龄为空的学生信息
SELECT * FROM student WHERE age IS NULL;
-- 3.5.2 查询年龄不为空的学生信息
SELECT * FROM student WHERE age IS NOT NULL;
-- 3.6 逻辑运算 AND OR NOT
-- 3.6.1 查询学生性别是女,并且在火影学院学习的学生信息
SELECT * FROM student WHERE gender = "女" AND institute = "火影学院";
-- 3.6.2 查询学号不为2023000003、2023000002的学生信息
SELECT * FROM student WHERE stu_num NOT IN("2023000003","2023000002");
-- 3.7 ORDER BY  ASC:升序  DESC:降序
-- 3.7.1 单列排序:按照学生学号降序排序
SELECT * FROM student ORDER BY stu_num DESC; 
-- 3.7.2 多列排序:依次按照年龄降序、学号升序排序
SELECT * FROM student ORDER BY age DESC,stu_num ASC;
-- 3.8 分组函数 GROUP BY:将表中的数据分成或干组
-- 3.8.1 AVG():求平均值
SELECT institute AS "学院",AVG(age) AS "平均年龄"
FROM student
GROUP BY institute;
-- 3.8.2 SUM():合计
SELECT institute AS "学院", SUM(fee) AS "学费总计"
FROM student
GROUP BY institute;
-- 3.8.3 MIN():最小值
SELECT MIN(age) AS "最小年龄"
FROM student;
-- 3.8.4 MAX():最大值
SELECT MAX(age) AS "最大年龄"
FROM student;
-- 3.8.5 COUNT():计数
SELECT COUNT(*) AS "学生人数"
FROM student;
-- 3.8.6 非法使用组函数:不能在WHERE中使用组函数,要在HAVING中使用组函数
-- 3.8.6.1 查询平均年龄在大于等于14的学院
-- 错误
SELECT institute AS "学院",AVG(age) AS "平均年龄"
FROM student
WHERE AVG(age) >= 14
GROUP BY institute;
-- 正确
SELECT institute AS "学院",AVG(age) AS "平均年龄"
FROM student
GROUP BY institute
HAVING AVG(age) >= 14;
-- 3.9 过滤分组:HAVING  1.行已经分组了  2.使用分组函数 即对已经分组的数据进行过滤,跟在GROUP BY后面,与其结合使用
-- 3.9.1 查询平均年龄小于等于14的学院
SELECT institute AS "学院",AVG(age) AS "平均年龄"
FROM student
GROUP BY institute
HAVING AVG(age) <= 14;
-- 3.10 多表查询
-- 3.10.1 等值连接
SELECT student.stu_num,student.name,student.tea_num,teacher.name,teacher.tea_num
FROM student,teacher
WHERE student.tea_num = teacher.tea_num;
-- 3.10.2 使用别名
SELECT s.stu_num,s.name,s.tea_num,t.name,t.tea_num
FROM student AS s,teacher AS t
WHERE s.tea_num = t.tea_num;
-- 或 可以省略掉"AS"
SELECT s.stu_num,s.name,s.tea_num,t.name,t.tea_num
FROM student s,teacher t
WHERE s.tea_num = t.tea_num;
-- 3.11 JOIN 内连接、左外连接、内外连接
-- 3.11.1 内连接
SELECT s.stu_num,s.name,s.tea_num,t.name,t.tea_num
FROM student s
INNER JOIN teacher t ON s.tea_num = t.tea_num;
-- 3.11.2 左连接
SELECT s.stu_num,s.name,s.tea_num,t.name,t.tea_num
FROM student s
LEFT JOIN teacher t ON s.tea_num = t.tea_num;
-- 3.11.3 右连接
SELECT s.stu_num,s.name,s.tea_num,t.name,t.tea_num
FROM student s
RIGHT JOIN teacher t ON s.tea_num = t.tea_num;

三、练习题

-- 1 创建一个名为test3_db的数据库
create database test2_db;
-- 2 查看刚才创建的test3_db数据库
show databases;
-- 3 在test3_db数据库中创建名为student的表,属性包含:stu_num(字符类型),name(字符类型),gender(字符类型),age(整型),birthday(date类型)、
--                                                   major(字符类型),institute(字符类型),fee(浮点类型),create_time(datetime类型)。
use test3_db;
CREATE TABLE student(
		stu_num VARCHAR(10),
		name VARCHAR(30),
		gender CHAR(2),
		age INT,
		birthday DATE,
		major VARCHAR(30),
		institute VARCHAR(50),
		fee DOUBLE,
		tea_num VARCHAR(10),
		create_time datetime
);


-- 4 插入数据
-- 4.1 学号=2023000000,姓名=宇智波佐助,性别=男,13岁,出生日期2001-07-12,专业为先轮眼,学院为火影学院,学费为200.1,tea_num为"100001",create_time设定为插入数据时间。
INSERT INTO student
VALUES("2023000000","宇智波佐助","男",13, '2001-07-12',"写轮眼","火影学院",200.1,"100001",NOW());
-- 4.2 学号=2023000001,姓名=鸣人,性别=男,12岁,出生日期2001-01-02,专业为多重影分身,学院为火影学院,学费为200.1,tea_num为"100001",create_time设定为插入数据时间。
INSERT INTO student
VALUES("2023000001","鸣人","男",12, '2001-01-02',"影分身","火影学院",200.1,"100001",NOW());
-- 4.3 学号=2023000002,姓名=小樱,性别=女,14岁,出生日期2001-05-18,专业为治疗,学院为火影学院,学费为200.1,tea_num为"100001",create_time设定为2023-01-12 20:04:11插入数据时间。
INSERT INTO student
VALUES('2023000002','小樱', '女', 14, '2001-05-18', '治疗', '火影学院', '200.1',"100001",'2023-01-12 20:04:11');
-- 4.4 学号=2023000003,姓名=我爱罗,性别=男,16岁,出生日期1999-12-31,专业为砂之术,学院为风影学院,学费为400,tea_num为"100004",create_time设定为插入数据时间。
INSERT INTO student
VALUES("2023000003","我爱罗","男",16, "1999-12-31","砂之术","风影学院",400,"100004",NOW());
-- 4.5 学号=2023000004,姓名=小李,性别=男,专业为体术,学院为火影学院,学费为100,tea_num为"100002",create_time设定为插入数据时间。
INSERT INTO student(stu_num,name,gender,age,birthday,major,institute,fee,tea_num,create_time)
VALUES("2023000004","小李","男",NULL, NULL,"体术","火影学院",100,"100002", NOW());
-- 4.6 学号=2023000005,姓名=手鞠,性别=女,18岁,出生日期1995-01-25,专业为三星扇,学院为风影学院,学费为200.1,tea_num为"100004",create_time设定为插入数据时间。
INSERT INTO student
VALUES('2023000005','手鞠', '女', 18, '1995-01-25', '三星扇', '风影学院', '200.1',"100004", NOW());

-- 5 在test3_db数据库中创建名为teacher表,属性包含:tea_num(字符类型),name(字符类型),gender(字符类型),age(整型),department(字符类型)
--                                                ,institute(字符类型),salary(浮点类型),hire_date(date类型)。
CREATE TABLE teacher(
		tea_num VARCHAR(10),
		name VARCHAR(30),
		gender CHAR(2),
		age INT,
		department VARCHAR(30),
		institute VARCHAR(50),
		salary DOUBLE,
		hire_date date
);

-- 5.1 插入数据
-- 教师号为100001,姓名为旗木卡卡西,性别男,年龄30,科室为综合科,就职学院为火影学院,薪水2000,入职日期为1988-12-21
INSERT INTO teacher
VALUES("100001","旗木卡卡西","男",30,"综合科","火影学院",2000,"1988-12-21");
-- 教师号为100002,姓名为迈特凯,性别男,年龄31,科室为体术科,就职学院为火影学院,薪水2100,入职日期为1987-10-21
INSERT INTO teacher
VALUES("100002","迈特凯","男",31,"体术科","火影学院",2100,"1987-10-21");
-- 教师号为100003,姓名为孙悟空,性别男,年龄100,科室为猴科,就职学院为西游学院,薪水1500,入职日期为1966-11-01
INSERT INTO teacher
VALUES("100003","孙悟空","男",100,"猴科","西游学院",1500,"1966-11-01");
-- 教师号为100004,姓名为马基,性别男,年龄42,科室为风科,就职学院为风影学院,薪水3000,入职日期为1975-04-21
INSERT INTO teacher
VALUES("100004","马基","男",42,"风科","风影学院",3000,"1975-04-21");

-- 6 查询平均年龄大于等于14的学院
SELECT institute AS "学院",AVG(age) AS "平均年龄"
FROM student
GROUP BY institute
HAVING AVG(age) >= 14;
-- 7 查询student表所有属性,并为每个属性列起一个中文别名
SELECT stu_num AS "学号",name AS "姓名",gender AS "性别",age AS "年龄",birthday AS "生日",major AS "专业",institute AS "学院",fee AS "学费",create_time AS "创建时间"
FROM student;
-- 8 求各个学院学生的平均年龄
SELECT institute AS "学院",AVG(age) AS "平均年龄"
FROM student
GROUP BY institute;
-- 9 查询年龄在12到14的学生姓名和生日,并为其每个属性列起一个中文别名(用两种方法实现)
SELECT name AS "姓名",birthday AS "生日"
FROM student
WHERE age BETWEEN 12 AND 14;
-- 等同于
SELECT name AS "姓名",birthday AS "生日"
FROM student
WHERE age >= 12 AND age <= 14;
-- 10 查询学号为2023000004和2023000005的学生
SELECT *
FROM student
WHERE stu_num IN ('2023000004','2023000005');
-- 11 求学生总人数
SELECT COUNT(*) AS "学生人数"
FROM student;
-- 12 查询name只有两个字且最后一个字为“人”的学生
SELECT * FROM student WHERE `name` LIKE "_人";
-- 13 按照学生年龄降序排序
SELECT * FROM student ORDER BY age DESC; 
-- 14 查询生日为空的学生信息
SELECT * FROM student WHERE birthday IS NULL;
-- 15 求火影学院学生最小年龄
SELECT MIN(age) AS "最小年龄"
FROM student
WHERE institute = "火影学院";
-- 16 查询年龄不为空的学生信息
SELECT * FROM student WHERE age IS NOT NULL;
-- 17 求风影学院学生最大年龄
SELECT MAX(age) AS "最大年龄"
FROM student
WHERE institute = "风影学院";
-- 18 使用内连接将student表和teacher表连接起来
SELECT s.stu_num,s.name,s.tea_num,t.name,t.tea_num
FROM student s
INNER JOIN teacher t ON s.tea_num = t.tea_num;
-- 19 多列排序:依次按照年龄降序、学号升序排序
SELECT * FROM student ORDER BY age DESC,stu_num ASC;
-- 20 求火影学院学生不同性别的平均年龄
SELECT institute AS "学院",gender AS "性别",AVG(age) AS "平均年龄"
FROM student
WHERE institute = "火影学院"
GROUP BY gender;
-- 21 查询学号不为2023000000、2023000002的学生信息
SELECT * FROM student WHERE stu_num NOT IN("2023000000","2023000002");
-- 22 使用左外连接将student表和teacher表连接起来
SELECT s.stu_num,s.name,s.tea_num,t.name,t.tea_num
FROM student s
LEFT JOIN teacher t ON s.tea_num = t.tea_num;
-- 23 求各个学院学生的学费总计
SELECT institute AS "学院", SUM(fee) AS "学费总计"
FROM student
GROUP BY institute;
-- 24 查询name中第一个字为“小”的学生信息
SELECT * FROM student WHERE `name` LIKE "小%";
-- 25 求各个学院老师的薪水总计
SELECT institute AS "学院", SUM(salary) AS "薪资总计"
FROM teacher
GROUP BY institute;
-- 26 求火影学院老师最高薪水
SELECT MAX(salary) AS "最高薪水"
FROM teacher
WHERE institute = "火影学院";
-- 27 查询姓名为"宇智波佐助"的学生信息
SELECT *
FROM student
WHERE name = "宇智波佐助";
-- 28 查询学生年龄存在大于15的学院
SELECT institute AS "学院",MAX(age) AS "最大年龄"
FROM student
GROUP BY institute
HAVING MAX(age) > 15;
-- 29 查询年龄小于等于13的学生姓名
SELECT NAME
FROM student
WHERE age <= 13;
-- 30 查询出每个学生对应的教师信息
SELECT student.stu_num,student.name,student.tea_num,teacher.name,teacher.tea_num
FROM student,teacher
WHERE student.tea_num = teacher.tea_num
GROUP BY student.`name`;
-- 31 查询学生性别是男,并且年龄小于15岁的学生信息
SELECT * FROM student WHERE gender = "男" AND age < 15;
-- 32 使用右外连接将student表和teacher表连接起来
SELECT s.stu_num,s.name,s.tea_num,t.name,t.tea_num
FROM student s
RIGHT JOIN teacher t ON s.tea_num = t.tea_num;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值