2021年3月30日学习日记

3.30学习情况回顾

今天主要学习了MySQL数据库的多表主要查询方法。

一、MySQL数据库查询

  1. 理论
    在这里插入图片描述
  2. 实例练习
    (1)#课堂练习1

#查询每个员工的领导:
SELECT a.ename empname ,b.ename leadername FROM emp a JOIN emp b ON a.mgr = b.empno;

#在emp表中查询每个员工的领导:
SELECT e1.ename ‘员工’,e2.ename ‘领导’ FROM emp e1 JOIN emp e2 ON e1.empno=e2.mgr;

#在emp表中查询每个员工的领导:
SELECT a.ename ‘员工’ ,b.ename ‘领导’ FROM emp a JOIN emp b ON a.mgr = b.empno;

#在tb_login和tb_book表中查user、row、section字段数据,两个表的user数据一致:
SELECT b.user,b.row,l.section FROM tb_book b RIGHT JOIN tb_login l ON b.user=l.user;

#在tb_login和tb_book表中查user、row、section字段数据,两个表的user数据一致:
SELECT section,tb_login.user,books,ROW FROM tb_login LEFT JOIN tb_book ON tb_login.user=tb_book.user;

#查当当网最贵的书,要求显示书籍名称、价格和出版社:
SELECT product_name ‘书籍名称’,dang_price ‘价格’,publishing ‘出版社’ FROM d_product LEFT JOIN d_book ON
d_product.id=d_book.id WHERE dang_price=(SELECT MAX(dang_price) FROM d_product);

#取得每个部门最高薪水的员工姓名:
SELECT e.ename,t.* FROM emp e RIGHT JOIN (SELECT deptno,MAX(sal) maxsal FROM emp GROUP BY deptno) t ON
t.deptno=e.deptno WHERE t.maxsal=e.sal;

#取得每个部门最高薪水的员工姓名:
SELECT e.ename,t.* FROM emp e JOIN (SELECT deptno,MAX(sal) maxsal FROM emp GROUP BY deptno) t ON
e.deptno=t.deptno WHERE e.sal=t.maxsal;

(2)#课堂练习2

#删库警告
DROP TABLE students;

#1.写出sql语句,创建数据库名:school数据库中有学生表:students,包含(序号id int(8)(主键+自增序列),
#学生学号no int(8)不能为空不能重名,学生姓名name varchar(20)不能为空,学生性别sex cha(1) 默认值‘男’,
#学生年龄age int(2),学生入学时间 date, 身高height float(5,1),体重weight float(5,1),班级名class varchar(10)

CREATE DATABASE school;
USE school;

CREATE TABLE students(
Id INT(8) PRIMARY KEY AUTO_INCREMENT,
NO INT(8) UNIQUE NOT NULL,
NAME VARCHAR(20) NOT NULL,
Sex CHAR(1) DEFAULT ‘m’ ,
Age INT(2),
Create_time DATETIME,
Height FLOAT(5,1),
Weight FLOAT(5,1),
Class VARCHAR(10)
);

#2.写出sql语句,在题1的学生表中插入两条数据:

INSERT INTO students(NO,NAME,age,sex,Create_time,height,weight,class) VALUES(0001,‘zhangsan’,18,‘女’,‘2019-10-05’,172.4,100.3,‘测试开发一班’);
INSERT INTO students(NO,NAME,age,sex,Create_time,height,weight,class) VALUES(0002,‘zhangsan’,19,‘男’,‘2019-10-05’,179.4,150.3,‘测试开发二班’);
INSERT INTO students(NO,NAME,age,sex,Create_time,height,weight,class) VALUES(0003,‘lisi’,20,‘男’,‘2019-12-03 21.39.53’,172.8,110,‘测试开发一班’);
INSERT INTO students(NO,NAME,age,sex,Create_time,height,weight,class) VALUES(0004,‘xieli’,22,‘女’,‘2019-12-04 21:40:36’,158,85,‘测试开发一班’);
INSERT INTO students(NO,NAME,age,sex,Create_time,height,weight,class) VALUES(0005,‘guanze’,25,‘男’,‘2019-12-10 21:41:06’,175,120,‘测试开发二班’);
INSERT INTO students(NO,NAME,age,sex,Create_time,height,weight,class) VALUES(0006,‘biaoge’,28,‘男’,‘2019-12-16 21:41:44’,183.9,180.9,‘测试开发一班’);
INSERT INTO students(NO,NAME,age,sex,Create_time,height,weight,class) VALUES(0007,‘wangjun’,31,‘男’,‘2019-12-03 21:42:26’,173.3,158.9,‘测试开发一班’);
INSERT INTO students(NO,NAME,age,sex,Create_time,height,weight,class) VALUES(0007,‘hanhan’,18,‘男’,‘2019-12-05 21:43:19’,167.7,118,‘测试开发二班’);
INSERT INTO students(NO,NAME,age,sex,Create_time,height,weight,class) VALUES(0007,‘chenrui’,22,‘女’,‘2019-12-04 21:43:59’,165.5,105.5,‘测试开发二班’);
INSERT INTO students(NO,NAME,age,sex,Create_time,height,weight,class) VALUES(0007,‘lifei’,28,‘男’,‘2019-12-05 21:44:36’,171,137,‘测试开发二班’);
INSERT INTO students(NO,NAME,age,sex,Create_time,height,weight,class) VALUES(0007,‘lily’,25,‘女’,‘2019-12-05 21:44:36’,156,56,‘测试开发三班’);

