【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. 向表中插入数据](#2. 向表中插入数据)

3.删除整个数据表

4.删除表中全部数据

5.查询表中相关信息

①limit用法

②Where用法

[③order by语法](#③order by语法)

④通配符用法

[⑤between and用法](#⑤between and用法)

⑥avg、sum、max、min、count、round等用法

[⑦group by用法](#⑦group by用法)

⑧Having用法

[注意:group by分组后不能用where进行筛选了,得用having进行筛选!](#注意:group by分组后不能用where进行筛选了,得用having进行筛选!)

⑨DISTINCT用法

[⑩UPDATE SET的用法](#⑩UPDATE SET的用法)

[⑪Left join的用法](#⑪Left join的用法)

[⑫Inner left的用法](#⑫Inner left的用法)

[6.left join 和inner join的区别](#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 来连接 studentsclub 表。

⑫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 JOININNER JOIN 是 SQL 中最常用的两种表连接方式(JOIN),它们用于将两个或多个表根据某个关联条件合并在一起。但它们在行为和结果上有着本质的区别。

Inner join(内连接)

  • 只返回两个表中"匹配"的行
  • 如果左表某行在右表中没有匹配的行,则不返回该行
  • 相当于取两个表的交集

LEFT JOIN(左连接 / 左外连接)

  • 返回左表中的所有行
  • 如果右表中没有匹配的行,则用 NULL 填充右表的字段
  • 不管有没有匹配,左表数据都会保留
相关推荐
Estar.Lee24 分钟前
MySQL中外键约束详解 外键在表关系维护中的作用
运维·数据库·mysql·api·免费api
灯琰132 分钟前
五款MySQL 可视化客户端软件
数据库·mysql
两袖清风99832 分钟前
【MySQL】三大范式
数据库·mysql
Wooden-Flute2 小时前
八、数据库恢复技术
服务器·数据库·oracle
南棱笑笑生2 小时前
20250611在全志H3平台的Nano Pi NEO CORE开发板上运行Ubuntu Core16.04时让4G模块EC200A-CN使用AT命令拨号上网
linux·数据库·ubuntu
青春之我_XP3 小时前
【基于阿里云搭建数据仓库(离线)】使用UDTF时出现报错“FlatEventUDTF cannot be resolved”
数据仓库·sql·阿里云·云计算·dataworks·maxcompute
文牧之3 小时前
PostgreSQL 的扩展pg_surgery
运维·数据库·postgresql
眠修4 小时前
MongoDB 数据库应用
数据库·mongodb
wh_xia_jun4 小时前
mybatis xml 配置中,jdbcType=VARCHAR 的作用
数据库·oracle·tomcat