当前位置: 首页 > news >正文

基础 - SQL命令速查

引言

本篇文档主要是自己对SQL命令做的总结,方便后续快速查询命令。

前提准备

快速启动MySQL可以参照这篇:Docker中安装数据库 - mysql、sqlserver、oracle

下面提供本篇文档对照的数据库表数据:

CREATE DATABASE test;
USE test;CREATE TABLE class (class_id INT AUTO_INCREMENT,                -- 班级ID(自增)class_name VARCHAR(50) NOT NULL,            -- 班级名称grade INT NOT NULL,                         -- 年级(1-12)primary key(class_id)                       -- 设置主键
);CREATE TABLE students (student_id INT PRIMARY KEY AUTO_INCREMENT,  -- 学生ID(主键,自增)student_name VARCHAR(50) NOT NULL,          -- 学生姓名(不允许为空)student_card_id INT UNIQUE,                 -- 学生证号(唯一)gender CHAR(1),                             -- 性别(M/F)birth_date DATE,                            -- 出生日期class_id INT,                               -- 班级ID(外键)score INT,                                  -- 分数address VARCHAR(200),                       -- 所属地域is_active BOOLEAN DEFAULT TRUE              -- 是否在校(默认为TRUE)
);-- 插入数据
INSERT INTO class (class_name, grade) VALUES ('一年级一班', 1);
INSERT INTO class (class_name, grade) VALUES ('一年级二班', 1), ('二年级一班', 2), ('三年级一班', 3);INSERT INTO students (student_name, student_card_id, gender, birth_date, class_id, score, address) VALUES ('张三', 20250001, 'M', '2018-11-01', 1, 80, '北京'),('李四', 20250002, 'M', '2018-11-01', 1, 91, '深圳'),('王五', 20250003, 'M', '2018-08-19', 1, 62, '上海'),('刘刘刘', 20250004, 'M', '2017-11-10', 3, 90, '上海'),('刘娜', 20250005, 'F', '2018-01-03', 1, 100, '北京'),('周周', 20250006, 'F', '2018-07-19', 1, 90, '上海'),('刘翔', 20250007, 'M', '2018-02-28', 2, 85, '北京'),('许三多', 20250008, 'M', '2017-05-23', 1, 78, '北京');

基本命令

数据查询语言(DQL)

SELECT

SELECT * FROM students; -- 查看学生表所有数据
SELECT * FROM students WHERE score > 80; -- 查看分数大于80的学生信息SELECT DISTINCT address FROM students; -- 去重查看学生所在的地域
SELECT student_name, student_card_id info FROM students; -- 查看学生表中学生的姓名和学生证号,学生证号以info别名展示
SELECT student_name, student_card_id, score FROM students WHERE score >= 80 AND score <= 90; -- 查看分数大于等于80小于等于 90 的学生姓名、学生证号及分数
SELECT student_name, student_card_id, score FROM students WHERE score BETWEEN 80 AND 90; -- 完全等同于上一句,查看分数大于等于80 小于等于90的学生姓名及学生证号
-- 补充说明 BETWEEN min AND max 等同于 min <= expr AND expr <= max
SELECT * FROM students WHERE (score < 80 OR score > 90) AND gender = 'M'; -- 查看分数大于80小于90的男学生信息
SELECT student_name FROM students WHERE student_name LIKE '刘%'; -- 查看姓刘的所有学生姓名
SELECT * FROM students WHERE MONTH(birth_date) IN (7,8); -- 查看出生日期在7和8月的学生信息
-- 补充说明对 DATE 类型的数据操作SELECT student_name, gender, score FROM students ORDER BY score; -- 按照分数从小到大查询学生姓名、性别及分数(默认升序,即ASC)
SELECT student_name, gender, score FROM students ORDER BY score DESC; -- 按照分数从大到小查询学生姓名、性别及分数
SELECT student_name, gender, score FROM students ORDER BY score DESC, gender; -- 先按照score降序,如果分数相同,则按照gender升序查询
SELECT student_name, gender, score FROM students WHERE class_id = 1 ORDER BY score DESC; -- 按照分数从小到大查询class_id为1的学生姓名、性别及分数(ORDER BY子句要放到WHERE子句后面)SELECT student_id, student_name, score FROM students LIMIT 3 OFFSET 0; -- 查询前3条学生id、学生姓名和分数
-- LIMIT 3 OFFSET 0,从0开始查询前3条记录(0,1,2);可以写为 LIMIT 3; 则默认 OFFSET 为0
SELECT student_id, student_name, score FROM students ORDER BY score DESC LIMIT 3 OFFSET 3; -- 查询分数从高到低第4、5、6条学生id、学生姓名和分数。
-- LIMIT 3 OFFSET 3,从3开始查询3-6条数据(3,4,5)SELECT COUNT(*) boys FROM students WHERE gender = 'M'; -- 查询男学生的数量
SELECT AVG(score) average FROM students WHERE gender = 'F'; -- 查询女学生的平均分
SELECT SUM(score) FROM students; -- 查询全部学生分数总和
SELECT MAX(score) highest FROM students; -- 查询学生中的最高分
SELECT MIN(score) FROM students WHERE gender = 'M'; -- 查询男学生中的最低分
-- 聚合查询的WHERE条件没有匹配到任何行的情况下,COUNT()会返回0,SUM()、AVG()、MAX()和MIN()会返回NULLSELECT class_id, COUNT(*) num FROM students GROUP BY class_id; -- 查询每个班级的学生数量
SELECT class_id, gender, AVG(score) AS `avg` FROM students GROUP BY class_id, gender; -- 查询每个班级中男生和女生的平均分
SELECT class_id, gender, AVG(score) AS avg_score FROM students GROUP BY class_id, gender HAVING avg_score > 80; -- 查询每个班级中男生和女生的大于80的平均分
-- HAVING 子句可以筛选分组后的各组数据
-- 当在一个SQL查询中同时使用 WHERE子句, GROUP BY子句和 HAVING子句时,其顺序是WHERE、GROUP BY、HAVING
-- WHERE与 HAVING子句的根本区别在于作用对象不同:WHERE句作用于基本表或视图,从中选择满足条件的元组;HAVING子句作用于组,选择满足条件的组,必须用在GROUP BY子句之后,GROUP BY子句可没有 HAVING子句SELECT * FROM students WHERE class_id IN (SELECT class_id FROM class WHERE grade = 1 ); -- 查询一年级学生信息SELECT * FROM students, class; -- 笛卡尔查询(不具备匹配性)
-- 返回的结果中列数是表1表2列数之和,行数是表1表2行数之积
SELECT s.student_id sid, s.student_name, c.class_id cid, c.class_name cname FROM students s, class c;  -- 查询学生id、学生名称、班级、班级名称(不具备匹配性)
-- 给表设置别名进行查询
SELECT s.student_name sname, s.score, c.class_name cname FROM students s, class c WHERE s.gender = 'M' AND c.class_id = 1; -- 查询class_id为1的男学生id、分数、班级名称-- JOIN查询需要先确定主表,然后把另一个表的数据“附加”到结果集上
SELECT s.student_id, s.student_name, s.class_id, c.class_name, s.gender, s.score FROM students s INNER JOIN class c ON s.class_id = c.class_id; 
-- 内连接,只返回两个表中满足连接条件的匹配行SELECT s.student_id, s.student_name, s.class_id, c.class_name, s.gender, s.score FROM students s LEFT OUTER JOIN class c ON s.class_id = c.class_id;
-- LEFT OUTER JOIN则返回左表都存在的行SELECT s.student_id, s.student_name, s.class_id, c.class_name, s.gender, s.score FROM students s RIGHT OUTER JOIN class c ON s.class_id = c.class_id;
-- RIGHT OUTER JOIN返回右表都存在的行

数据操作语言(DML)

INSERT UPDATE DELETE

INSERT INTO students (student_name, student_card_id, gender, birth_date, class_id, score, address) VALUES ('陆一', 20250009, 'M', '2018-12-31', 1, 80, '上海');
UPDATE students SET score=60 WHERE student_card_id = '20250009';
-- UPDATE语句可以没有WHERE条件,这时 ⚠️ 整个表的所有记录都会更新
DELETE FROM students WHERE student_card_id = '20250009';
-- DELETE语句可以没有WHERE条件,这时 ⚠️ DELETE语句会删除整个表的数据

数据定义语言(DDL)

CREATE ALTER DROP

-- DDL 只包含 CREATE ALTER 和 DROP。下方部分命令并不属于DDL,放在一起展示只是方便整体查看,
SHOW DATABASES; -- 展示数据库列表(不属于DDL)
USE DATABASES; -- 对数据库进行操作时,要首先将其切换为当前数据库(不属于DDL)
CREATE DATABASE test; -- 创建数据库
DROP DATABASE test; -- 删除数据库-- 创建数据表见「前提准备」
SHOW TABLES; -- 显示所有表(不属于DDL)
DESC students; -- 查看表结构(不属于DDL)
SHOW CREATE TABLE students; -- 查看建表语句(不属于DDL)
DROP TABLE students; -- 删除表
TRUNCATE TABLE students; -- 清除表数据
ALTER TABLE students ADD COLUMN birth VARCHAR(10) NOT NULL; -- 为表增加列
ALTER TABLE students CHANGE COLUMN birth birthday VARCHAR(20) NOT NULL; -- 为表修改列字段
ALTER TABLE students DROP COLUMN birthday; -- 为表删除列

习题

看了几个 LeetCode 的数据库相关题目 😭,作为习题案例补充在下方吧。描述转化成「使用当前文档提供的前提准备中的数据

175 组合两个表

问题:查询 class 表中每个班级的名称、年级、学生姓名以及学生证号。如果 class_id 的地址不在 students 表中,则报告为 null 。以 任意顺序 返回结果表。

SELECT c.class_name, c.grade, s.student_name, s.student_card_id FROM class c LEFT JOIN students s ON c.class_id = s.class_id;

176 第二高的分数

查询并返回 students 表中第二高的 不同 分数 。如果不存在第二高的分数,查询应该返回 null(Pandas 则返回 None)

解析:SELECT DISTINCT score FROM students ORDER BY score DESC LIMIT 1 OFFSET 1 去重查询出了第二高的分数,但是默认情况下,当不存在第二高分数时,结果是空的,而非 null 。子查询返回 0 行,在外部加 SELECT可以就将其转换为NULL

知识点:SQL 标准规定: 标量子查询 (即返回单个值的子查询)必须返回 恰好一行一列 。如果子查询返回多行或零行,会报错或返回 NULL

SELECT (SELECT DISTINCT score FROM students ORDER BY score DESC LIMIT 1 OFFSET 1) AS SecondHighestScore;
-- SELECT (SELECT DISTINCT score FROM students ORDER BY score DESC LIMIT 1, 1) AS SecondHighestScore;

177 第n高的分数

查询 students 表中第 n 高的 不同 分数。如果少于 n 个不同分数,查询结果应该为 null

解析:查询命令同176。有参数n,则需要自定义函数,根据传参n来实现查询

知识点:LIMITOFFSET必须是整数常量或变量 ,而不能是列表达式(如 N-1)或算术运算RETURN 语句期望的是一个 ,而不是一个查询结果集

CREATE FUNCTION getNthHighestScore(N INT) RETURNS INT
BEGIN
DECLARE M INT; SET M = N-1; RETURN (SELECT DISTINCT score FROM students ORDER BY score DESC LIMIT 1 OFFSET M);
END

178 分数排名

查询分数的排名。要求:分数按从高到低排列。如果两个分数相等,那么两个分数的排名相同。在排名相同的分数后,排名数应该是下一个连续的整数,即排名之间不应该有空缺的数字。

知识点:DENSE_RANK() 窗口函数:相同值同排名,且后续排名连续;RANK():相同值同排名,且后续排名不连续

-- 方法一:DENSE_RANK() 窗口函数
SELECTS.score,DENSE_RANK() OVER (ORDER BYS.score DESC) AS 'rank'
FROMScores S;-- 方法二:对于取出的每一行计算有多少数大于等于当前行分数的数量作为rank。例如,当前分数是90,有100,91,90,90,那么去重后即rank为3
SELECTS1.score,(SELECTCOUNT(DISTINCT S2.score)FROMstudents S2WHERES2.score >= S1.score) AS 'rank'
FROMstudents S1
ORDER BYS1.score DESC;

181 超过小组长分数的学生

-- 前提:因为原表格中没相关字段,所以可以在原表格中加一个字段 小组长,如下:
-- ALTER TABLE students ADD COLUMN managerId INT DEFAULT NULL;
-- 准备数据如下,managerId 需按照实际情况
-- UPDATE students SET managerId = 42 WHERE student_card_id = 20250001; UPDATE students SET managerId = 48 WHERE student_card_id = 20250005;-- 2种方法查询
SELECT s1.student_name student FROM students s1 INNER JOIN students s2 ON s1.managerId = s2.student_id WHERE s1.score > s2.score;
SELECT s1.student_name student FROM students s1, students s2 WHERE s1.score > s2.score AND s1.managerId = s2.student_id;
http://www.dtcms.com/a/490668.html

相关文章:

  • logo图片素材大全sem和seo都包括什么
  • 把 AI“缝”进布里:生成式编织神经网络让布料自带摄像头
  • 岳阳建网站长沙网站优化价格
  • [Sora] 分布式训练 | 并行化策略 | `plugin_type` | `booster.boost()`
  • Linux系统函数link、unlink与dentry的关系及使用注意事项
  • 安卓手机 IP 切换指南:告别卡顿,轻松换 IP
  • 微服务拆分:领域驱动设计,单体应用如何平滑迁移?
  • 企业网站推广的形式有哪些福州网站推广排名
  • 关键词优化网站排名群英云服务器
  • nano-GPT:最小可复现的GPT实操
  • 网站建设公众号wordpress中文模板下载地址
  • 菜单及库(Num28)
  • super()核心作用是调用父类的属性/方法
  • 【Win32 多线程程序设计基础第三章笔记】
  • CentOS 7 FTP安装与配置详细介绍
  • 网页设计跟网站建设的区别淘宝店铺运营推广
  • 机器学习使用GPU
  • 做网站分为哪些功能的网站找工作网
  • 湖南粒界教育科技有限公司:专注影视技能培养,AI辅助教学提升学员就业竞争力
  • 【系统分析师】写作框架:静态测试方法及其应用
  • React useEffect组件渲染执行操作 组件生命周期 监视器 副作用
  • 在哪些场景下适合使用 v-model 机制?
  • 长沙申请域名网站备案查域名服务商
  • 游标卡尺 东莞网站建设大连建设工程信息网去哪里找
  • 华为USG防火墙之开局上网配置
  • 【第五章:计算机视觉-计算机视觉在医学领域中应用】1.生物细胞检测实战-(3)基于YOLO的细胞检测实战:数据读取、模型搭建、训练与测试
  • 【MFC实用技巧】对话框“边框”属性四大选项:None、Thin、Resizing、对话框外框,到底怎么选?
  • 网站备案 备注关联性天津网站建设内容
  • 所有网站收录入口济南市住监局官网
  • frida android quickstart