#3.修改id=1的记录中,学生的入学时间为2019-10-8
UPDATE students SET Create_time=‘2019-10-8’ WHERE id=0001;

#4.写出sql语句,查询学生表中姓名name等于zhangsan并且性别为‘女’的记录
SELECT * FROM students WHERE NAME=‘zhangsan’ AND sex=‘女’;

#5.写出sql语句,查询学生表中学生年龄age大于等于18并且小于25,并且性别为’男’的记录
SELECT * FROM students WHERE age>=18 AND age<25 AND sex=‘男’;

#6.写出sql语句,在学生表中,按照学生的身高升序排列
SELECT * FROM students ORDER BY height;

#7.写出sql语句,查询出身高最高的前10名学生
SELECT * FROM students ORDER BY height DESC LIMIT 10;

#8.写出sql语句,查询出身高最低的第6-10名学生
SELECT * FROM students ORDER BY height ASC LIMIT 5,5;

#9.写出能查询出以下结果的sql语句
SELECT class ‘班级’,sex ‘性别’ ,GROUP_CONCAT(NAME) ‘姓名’ FROM students GROUP BY class,sex;

#10.写出sql语句,计算学生表中学生的平均年龄
SELECT AVG(age) FROM students;

#11.写出sql语句,查询学生姓名以a开头g结尾的学生记录
SELECT * FROM students WHERE NAME LIKE ‘a%g’;

#12.写出sql语句,查询学生表中体重为null的学生记录
SELECT * FROM students WHERE weight IS NULL;

#13.写出sql语句,查出学生表中体重最轻的同学及其体重
SELECT NAME,weight FROM students WHERE weight=(SELECT MIN(weight) FROM students);

(3)#烽火面试题:
在这里插入图片描述在这里插入图片描述

#1.查找小于26岁的用户信息,展示用户的基本信息(昵称,邮箱,性别,年龄);
SELECT nickname,email,sex,age FROM user_property WHERE age<26;

#2.页面需要展示lilei用户的基本信息(昵称、邮箱、性别、年龄、爱好),请设计相关SQL;
SELECT nickname,email,sex,age,hobby_value FROM user_property JOIN hobby_dict ON user_property.hobbies=hobby_dict.hobby_key WHERE username=‘lilei’;

#3.页面需要展示xiangqiang用户关于篮球爱好的好友推荐信息,展示内容包含推荐好友的基本信息(昵称、邮箱、性别、年龄、爱好),
#并按年龄倒序排序,请设计相关SQL;

SELECT u.nickname,u.age,u.sex,u.email,h.hobby_value
FROM user_property u
JOIN (SELECT username,friend_id,hobby FROM user_friend_relation WHERE username=‘xiangqiang’) t
ON u.username=t.friend_id
JOIN hobby_dict h
ON h.hobby_key=u.hobbies
WHERE h.hobby_value=‘篮球’ ORDER BY u.age DESC

(4)#3.30作业

#删库警告
DROP DATABASE school2;

#建立数据库school2
CREATE DATABASE school2

#使用数据库school2
USE school2;

#建立表1Student
CREATE TABLE Student(
Sno VARCHAR(20) PRIMARY KEY NOT NULL,
Sname VARCHAR(20) NOT NULL,
Ssex VARCHAR(20) NOT NULL,
Sbirthday DATETIME,
Class VARCHAR(20)
)
ENGINE=INNODB DEFAULT CHARSET=utf8;

#建立表2Course
CREATE TABLE Course(
Cno VARCHAR(20) PRIMARY KEY NOT NULL,
Cname VARCHAR(20) NOT NULL,
Tno VARCHAR(20) ,
FOREIGN KEY (Tno) REFERENCES Teacher(Tno)
)
ENGINE=INNODB DEFAULT CHARSET=utf8;

#建立表3Score
CREATE TABLE Score(
Sno VARCHAR(20)NOT NULL,
Cno VARCHAR(20) NOT NULL,
Degree DECIMAL(4,1) ,
FOREIGN KEY (Sno) REFERENCES Student(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno)
)
ENGINE=INNODB DEFAULT CHARSET=utf8;

