MySQL(一)基本查询
场景:学生信息系统,包括学生信息、教师信息、专业信息和选课信息。
建表语句 :
-- 学生信息表 DROP TABLE IF EXISTS Students; CREATE TABLE Students( Student_ID INT PRIMARY KEY NOT NULL, Student_Name NVARCHAR(50), Student_Age INT, Student_Sex INT, Student_City NVARCHAR(50), Student_MajorID INT ); -- 专业信息表 DROP TABLE IF EXISTS Majors; CREATE TABLE Majors( Major_ID INT PRIMARY KEY NOT NULL, Major_Name NVARCHAR(50) ); -- 课程信息表 DROP TABLE IF EXISTS Courses; CREATE TABLE Courses( Course_ID INT PRIMARY KEY NOT NULL, Course_Name NVARCHAR(50) ); -- 选课信息表 DROP TABLE IF EXISTS SC; CREATE TABLE SC( SC_ID INT PRIMARY KEY NOT NULL, SC_StudentID INT, SC_CourseID INT, SC_Score INT );
插入数据语句:
-- 插入学生信息 INSERT INTO Students (Student_ID,Student_Name,Student_Age,Student_Sex,Student_City,Student_MajorID) VALUES (40001,‘李煜‘,18,1,‘南京‘,1001); INSERT INTO Students (Student_ID,Student_Name,Student_Age,Student_Sex,Student_City,Student_MajorID) VALUES (40002,‘唐云‘,20,1,‘杭州‘,1002); INSERT INTO Students (Student_ID,Student_Name,Student_Age,Student_Sex,Student_City,Student_MajorID) VALUES (40003,‘吴广‘,19,1,‘南京‘,1001); INSERT INTO Students (Student_ID,Student_Name,Student_Age,Student_Sex,Student_City,Student_MajorID) VALUES (40004,‘刘云宇‘,18,1,‘武汉‘,1003); INSERT INTO Students (Student_ID,Student_Name,Student_Age,Student_Sex,Student_City,Student_MajorID) VALUES (40005,‘王梦琦‘,17,0,‘北京‘,1004);
-- 插入专业信息 INSERT INTO Majors (Major_ID,Major_Name) VALUE(1001,‘软件工程‘); INSERT INTO Majors (Major_ID,Major_Name) VALUE(1002,‘土木工程‘); INSERT INTO Majors (Major_ID,Major_Name) VALUE(1003,‘信息安全‘); INSERT INTO Majors (Major_ID,Major_Name) VALUE(1004,‘工商管理‘);
-- 插入课程信息 INSERT INTO Courses (Course_ID,Course_Name) VALUE (1001,‘高等数学‘); INSERT INTO Courses (Course_ID,Course_Name) VALUE (1002,‘大学英语‘); INSERT INTO Courses (Course_ID,Course_Name) VALUE (1003,‘数据结构‘); INSERT INTO Courses (Course_ID,Course_Name) VALUE (1004,‘结构力学‘); INSERT INTO Courses (Course_ID,Course_Name) VALUE (1005,‘日语‘);
-- 插入选课信息 INSERT INTO SC (SC_ID,SC_StudentID,SC_CourseID,SC_Score) VALUE(100001,40001,1001,2); INSERT INTO SC (SC_ID,SC_StudentID,SC_CourseID,SC_Score) VALUE(100002,40001,1002,3); INSERT INTO SC (SC_ID,SC_StudentID,SC_CourseID,SC_Score) VALUE(100003,40002,1001,2); INSERT INTO SC (SC_ID,SC_StudentID,SC_CourseID,SC_Score) VALUE(100004,40003,1003,3); INSERT INTO SC (SC_ID,SC_StudentID,SC_CourseID,SC_Score) VALUE(100005,40004,1004,2);
1.基础查询
作用:查询某数据表中的某些数据列的数据
语法:
SELECT 列名1,列名2,列名N FROM 表名
实例:
1.查询学生信息表中的ID,年龄,性别。
SELECT Student_ID,Student_Name,Student_Sex FROM Students;
2.条件查询
作用:
查询某数据表中的某些数据列的数据
语法:
SELECT 列名1,列名2,列名N FROM 表名 WHERE 列名 运算符 值
主要运算符
运算符 | 描述 |
= | 等于 |
<> 或 != | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN......AND...... | 在某个范围内 |
IS NULL | 为NULL |
AND | 并且 |
OR | 或者 |
IN | 是 |
NOT | 非 |
LIKE | 模糊查询 |
REGEXP | 正则表达式 |
主要通配符
通配符 | 描述 |
_ | 匹配单个字符 |
% | 匹配任意个字符 |
. | 匹配任意单个字符 |
[] | 匹配[]中的任意一个字符 |
* | 匹配零个或多个在它前面的东西 |
^ | 以什么开始 |
$ | 以什么结尾 |
实例:
1.查询学生信息表中年龄为18的学生信息。
SELECT*FROM Students WHERE Student_Age = 18;
2.查询学生信息表中年龄不为18的学生信息。
SELECT*FROM Students WHERE Student_Age <> 18;
3.查询学生信息表中年龄小于18的学生信息。
SELECT*FROM Students WHERE Student_Age < 18;
4.查询学生信息表中年龄小于等于18的学生信息。
SELECT*FROM Students WHERE Student_Age <= 18;
5.查询学生信息表中年龄大于18的学生信息。
SELECT*FROM Students WHERE Student_Age > 18;
6.查询学生信息表中年龄大于等于18的学生信息。
SELECT*FROM Students WHERE Student_Age >=18;
7.查询学生信息表中年龄17-19的学生信息。
SELECT*FROM Students WHERE Student_Age BETWEEN 17 and 19;
8.查询学生信息表中姓名为null的学生ID
SELECT Student_ID FROM Students WHERE Student_Name IS NULL;
9.查询来自于南京并且年龄为19的学生信息
SELECT * FROM Students WHERE Student_City = ‘南京‘ AND Student_Age = 19;
10.查询来自于南京或者武汉的学生信息
SELECT * FROM Students WHERE Student_City =‘南京‘ OR Student_City =‘武汉‘;
SELECT * FROM Students WHERE Student_City IN(‘南京‘,‘武汉‘);
11.查询姓名中不含有云的学生信息
SELECT * FROM Students WHERE Student_Name NOT LIKE‘%云%‘;
12.查询姓唐的同学信息
SELECT * FROM Students WHERE Student_Name REGEXP ‘^唐‘
3.ORDER BY
作用:对需要查询后的结果集进行排序
标识 | 含义 | 说明 |
ASC | 升序 | 默认 |
DESC | 倒序 |
实例:
1.查询学生信息表中的信息表并且按照年龄升序排列 如果年龄相同则按照ID降序排列
SELECT * FROM Students ORDER BY Student_Age,Student_ID DESC;
4.AS
作用:为表名或者列名指定别名
实例:
1.将结果列改为指定的名称
SELECT Student_Name AS ‘姓名‘,Student_Sex AS ‘性别‘,Student_Age AS‘年龄‘ FROM Students
2.使用表别名来查询李煜的选课信息
SELECT S.Student_ID,S.Student_Name,C.Course_Name,SC_Score FROM (SELECT Student_ID,Student_Name FROM Students WHERE Student_Name = ‘李煜‘) AS S LEFT JOIN SC ON S.Student_ID = SC_StudentID LEFT JOIN Courses AS C ON SC_CourseID = C.Course_ID
5.DISTINCT
作用:查询结果去除重复的
语法:
-- 查重依据为 DISTINCT后的所有列名 SELECT DISTINCT 列名 FROM 表名 -- 查重依据为 GROUP BY后的所有列名 SELECT DISTINCT 列名 FROM 表名 GROUP BY 列名
实例:
1.查询学生表中的姓名和年龄并去除重复的
SELECT DISTINCT Student_name,Student_age FROM Students
2.查询学生表中的姓名和年龄并去除年龄重复的
SELECT DISTINCT Student_name,Student_age FROM Students GROUP BY Student_Age
6.GROUP BY
作用:根据指定的一个列或多个列对查询结果进行分组
实例:
1.查询专业分布情况
SELECT Student_MajorID,COUNT(Student_ID) FROM Students GROUP BY Student_MajorID
2.删除重复的学生信息,并保留最新的那条
-- 先插入两条重复的数据 INSERT INTO Students (Student_ID,Student_Name,Student_Age,Student_Sex,Student_City,Student_MajorID) VALUES (40007,‘沈鹏‘,17,0,‘大理‘,1004); INSERT INTO Students (Student_ID,Student_Name,Student_Age,Student_Sex,Student_City,Student_MajorID) VALUES (40008,‘沈鹏‘,17,0,‘大理‘,1004);
DELETE FROM Students WHERE Student_ID NOT IN (SELECT * FROM (SELECT MAX(Student_ID) FROM Students GROUP BY Student_Name,Student_Age,Student_Sex,Student_City,Student_MajorID)AS S)
7.LIMIT
作用:LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数
语法:
-- 当LIMIT 后面的参数只有一个时为条数,而默认偏移量为0 SELECT 列名 FROM 表名 LIMIT 偏移量,条数
实例:
1.查询学生信息表中年龄最大的三位同学的信息
SELECT * FROM Students ORDER BY Student_Age DESC LIMIT 3
2.查询年龄第二到第四的学生信息
SELECT * FROM Students ORDER BY Student_Age DESC LIMIT 1,4
8.HAVING
作用:having字句可以让我们筛选成组后的各种数据,一般而言就是可以在条件里面用聚组函数函数。
语法:
SELECT 列名 FROM 表名 GROUP BY 列名 HAVING 聚合函数 运算符 值
实例:
查询平均年龄大于18的专业ID和人数
SELECT Student_MajorID,COUNT(Student_ID)FROM Students GROUP BY Student_MajorID HAVING AVG(Student_Age) > 18
9.CASE WHEN
作用:用于计算条件列表并返回多个可能结果表达式之一
语法:
-- 表达式语法 CASE 列名 WHEN 值 THEN 值 [ ...n ] ELSE 值 END -- 搜索式语法 CASE WHEN 布尔表达式 THEN 值 [ ...n ] ELSE 值 END
实例:
查询男性年龄大于18女性大于16的学生信息
SELECT * FROM Students WHERE CASE Student_Sex WHEN 1 THEN Student_Age>=19 WHEN 0 THEN Student_Age >=16 END
分别统计男性女性中的成年未成年的人数
SELECT CASE Student_Sex WHEN 0 THEN ‘女‘ WHEN 1 THEN ‘男‘ END AS ‘性别‘, SUM(CASE WHEN Student_Age >=18 THEN 1 ELSE 0 END) AS‘成年‘, SUM(CASE WHEN Student_Age <18 THEN 1 ELSE 0 END) AS‘未成年‘ FROM Students GROUP BY Student_Sex
原文地址:https://www.cnblogs.com/calpo/p/9430195.html