数据库相关锻炼
#第一天
#insert插入语句
INSERT INTO course(CNO,CNAME,TEACHER)
VALUES ('K4','Java','白'),('K5','C++','王'),('K6','数值计算方法','刘');
#update修改语句
UPDATE course
SET TEACHER='独'
WHERE (CNO='K1');
#WHERE 后可以跟BETWEEN ...AND...,,AND,,OR
#导入数据库
#文件->打开
#互换男女性别
UPDATE STUDENT SET sex='3'
WHERE sex='1';
UPDATE student SET sex='1'
WHERE sex='2';
UPDATE student SET sex='2'
WHERE sex='3';
#修改表中数据不存在的列
UPDATE student SET phone='119'
WHERE phone='';
UPDATE student SET sex='1'
WHERE sex IS NULL;
#删除语句delete
DELETE FROM student
WHERE studentname='' OR studentname IS NULL;
#自增auto删除并不能对,不能让计数器清0/////delete不能清空计数器,truncate可以
TRUNCATE TABLE #删除整个表中的数据,计数器同样也归零
#查询语句select
SELECT *FROM student;
SELECT COUNT(1)'学生总数'FROM student;
SELECT studentno AS 学号,
studentname 姓名,
gradeid 年级,
sex 性别
FROM student
WHERE greadid=1 AND sex='1';
#like 模糊查询关键字
SELECT *FROM student
WHERE studentname LIKE '李__';# 李%查询李姓学生,李_ _查询李某某,李_查询李某
#找到12月出生的学生
SELECT *FROM student
WHERE MONTH(borndate)=12;
#当前月过生日的人
SELECT *FROM student
WHERE MONTH(borndate)=MONTH (NOW());
#显示当前时间
SELECT MONTH(2025-6-23);
SELECT NOW();
#第二天
#连接,连接查询,SQL语句的提升性能语句方法
#all/distinct 所有/唯一
#联合查询
SELECT student.studentno,studentname,studentresult
FROM student,result;
#十天上完课程的均课时
SELECT subjectname '课程名称',ClassHour'课时',ClassHour/10 '10天均课时'
FROM SUBJECT;
#去掉select查询中重复的记录,所有信息都重复才叫重复
SELECT DISTINCT studentno
FROM result;
#IN等同于在其中
SELECT *FROM student
WHERE studentno IN (1005,1009,1012);
#查询李同学的成绩
SELECT *FROM student WHERE studentname LIKE '李%';
SELECT studentno '李同学',studentresult 成绩 FROM result
WHERE studentno IN
(SELECT studentno FROM student
WHERE studentname LIKE '李%');#其中不能放select*from
#inner join 内连接
SELECT subjectname,gradename FROM SUBJECT s
INNER JOIN grade g
ON s.`GradeID`=g.`GradeID`
WHERE gradename='大一';
SELECT s.studentno,studentname 张秋丽,studentresult FROM result s
INNER JOIN student g
ON g.`StudentNo`=s.`StudentNo`
WHERE studentname='张秋丽';
#找未参加考试的学生,显示学号和姓名(用子查询)
SELECT studentno,studentname FROM student
WHERE studentno NOT IN(
SELECT DISTINCT studentno FROM result);
#左外连接(left join),右外连接(right join)
SELECT*FROM result s #(注意表顺序,反了结果可能没有)
RIGHT JOIN student r
ON s.`StudentNo`=r.`StudentNo`
WHERE studentresult IS NULL;
#自查询
SELECT c1.categoryName 父栏目,c2.categoryName 子栏目
FROM `category`c1
JOIN `category`c2
ON c1.`categoryId`=c2.`pid`;
#查询数据库结构-1的成绩降序排列
SELECT subjectname,studentresult FROM result s
INNER JOIN SUBJECT t
ON s.`SubjectNo`=t.`SubjectNo`
WHERE subjectname='数据库结构-1'
ORDER BY studentresult;
#查询学生表按照年级降序排列,如果有重复则按照学号降序排列
SELECT * FROM student
ORDER BY gradeid DESC,studentno DESC
LIMIT 0,4;#第一页
LIMIT 4,4;#第二页
LIMIT 8,4;#第三页
#查询所有选数据库结构-2的同学成绩,显示(打印)学号、姓名、课程名和成绩,
#并按照由高到低顺序排列第一次打印前五行,第二次打印6-10行
SELECT studentname 姓名,s.studentno 学号,subjectname '数据库结构-2',studentresult FROM student s
JOIN result t
ON s.`StudentNo`=t.`StudentNo`
JOIN SUBJECT b
ON t.`SubjectNo`=b.`SubjectNo`
WHERE subjectname='数据库结构-2'
ORDER BY studentresult DESC
LIMIT 0,5;
LIMIT 5,5;
#三张表,显示只用到两张表,可用子查询
SELECT s.`StudentNo`,s.`StudentName`,studentresult FROM student s
JOIN result t ON s.`StudentNo`=t.`StudentNo`
WHERE t.`SubjectNo`IN (
SELECT subjectno FROM SUBJECT
WHERE subjectname='C语言-1')
ORDER BY studentresult DESC
LIMIT 5;
#函数count()总数,sum求和,avg求平均,min,max
#按照不同课程分组,分别计算平均分最高分最低分,低于60的不显示
SELECT subjectname,MAX(studentresult)最高分,MIN(studentresult)最低分,AVG(studentresult)平均分
FROM SUBJECT a JOIN result b ON a.`SubjectNo`=b.`SubjectNo`
GROUP BY a.subjectno HAVING MIN(studentresult)>60;
#注意group后不能用where
#统计各年级人数,显示年级名称和人数,男女也分加sex
SELECT gradename,COUNT(gradename),sex
FROM student a JOIN grade b ON a.`GradeId`=b.`GradeID`
GROUP BY a.`GradeId`,sex ;
#
SELECT INSERT('12456',3,1,'1111');
#emp数据库
#最高薪水每个部门的人员名称
SELECT * FROM tb_emp t INNER JOIN(
SELECT deptno,MAX(sal)sal FROM tb_emp
GROUP BY deptno ) a
WHERE t.deptno=a.deptno AND t.sal=a.sal;
#列出所有员工及领导姓名
SELECT t.ename 员工,p.ename 领导 FROM tb_emp t
LEFT JOIN tb_emp p
ON p.empno=t.mgr;
#列出至少有5个员工的所有部门
SELECT dname FROM tb_emp a
JOIN tb_dept b ON a.deptno=b.deptno
GROUP BY a.deptno HAVING COUNT(dname)>5;
#列出薪金比SMITH多的所有员工信息
SELECT * FROM tb_emp
WHERE sal>(SELECT sal FROM tb_emp WHERE ename='SMITH');
#列出所有CLERK的姓名及其部门名称,部门人数
SELECT ename ,dname,c.ct FROM tb_emp a,tb_dept b,
(SELECT deptno,COUNT(1)ct FROM tb_emp GROUP BY deptno)c
WHERE a.deptno=b.deptno AND job='CLERK' AND c.deptno=b.deptno;
SELECT ename ,dname,c.ct FROM tb_emp a JOIN tb_dept b ON a.deptno=b.deptno
JOIN(SELECT deptno,COUNT(1)ct FROM tb_emp GROUP BY deptno)c
ON c.deptno=b.deptno
WHERE job='CLERK';
#列出最低薪资大于1500的各种工作,以及从事该工作的全部雇员人数
SELECT job,COUNT(1)FROM tb_emp
GROUP BY job HAVING MIN(sal)>1500;
#列出在部门SALES工作的员工姓名,假定不知道销售部门的部门编号
SELECT ename FROM tb_emp WHERE deptno IN(
SELECT FROM tb_dept WHERE dname='SALES');