#建立表4Teacher
CREATE TABLE Teacher(
Tno VARCHAR(20) PRIMARY KEY NOT NULL,
Tname VARCHAR(20) NOT NULL,
Tsex VARCHAR(20) NOT NULL,
Tbirthday DATETIME,
Prof VARCHAR(20),
Depart VARCHAR(20) NOT NULL
)
ENGINE=INNODB DEFAULT CHARSET=utf8;

#表1添加数据
INSERT INTO Student VALUES
(108,‘曾华’,‘男’,‘1977-09-01’,95033),
(105,‘匡明’,‘男’,‘1975-10-02’,95031),
(107,‘王丽’,‘女’,‘1976-01-23’,95033),
(101,‘李军’,‘男’,‘1976-02-20’,95033),
(109,‘王芳’,‘女’,‘1975-02-10’,95031),
(103,‘陆君’,‘男’,‘1974-06-03’,95031);

#表2添加数据
INSERT INTO Course VALUES
(‘3-105’,‘计算机导论’,825),
(‘3-245’,‘操作系统’,804),
(‘6-166’,‘数字电路’,856),
(‘9-888’,‘高等数学’,831);

#表3添加数据
INSERT INTO Score VALUES(103,‘3-245’,86),
(105,‘3-245’,75),
(109,‘3-245’,68),
(103,‘3-105’,92),
(105,‘3-105’,88),
(109,‘3-105’,76),
(101,‘3-105’,64),
(107,‘3-105’,91),
(108,‘3-105’,78),
(101,‘6-166’,85),
(107,‘6-166’,79),
(108,‘6-166’,81);

#表4添加数据
INSERT INTO Teacher VALUES
(804,‘李诚’,‘男’,‘1958-12-02’,‘副教授’,‘计算机系’),
(856,‘张旭’,‘男’,‘1969-03-12’,‘讲师’,‘电子工程系’),
(825,‘王萍’,‘女’,‘1972-05-05’,‘助教’,‘计算机系’),
(831,‘刘冰’,‘女’,‘1977-08-14’,‘助教’,‘电子工程系’);

#1、查询Score表中成绩为85,86或88的记录
SELECT * FROM Score WHERE Degree=85 OR Degree=86 OR Degree=88;

#2、查询Student表中“95031”班或性别为“女”的同学记录
SELECT * FROM Student WHERE Class=‘95031’ OR Ssex=‘女’;

#3、查询Score表中的最高分的学生学号和课程号。(子查询或者排序)
SELECT Sno,Cno FROM Score WHERE Degree=(SELECT MAX(Degree) FROM Score);

#4、查询每门课的平均成绩
SELECT Cno,AVG(Degree) FROM Score GROUP BY Cno;

#5、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数
SELECT Cno,AVG(Degree) FROM Score WHERE Cno LIKE ‘3%’ GROUP BY Cno HAVING COUNT(cno)>5;

#6、查询教师的职称,需要去重
SELECT DISTINCT Prof FROM Teacher;

#7、查询成绩在60到80之间的所有记录
SELECT * FROM Score WHERE Degree BETWEEN 60 AND 80;

#8、查询班级及每个班级多少人
SELECT Class,COUNT(Sno) FROM Student GROUP BY Class;

#9、查询“95033”班学生的平均分
SELECT a.class, AVG(degree) FROM (SELECT Sno,class FROM student WHERE class=‘95033’) a JOIN score ON a.sno=score.sno;

#10、查询所有学生的成绩,要求展示学生姓名、课程名称、成绩
SELECT sname ‘学生姓名’,cname ‘课程名称’,degree ‘成绩’ FROM student JOIN score ON student.sno=score.sno JOIN course ON score.cno=course.cno;
SELECT Sname,Cname,Degree FROM Student,Course,Score WHERE Student.Sno=Score.Sno AND Course.Cno=Score.Cno;

#11、查询Student表中不姓“王”的同学记录
SELECT * FROM Student WHERE Sname NOT LIKE ‘王%’;

#12、以班号和年龄从大到小的顺序查询Student表中的全部记录
SELECT * FROM Student ORDER BY Class DESC,Sbirthday ASC;

#13、查询至少有2名男生的班号
SELECT Class,COUNT(Ssex) FROM Student WHERE Ssex=‘男’ GROUP BY Class HAVING COUNT(Ssex) >= 2;

#14、查询“男”教师及其所上的课程
SELECT Tname,Cname FROM Course,Teacher WHERE Teacher.Tno=Course.Tno AND Tsex=‘男’;

#15、查询所有学生的成绩,要求展示学生姓名、课程名称、成绩、任课老师
SELECT Sname,Cname,Degree,Tname FROM Teacher,Course, Score,Student WHERE Teacher.Tno=Course.Tno AND Course.Cno=Score.Cno AND Student.Sno=Score.Sno;
SELECT sname,cname,degree,tname FROM score JOIN course ON score.Cno=course.Cno JOIN student ON Score.Sno=student.sno JOIN teacher ON teacher.Tno=course.Tno;

猜你喜欢

转载自blog.csdn.net/weixin_56039103/article/details/115336517