You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
292 lines
10 KiB
292 lines
10 KiB
USE hutao;
|
|
|
|
CREATE TABLE IF NOT EXISTS
|
|
student_info
|
|
(
|
|
number INT PRIMARY KEY COMMENT '学生ID信息表的主键',
|
|
name VARCHAR(5) NOT NULL COMMENT '学生姓名',
|
|
sex ENUM('男', '女') COMMENT '学生性别',
|
|
id_number CHAR(18) COMMENT '身份证',
|
|
department VARCHAR(30) COMMENT '学院',
|
|
major VARCHAR(30) COMMENT '专业',
|
|
enrollment_time DATE COMMENT '入学时间',
|
|
UNIQUE KEY id_number (id_number)
|
|
) COMMENT '学生信息表';
|
|
|
|
CREATE TABLE IF NOT EXISTS
|
|
student_score
|
|
(
|
|
number INT COMMENT '学生ID',
|
|
subject VARCHAR(30) COMMENT '学科',
|
|
score INT NOT NULL COMMENT '成绩',
|
|
PRIMARY KEY (number, subject),
|
|
CONSTRAINT FOREIGN KEY (number) REFERENCES student_info(number)
|
|
) COMMENT '学生成绩表';
|
|
|
|
SHOW CREATE TABLE student_info;
|
|
|
|
INSERT INTO
|
|
student_info(number, name, sex, id_number, department, major, enrollment_time)
|
|
VALUES
|
|
(20210101, '狗哥', '男', '158177200301044792', '计算机学院', '计算机科学与工程', '2021-09-01'),
|
|
(20210102, '猫爷', '男', '151008200201178529', '计算机学院', '计算机科学与工程', '2021-09-01'),
|
|
(20210103, '艾希', '女', '17156320010116959X', '计算机学院', '软件工程', '2021-09-01'),
|
|
(20210104, '亚索', '男', '141992200201078600', '计算机学院', '计算机科学与工程', '2021-09-01'),
|
|
(20210105, '莫甘娜', '女', '181048200008156368', '航天学院', '飞行器设计', '2021-09-01'),
|
|
(20210106, '赵信', '男', '197995200201078445', '航天学院', '电子信息', '2021-09-01');
|
|
|
|
INSERT INTO
|
|
student_score(number, subject, score)
|
|
VALUES
|
|
(20210101, '计算机是怎样运行的', 78),
|
|
(20210101, 'MySQL是怎样运行的', 88),
|
|
(20210102, '计算机是怎样运行的', 100),
|
|
(20210102, 'MySQL是怎样运行的', 98),
|
|
(20210103, '计算机是怎样运行的', 59),
|
|
(20210103, 'MySQL是怎样运行的', 61),
|
|
(20210104, '计算机是怎样运行的', 55),
|
|
(20210104, 'MySQL是怎样运行的', 46);
|
|
|
|
|
|
USE hutao;
|
|
SELECT * FROm student_info;
|
|
SELECT * FROM student_score;
|
|
# 查询单列
|
|
SELECT student_info.number FROM student_info;
|
|
# 列的别名
|
|
SELECT number '学号' FROM student_info;
|
|
# 查询多列
|
|
SELECT number, name, id_number, major FROM student_info;
|
|
SELECT number '学号', name '姓名', id_number '身份证号', major '专业' FROM student_info;
|
|
# 查询去重
|
|
SELECT DISTINCT department FROM student_info;
|
|
SELECT DISTINCT department, major FROM student_info;
|
|
# 分页
|
|
# 查询前两条
|
|
SELECT * FROM student_info LIMIT 2;
|
|
# 查询两条,从5+1开始
|
|
SELECT * FROM student_info LIMIT 5, 2;
|
|
# 排序
|
|
SELECT student_info.number FROM student_info ORDER BY student_info.number ASC;
|
|
SELECT * FROM student_info ORDER BY student_info.number ASC;
|
|
SELECT * FROM student_info ORDER BY student_info.number DESC;
|
|
# 多列排序
|
|
SELECT * FROM student_score ORDER BY subject, score DESC;
|
|
|
|
# 简单查询
|
|
# 查id等于20210101的学生的所有成绩
|
|
SELECT * FROM student_score WHERE number = 20210101;
|
|
# 查看除了这个学生的其他的学生的成绩
|
|
SELECT * FROM student_score WHERE number != 20210101;
|
|
SELECT * FROM student_score WHERE number <> 20210101;
|
|
-- 查成绩及格
|
|
SELECT * FROM student_score WHERE score >= 60;
|
|
# 查成绩不及格
|
|
SELECT * FROM student_score WHERE score < 60;
|
|
# 查成绩在60到80之间的成绩
|
|
SELECT * FROM student_score WHERE score BETWEEN 60 AND 80;
|
|
# 查成绩不在60到80之间的成绩
|
|
SELECT * FROM student_score WHERE score NOT BETWEEN 60 AND 80;
|
|
|
|
-- 匹配查询
|
|
SELECT * FROM student_info WHERE major IN ('软件工程', '飞行器设计');
|
|
SELECT * FROM student_info WHERE major NOT IN ('软件工程', '飞行器设计');
|
|
|
|
-- NULL
|
|
SELECT * FROM student_info WHERE name IS NULL;
|
|
SELECT * FROM student_info WHERE name IS NOT NULL;
|
|
|
|
-- 多条件查询
|
|
-- AND
|
|
SELECT * FROM student_info WHERE sex = '男' AND department = '计算机学院';
|
|
-- OR
|
|
SELECT * FROM student_info WHERE sex = '男' OR department = '计算机学院';
|
|
-- 复杂条件搜索
|
|
-- sorce < 60 + subject = 'MySQL是怎样运行的'
|
|
-- source > 90
|
|
SELECT * FROM student_score WHERE score > 90 OR score < 60 AND student_score.subject = 'MySQL是怎样运行的';
|
|
-- source > 90 + sorce < 60
|
|
-- subject = 'MySQL是怎样运行的'
|
|
SELECT * FROM student_score WHERE (score > 90 OR score < 60) AND student_score.subject = 'MySQL是怎样运行的';
|
|
|
|
-- 通配符
|
|
SELECT * FROM student_info WHERE name LIKE '狗%';
|
|
SELECT * FROM student_info WHERE name LIKE '%甘%';
|
|
SELECT * FROM student_info WHERE name LIKE '狗__';
|
|
|
|
-- 转义通配符
|
|
SELECT * FROM student_info WHERE name LIKE '狗\__';
|
|
SELECT * FROM student_info WHERE name LIKE '狗\%_';
|
|
|
|
|
|
-- 表达式
|
|
-- 放在SELECT中
|
|
SELECT number, subject, score + 100 FROM student_score;
|
|
SELECT number, subject, score + 100 AS `score` FROM student_score;
|
|
-- ``用来装列名,''用来装普通字符串
|
|
SELECT name, '我是一个装饰', `sex`, 'sex' FROM student_info;
|
|
-- 不能用``将不是列明的内容装起来
|
|
SELECT name, `我是一个装饰` FROM student_info;
|
|
-- 计算器
|
|
SELECT 5 * 6 +128 -32;
|
|
|
|
-- 放在WHERE中
|
|
-- 假 查不出来数据
|
|
SELECT * FROM student_info WHERE 0;
|
|
SELECT * FROM student_info WHERE NULL;
|
|
SELECT * FROM student_info WHERE 2 - 2;
|
|
SELECT * FROM student_info WHERE 2 < 1;
|
|
-- 真 查出所有数据
|
|
SELECT * FROM student_info WHERE 2 > 1;
|
|
SELECT * FROM student_info WHERE 2 + 2;
|
|
SELECT * FROM student_info WHERE 2;
|
|
|
|
-- 表达式中的NULL
|
|
SELECT 1>NULL, 2-NULL;
|
|
SELECT NULL IS NULL;
|
|
|
|
-- 字符处理函数
|
|
-- LEFT
|
|
SELECT LEFT('abc123', 4); -- abc1
|
|
-- RIGHT
|
|
SELECT RIGHT('abc123',2); -- 23
|
|
-- LENGTH
|
|
SELECT LENGTH('何先生'); -- 9
|
|
-- LOWER
|
|
SELECT LOWER('ABCDEF'); -- abcdef
|
|
-- UPPER
|
|
SELECT UPPER('abcdef'); -- ABCDEF
|
|
-- LTRIM
|
|
SELECT LTRIM(' ABC'); -- 'ABC'
|
|
SELECT ' ABC'; -- ' ABC'
|
|
-- RTRIM
|
|
SELECT RTRIM(' ABC '); -- ' ABC'
|
|
-- TRIM
|
|
SELECT TRIM(' A B C '); -- 'A B C'
|
|
-- SUBSTRING
|
|
SELECT SUBSTRING('何先生abcdefg何先生', 2, 5); -- '先生abc'
|
|
-- CONCAT
|
|
SELECT CONCAT('a_', 'b', 'CD21', 'AA'); -- 'a_bCD21AA'
|
|
-- CHAR_LENGTH
|
|
SELECT CHAR_LENGTH('何先生abcdefg何先生'); -- 13
|
|
|
|
-- 和数据库结合使用
|
|
SELECT CONCAT('学号为', number, '的同学在《', subject, '》课程上的成绩是:', score) AS '成绩描述' FROM student_score;
|
|
|
|
-- 时间格式化
|
|
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i|%s 星期%w');
|
|
-- 2024年03月30日 06:07|31 星期6
|
|
|
|
-- 流程控制
|
|
SELECT
|
|
*,
|
|
CASE
|
|
WHEN score < 60 THEN '不及格'
|
|
WHEN score < 90 THEN '及格'
|
|
ELSE '优秀'
|
|
END AS '评价'
|
|
FROM
|
|
student_score;
|
|
SELECT
|
|
name, department, major,
|
|
CASE department
|
|
WHEN '计算机学院' THEN '一级学院'
|
|
WHEN '航天学院' THEN '二级学院'
|
|
ELSE '未设定'
|
|
END AS '学院类别'
|
|
FROM
|
|
student_info;
|
|
|
|
# 聚合函数、汇总函数
|
|
SELECT COUNT(number) AS '人数', MAX(student_score.score) AS '最高分', MIN(student_score.score) AS '最低分', AVG(student_score.score) AS '平均分', SUM(student_score.score) AS '总分' FROM student_score;
|
|
|
|
|
|
-- 分组查询
|
|
SELECT subject, COUNT(subject) AS '考试人数' FROM student_score GROUP BY subject;
|
|
|
|
-- 带有WHERE子句的分组查询
|
|
SELECT subject, COUNT(subject) AS '及格人数' FROM student_score WHERE score > 60 GROUP BY subject;
|
|
|
|
-- 作用于分组的过滤条件
|
|
SELECT subject, AVG(score) FROM student_score WHERE score > 60 GROUP BY subject HAVING MAX(score) > 90 AND AVG(score) > 80;
|
|
SELECT subject, AVG(score) FROM student_score GROUP BY subject HAVING MAX(score) > 90 AND AVG(score) > 70 AND subject != 'MySQL是怎样运行的';
|
|
SELECT subject, AVG(score) FROM student_score WHERE subject != 'MySQL是怎样运行的' GROUP BY subject HAVING MAX(score) > 90 AND AVG(score) > 70;
|
|
|
|
-- 分组排序
|
|
SELECT student_score.subject, AVG(student_score.score) FROM student_score GROUP BY student_score.subject ORDER BY AVG(score) DESC;
|
|
|
|
-- 多个分组列
|
|
SELECT department, major, COUNT(number) AS '人数' FROM student_info GROUP BY department, major;
|
|
|
|
-- 分组采用表达式
|
|
SELECT student_score.subject, COUNT(student_score.number) AS 人数 FROM student_score GROUP BY CONCAT('学科:', subject)
|
|
|
|
|
|
|
|
-- 普通连接 和内连接是等价的
|
|
SELECT * FROM student_info a, student_score b WHERE a.number = b.number;
|
|
-- 左外连接,以a表为基准查出所有
|
|
SELECT * FROM student_info a LEFT OUTER JOIN student_score b ON a.number = b.number;
|
|
-- 右外连接
|
|
SELECT * FROM student_info a RIGHT OUTER JOIN student_score b ON a.number = b.number;
|
|
|
|
|
|
-- 自连接,查看和狗哥专业相同的人员信息
|
|
SELECT * FROm student_info a JOIN student_info b ON a.major = b.major WHERE a.name = '狗哥';
|
|
|
|
|
|
-- 单表组合查询
|
|
|
|
SELECT name, student_info.department, student_info.major FROM student_info WHERE sex = '男' OR number > 20210101;
|
|
SELECT name, student_info.department, student_info.major FROM student_info WHERE sex = '男' UNION SELECT student_info.department, name, student_info.major FROM student_info WHERE number > 20210101;
|
|
|
|
|
|
-- 14章插入建表
|
|
|
|
CREATE table first_table(
|
|
first_column INT,
|
|
second_column VARCHAR(100)
|
|
);
|
|
|
|
-- 插入数据
|
|
-- 不写列明 默认按照建表的顺序 (每列必须明确写出值,可以用NULL替代)
|
|
INSERT INTO first_table VALUE (1, '哈哈');
|
|
-- 指定列名
|
|
INSERT INTO first_table(first_column, second_column) VALUE (2, '嘿嘿');
|
|
-- 可以调换列顺序
|
|
INSERT INTO first_table(second_column, first_column) VALUE ('嘿嘿嘿', 3);
|
|
|
|
|
|
-- 批量插入数据 VALUE => VALUES (VALUES也可以只插入一条数据)
|
|
INSERT INTO
|
|
first_table(second_column, first_column)
|
|
VALUE
|
|
('嘿哈', 5),
|
|
('嗯哼', 6),
|
|
('唉嘿', 7),
|
|
('嘻嘻', 8),
|
|
('呜呜呜', 9);
|
|
|
|
-- 插入其他表的数据
|
|
|
|
INSERT INTO first_table SELECT * FROM first_table LIMIT 4;
|
|
INSERT INTO first_table(first_column, second_column) SELECT first_column, second_column FROM first_table WHERE first_column = 3;
|
|
|
|
-- 删除记录
|
|
DELETE FROM first_table;
|
|
|
|
-- 创建存储函数
|
|
-- 设置分隔符
|
|
SET global log_bin_trust_function_creators = TRUE;
|
|
DELIMITER $
|
|
CREATE FUNCTION get_score_avg(subject_name VARCHAR(10))
|
|
RETURNS DOUBLE
|
|
BEGIN
|
|
RETURN (SELECT AVG(student_score.score) FROM student_score WHERE subject = subject_name);
|
|
END $
|
|
DELIMITER ;
|
|
|
|
|
|
SHOW FUNCTION STATUS ;
|
|
|
|
|
|
|