【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。
链接如下:
sqliteviz
注意:
在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到SQL语法是否能正确地执行,顺序如下:
SELECT(读取)——FROM(来源)——WHERE(条件)——GROUP BY(分组)——HAVING(条件)——ORDER BY(顺序)——LIMIT(条数限制)
比如:order by要排在limit之前
group by必须排在having之前,因为having是用来筛选分组地结果
目录
1.创建数据库表
2. 向表中插入数据
3.删除整个数据表
4.删除表中全部数据
5.查询表中相关信息
①limit用法
②Where用法
③order by语法
④通配符用法
⑤between and用法
⑥avg、sum、max、min、count、round等用法
⑦group by用法
⑧Having用法
注意:group by分组后不能用where进行筛选了,得用having进行筛选!
⑨DISTINCT用法
⑩UPDATE SET的用法
⑪Left join的用法
⑫Inner left的用法
6.left join 和inner join的区别
1.创建数据库表
CREATE TABLE students (student_id INT PRIMARY KEY, -- 学号(主键)name VARCHAR(50), -- 姓名class VARCHAR(50), -- 班级score DECIMAL(5,2), -- 成绩(百分制)club_id INT -- 社团编号
);
其中
CREATE TABLE students ( ... );
- 创建一个名为
students
的新表。 - 表中包含多个字段(列),括号内定义这些字段。
student_id INT PRIMARY KEY
- 字段名:
student_id
- 类型:
INT
(整数) - 约束:
PRIMARY KEY
- 表示该字段是这张表的主键,唯一标识每一条记录。
- 主键不能重复,也不能为 NULL。
name VARCHAR(50)
- 字段名:
name
- 类型:
VARCHAR(50)
(可变长度字符串,最大长度为 50 个字符)
class VARCHAR(50)
- 字段名:
class
- 类型:
VARCHAR(50)
,表示学生所属班级名称。
score DECIMAL(5,2)
- 字段名:
score
- 类型:
DECIMAL(5,2)
,表示精度为 5 位、小数点后保留 2 位的十进制数。- 最大值可以是
999.99
- 最大值可以是
club_id INT
- 字段名:
club_id
- 类型:
INT
,表示学生所加入社团的编号。
2. 向表中插入数据
INSERT INTO students (student_id, name, class, score, club_id)
VALUES(1001, '张三', '高一(1)班', 92, 101),(1002, '李四', '高一(2)班', 78, 103),(1003, '王五', '高一(1)班', 58, 102),(1004, '赵六', '高一(3)班', 98, 101),(1005, '钱七', '高一(2)班', 89, NULL),(1006, '孙八', '高一(3)班', 84, 103),(1007, '周九', '高一(1)班', 86,102),(1008, '吴十', '高一(2)班', 94,104),(1009, '郑十一', '高一(3)班', 68,103),(1010, '王十二', '高一(1)班', 72,101),(1011, '陈十三', '高一(2)班', 84,102),(1012, '刘十四', '高一(3)班', 89,103),(1013, '杨十五', '高一(1)班', 91,101),(1014, '黄十六', '高一(2)班', 92,104),(1015, '徐十七', '高一(3)班', 52,103),(1016, '何十八', '高一(1)班',85,NULL),(1017, '吕十九', '高一(2)班', 76,102),(1018, '施二十', '高一(3)班', 64,101),(1019, '沈二十一', '高一(1)班', 100,101),(1020, '朱二十二', '高一(2)班',99,102);
3.删除整个数据表
DROP TABLE students;
4.删除表中全部数据
DELETE FROM students; 或者
DELETE
FROM students
where club_id=104;
5.查询表中相关信息
SELECT * FROM "students";
SELECT 姓名,班级,成绩 FROM "students";
①limit用法
SELECT * FROM "students" limit 5; --显示前5行数据
SELECT * FROM "students" limit 5 OFFSET 5; --跳过前5行,接着显示后5行
SELECT * FROM "students" limit 5 OFFSET 10; --第10行后边的5行,即跳过前10行,显示后边的5行
②Where用法
SELECT * from students where 学号 = 1001;
SELECT * from students where 学号 <> 1001; 学号不等于1001的其它数据
SELECT * from students where 班级 = '高一(1)班';
③order by语法
SELECT * from students where 班级 <> '高一(2)班' ORDER BY 班级,成绩 DESC;--降序按照班级升序、成绩降序排列
④通配符用法
SELECT * from students where 姓名 LIKE '张%'--%多个字元
--LIKE '张%':表示以“张”开头,后面可以有任意多个字符(包括 0 个)。
--% 是通配符,代表 任意数量的字符(包括没有字符)。SELECT * from students where 姓名 LIKE '张_'--_一个字源
查询姓名为“张”姓且全名只有两个字的学生
_ 是通配符,代表 一个且仅有一个字符。
⑤between and用法
SELECT * from students where 成绩>=80 and 成绩<=90;
SELECT * from students where 成绩 BETWEEN 80 AND 90;SELECT * from students where 成绩 BETWEEN 80 AND 90 AND 班级='高一(2)班';SELECT * from students where 成绩 BETWEEN 80 AND 90 AND (班级='高一(2)班' or 班级='高一(1)班');SELECT * from students where 成绩 BETWEEN 80 AND 90 AND (班级 in ('高一(2)班','高一(1)班'));
⑥avg、sum、max、min、count、round等用法
SELECT AVG(成绩),SUM(成绩),MAX(成绩),MIN(成绩),COUNT(成绩) FROM students;
SELECT AVG(成绩) AS 成绩平均,MAX(成绩) as 最高分 FROM students;
SELECT ROUNd(AVG(成绩),1) AS 成绩平均,MAX(成绩) as 最高分 FROM students; --四舍五入保留一位小数
⑦group by用法
SELECT 班级,ROUNd(AVG(成绩),1) AS 成绩平均,MAX(成绩) as 最高分 FROM students GROUP BY 班级 ORDER BY 成绩平均 DESC;
⑧Having用法
SELECT 班级,ROUNd(AVG(成绩),1) AS 成绩平均 FROM students GROUP BY 班级 HAVING 成绩平均>=80 ORDER BY 成绩平均 DESC;
注意:group by分组后不能用where进行筛选了,得用having进行筛选!
⑨DISTINCT用法
SELECT DISTINCT club_id FROM students;
作用: 显示所有出现过的 club_id 值(包括 NULL)。
DISTINCT 表示去重。SELECT COUNT(DISTINCT club_id) FROM students;
作用: 统计学生来自多少个不同的社团。
注意: NULL 值不会被计入统计结果。SELECT DISTINCT club_id FROM students WHere club_id is not null order by club_id;
查询所有非空的不同社团编号,并排序:
⑩UPDATE SET的用法
更新数据,补充缺失值,删除行
UPDATE students
set club_id=104
where student_id=1005;将 student_id = 1005 的学生的 club_id 更新为 104
这个操作通常用于补充缺失值(如之前该字段为 NULL)
⑪Left join的用法
SELECT s.name AS 姓名,s.club_id AS 社团编号,c.club_name AS 社团名称
FROM students s
LEFT JOIN club c ON s.club_id = c.club_id
WHERE s.class = '高一(1)班';
查询“高一(1)班”学生的姓名、社团编号和对应的社团名称,并使用了 LEFT JOIN
来连接 students
和 club
表。
⑫Inner left的用法
SELECT s.name AS 姓名,s.club_id AS 社团编号,c.club_name AS 社团名称
FROM students s
INNER JOIN club c ON s.club_id = c.club_id
WHERE s.class = '高一(1)班';
6.left join 和inner join的区别
LEFT JOIN
和 INNER JOIN
是 SQL 中最常用的两种表连接方式(JOIN),它们用于将两个或多个表根据某个关联条件合并在一起。但它们在行为和结果上有着本质的区别。
Inner join(内连接)
- 只返回两个表中“匹配”的行
- 如果左表某行在右表中没有匹配的行,则不返回该行
- 相当于取两个表的交集
LEFT JOIN(左连接 / 左外连接)
- 返回左表中的所有行
- 如果右表中没有匹配的行,则用
NULL
填充右表的字段 - 不管有没有匹配,左表数据都会保留