Mysql----sql语句练习题(一)


以下这篇帖子,就当是sql语句练习,适合入门新手,练练这些sql语句,也有处于打牢数据库的基础。

前期的准备工作,给出三张表,student,course,sc,我们可以清楚的看到每张表的主键,以及表与表之间的字段联系

打开每张表,可以看到具体的字段信息:

 

以上就是三张表,至于怎么创建,有两种方法,要么你自己写sql语句自己创建,并插入一些数据,要么你就直接手动在表格里添加,然后点击Refresh

CREATE TABLE `student` (
   `Sno` char(10) NOT NULL,
   `Sname` varchar(20) NOT NULL,
   `Ssex` char(5) DEFAULT NULL,
   `Sage` tinyint(4) DEFAULT NULL,
   `Sdept` varchar(20) DEFAULT NULL,
   PRIMARY KEY (`Sno`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `course` (
   `Cno` char(10) NOT NULL,
   `Cname` varchar(20) NOT NULL,
   `Credit` tinyint(4) DEFAULT NULL,
   `Semester` tinyint(4) DEFAULT NULL,
   PRIMARY KEY (`Cno`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `sc` (
   `Sno` char(10) NOT NULL,
   `Cno` char(6) NOT NULL,
   `Grade` tinyint(4) DEFAULT NULL,
   PRIMARY KEY (`Sno`,`Cno`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

单表查询

一、带*号
  查询全体学生的详细记录

二、带计算、as列名
  查询全体学生的姓名以及出生年份

三、去重distinct
  查询学生的学号(去掉重复)

四、where条件查询
  1.比大小(> < >= !=等相关大小符号)
  ①查询计算机系所有学生的姓名
  ②查询所有年龄在20岁以下的学生姓名以及年龄
  ③查询考试成绩有不及格课程的学生的学号
  2.确定范围(between and)
  ①查询年龄在20~23岁的学生的姓名、所在系和年龄
  ②查询年龄不在20~23岁的学生的姓名、所在系和年龄
  ③对于日期类型的基数,也可以使用:select id ,type from titles where pubdate between '2014/7/17' and '2014/12/15'
  3.确定集合((常量1,常量2,常量3......))
  ①查询信息管理系、通信工程系和计算机系学生的姓名和性别
  ②查询信息管理系、通信工程系和计算机系三个系之外的其他系的学生的姓名和性别
  4.字符串匹配(like)
  ①查询姓'张'的学生的详细信息
  ②查询姓'张'、姓'李'、姓'刘'的学生的详细信息
  ③查询名字的第2个字为'小'或者'大'的学生的姓名和学号
  ④查询所有不姓'刘'的学生姓名
  ⑤在student表中,查询学号的最后一位不是2、3、5的学生的详细信息
  5.空值查询
  ①查询没有考试的学生的学号和相应的课程号
  ②查询所有已经考试了的学生的学号、课程号和考试成绩
  6.多重条件查询
  ①查询计算机系年龄20岁以下的学生和姓名
  ②查询计算机系和信息管理系学生中年龄在18~20的学生的学号、姓名、所在系和年龄

五、排序(desc降序 和 asc升序)
  ①将学生按照年龄升序排列
  ②查询选修了'C002'课程的学生的学号以及成绩,查询结果按照成绩降序排列
  ③查询全体学生的信息,查询结果按所在的系名升序排列,同一个系的学生按照年龄降序排列

六、聚合函数汇总数据(count sum avg max min等)
  ①统计学生总人数
  ②统计选了课程的学生人数
  ③统计学号为'0811101'的学生的考试总成绩
  ④统计'0831103'的学生的考试平均成绩
  ⑤查询'C001'课程考试成绩的最高分和最低分

七、分组(group by 和 having)
  1.group by
  ①统计每门课程的选课人数,列出课程号和选课人数
  ②统计每个学生的选课门数和平均成绩
  ③统计每个系的学生人数和平均年龄
  ④统计每个系的女生人数
  ⑤统计每个系的男生人数和女生人数以及男生的最大年龄和女生的最大年龄,结果按照系名升序排列

  2.HAVING
  ①查询选课门数超过3门的学生的学号和选课门数
  ②查询计算机系和信息管理系每个系的学生人数
  ③查询每个系年龄小于等于20的学生人数

 接下来,把所有最基础的单表查询的结果,放出来,供有需要的同学借鉴使用

 

-- 查询全体学生的详细记录
SELECT* FROM student

/*
二、带计算、as列名
*/
-- 查询全体学生的姓名以及出生年份
SELECT Sname AS 姓名,2020 - Sage AS 出生年份 FROM student

/*
三、去重distinct
*/
-- 查询学生的学号(去掉重复)
SELECT DISTINCT Sno FROM sc

/*
四、where条件查询
*/
-- 查询计算机系所有学生的姓名
SELECT Sname FROM student WHERE Sdept = '计算机系'

-- 查询所有年龄在20岁以下的学生姓名以及年龄
SELECT Sname,Sage FROM student WHERE Sage < 20

-- 查询考试成绩有不及格课程的学生的学号
SELECT DISTINCT Sno FROM sc WHERE grade < 60

-- 查询年龄在20~23岁的学生的姓名、所在系和年龄
SELECT Sname,Sdept,Sage FROM student WHERE Sage BETWEEN 20 AND 23

-- 查询年龄不在20~23岁的学生的姓名、所在系和年龄
SELECT Sname,Sdept,Sage FROM student WHERE Sage NOT BETWEEN 20 AND 23

-- 查询信息管理系、通信工程系和计算机系学生的姓名和性别
SELECT Sname,Ssex FROM student WHERE sdept IN ('信息管理系','通信工程系','计算机系')

-- 查询信息管理系、通信工程系和计算机系三个系之外的其他系的学生的姓名和性别
SELECT Sname,Ssex FROM student WHERE sdept NOT IN ('信息管理系','通信工程系','计算机系')

-- 查询姓'张'的学生的详细信息
SELECT * FROM student WHERE Sname LIKE '张%'

-- 查询姓'张'、姓'李'、姓'刘'的学生的详细信息
SELECT * FROM student WHERE Sname LIKE '[张李刘]%'

-- 查询名字的第2个字为'小'或者'大'的学生的姓名和学号
SELECT Sname,Sno FROM student WHERE Sname LIKE '_[小大]%'

-- 查询所有不姓'刘'的学生姓名
SELECT Sname FROM student  WHERE Sname NOT LIKE '刘%'

-- 在student表中,查询学号的最后一位不是2、3、5的学生的详细信息
SELECT* FROM student WHERE Sno LIKE '%[^235]'

-- 查询没有考试的学生的学号和相应的课程号
SELECT Sno,Cno FROM sc WHERE Grade IS NULL

-- 查询所有已经考试了的学生的学号、课程号和考试成绩
SELECT Sno,Cno FROM sc WHERE Grade IS NOT NULL

-- 查询计算机系年龄20岁以下的学生和姓名
SELECT Sname,Sage FROM student WHERE sdept IN ('计算机系') AND Sage < 20


-- 查询计算机系和信息管理系学生中年龄在18~20的学生的学号、姓名、所在系和年龄
SELECT Sno,Sname,Sdept,Sage FROM student WHERE sdept IN ('计算机系','信息管理系') AND Sage BETWEEN 18 AND 20

/*
五、排序(desc降序 和 asc升序)
*/

-- 如果没有指定升序还是降序,那么默认为升序asc
SELECT * FROM student ORDER BY Sage 

-- 以下是按年龄降序
SELECT * FROM student ORDER BY Sage DESC

-- 查询选修了'C002'课程的学生的学号以及成绩,查询结果按照成绩降序排
SELECT Sno,Grade FROM sc WHERE Cno = 'C002'ORDER BY Grade DESC

-- 查询全体学生的信息,查询结果按所在的系名升序排列,同一个系的学生按照年龄降序排列
-- 下面这种是错误写法
SELECT * FROM student 
  ORDER BY Sdept ASC  
  AND ORDER BY Sage DESC  (错误!!!)

-- 正确写法如下:
SELECT * FROM student ORDER BY Sdept ASC, Sage DESC 


/*
六、聚合函数汇总数据(count sum avg max min等) 
*/
-- 统计学生总人数
SELECT COUNT(*) AS 学生总人数 FROM student

-- 统计选了课程的学生人数
SELECT COUNT(DISTINCT Sno) AS 已选课程的学生人数 FROM sc  -- 这里要注意,因为一个学生可以选择多门课程,所以要去重

-- 统计学号为'0811101'的学生的考试总成绩
SELECT SUM(Grade) AS 总成绩 FROM sc WHERE Sno = '0811101'

-- 统计'0831103'的学生的考试平均成绩
SELECT AVG(Grade) AS 平均成绩 FROM sc WHERE Sno = '0831103'

-- 查询'C001'课程考试成绩的最高分和最低分
SELECT MAX(Grade) 最高分,MIN(Grade) 最低分 FROM sc WHERE Cno = 'C001'  -- 此时要不要AS 无所谓,要也行,不要也行


/*
七、分组(group by 和 having)
*/
-- 统计每门课程的选课人数,列出课程号和选课人数
SELECT COUNT(Sno) AS  选课人数,Cno AS 课程号 FROM sc GROUP BY Cno
SELECT COUNT(*) AS  选课人数,Cno AS 课程号 FROM sc GROUP BY Cno

-- 统计每个学生的选课门数和平均成绩
SELECT COUNT(*) AS 选课门数,AVG(Grade) AS 平均成绩,Sno AS 学号 FROM sc GROUP BY Sno

-- 统计每个系的学生人数和平均年龄
SELECT COUNT(*) 学生人数 ,AVG(Sage) AS 平均年龄, Sdept AS 院系 FROM student GROUP BY sdept

-- 统计每个系的女生人数
SELECT COUNT(*) 女生人数,sdept AS 院系 FROM student WHERE Ssex = '女' GROUP BY sdept

-- 统计每个系的男生人数和女生人数以及男生的最大年龄和女生的最大年龄,结果按照系名升序排列
SELECT Sdept, COUNT(*) 人数,Ssex,MAX(Sage) 最大年龄 FROM student GROUP BY Sdept,Ssex ORDER BY Sdept


-- 查询选课门数超过3门的学生的学号和选课门数
SELECT Sno,COUNT(*) 选课门数 FROM sc 
 GROUP BY Sno 
 HAVING COUNT(*) > 3

-- 查询计算机系和信息管理系每个系的学生人数
    -- 思路:先找出两个系的所有人数,再根据院系进行分组
SELECT Sdept, COUNT(*) 学生人数 FROM student 
  WHERE Sdept IN ('计算机系','信息管理系')
  GROUP BY Sdept     
 
  
-- 查询每个系年龄小于等于20的学生人数
SELECT Sdept,COUNT(*)学生人数 FROM student 
 WHERE Sage <= 20
 GROUP BY Sdept 

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM