SQL语句
分享SQL知识,讲解语句用法,助力数据库高效操作。
扫码关注公众号
一、基础查询与筛选(1-20条)
1、查询表中所有数据及所有列
SELECT * FROM student; -- student为表名,*代表所有列
解析:最基础的查询语句,用于获取目标表的完整数据集,适用于快速查看表中全部信息。
2、查询表中指定列的数据
SELECT id, name, age FROM student; -- 查询student表中的id、name、age三列
解析:仅提取需要的列,减少数据传输量,提高查询效率,是我们日常查询中最常用的方式之一。
3、查询符合单一条件的数据
SELECT * FROM student WHERE age = 18; -- 查询student表中年龄为18岁的所有数据
解析:通过WHERE
子句筛选数据,精准定位符合条件的记录,是条件查询的基础。
4、查询符合多条件(AND)的数据
SELECT * FROM student WHERE age > 18 AND gender = '男'; -- 查询年龄大于18且性别为男的学生
解析:AND
连接多个条件,仅返回同时满足所有条件的记录,适用于多维度筛选。
5、查询符合多条件(OR)的数据
SELECT * FROM student WHERE class = '一班' OR score > 90; -- 查询一班学生或成绩大于90分的学生
解析:OR
连接多个条件,返回满足任意一个条件的记录,用于扩大筛选范围。
6、查询指定范围内的数据(BETWEEN)
SELECT * FROM student WHERE score BETWEEN 80 AND 90; -- 查询成绩在80到90分之间的学生(包含80和90)
解析:替代score >=80 AND score <=90
,简化范围查询逻辑,适用于数值、日期等类型。
7、查询指定集合内的数据(IN)
SELECT * FROM student WHERE class IN ('一班', '二班', '三班'); -- 查询一、二、三班的学生
解析:替代多个OR
条件,高效筛选属于指定集合的记录,适用于固定枚举值查询。
8、模糊查询(开头匹配)
SELECT * FROM student WHERE name LIKE '张%'; -- 查询姓“张”的学生(%代表任意长度字符)
解析:LIKE
结合通配符%
实现模糊匹配,张%
表示以“张”开头的任意名字。
9、模糊查询(中间匹配)
SELECT * FROM student WHERE name LIKE '%小%'; -- 查询名字中包含“小”的学生
解析:%小%
表示任意位置包含“小”的字符串,适用于不确定字符位置的模糊查询。
10、模糊查询(结尾匹配)
SELECT * FROM student WHERE name LIKE '%伟'; -- 查询名字以“伟”结尾的学生
解析:%伟
表示以“伟”结尾的字符串,针对性匹配尾部固定的内容。
11、查询非空数据
SELECT * FROM student WHERE address IS NOT NULL; -- 查询地址不为空的学生
解析:IS NOT NULL
筛选非空字段,IS NULL
则筛选空字段,用在处理字段空值场景。
12、查询指定日期范围内的数据(含时间)
SELECT * FROM user_login
WHERE login_time BETWEEN '2024-05-01 00:00:00' AND '2024-05-01 23:59:59';
解析:针对带时间戳的字段,用BETWEEN
精准筛选“某一天”、“某一小时”等具体时间范围的数据,避免因只写日期漏查当天23:00-23:59的数据,是日志查询、行为分析的常用语句。
13、查询本周数据
SELECT * FROM orders
WHERE YEARWEEK(order_date, 1) = YEARWEEK(CURDATE(), 1); -- 获取本周所有订单
解析:YEARWEEK(date, mode)
返回年份和周数组合,mode=1表示周从周一开始,适用于周期性统计。
14、查询两表差异数据(左表有、右表无)
SELECT s.id, s.name
FROM student s
LEFT JOIN graduate g ON s.id = g.stu_id
WHERE g.stu_id IS NULL;
解析:本质是“左连接+空值筛选”,精准定位“主表存在、关联表不存在”的记录(如:未毕业学生),用在数据对账(已注册未下单用户、已下单未付款订单)等高频场景,比NOT IN
更高效且避免NULL值陷阱。
15、查询字段值出现次数大于N的记录
SELECT phone, COUNT(*) AS repeat_count
FROM user_register
GROUP BY phone
HAVING COUNT(*) > 2
ORDER BY repeat_count DESC;
解析:按“手机号”等唯一标识分组,筛选重复出现超过2次的记录,用于检测“重复注册”、“恶意刷单”等异常数据,是我们进行数据清洗、风控排查的常用语句。
16、去重查询指定列
SELECT DISTINCT class FROM student; -- 查询所有不重复的班级名称
解析:DISTINCT
去除指定列的重复值,仅返回唯一记录,适用于获取枚举值列表。
17、查询表的字段结构信息
DESCRIBE student; -- 简写:DESC student
解析:快速查看表的字段名、数据类型、主键/NULL约束、默认值等结构信息,比SHOW CREATE TABLE
更简洁,是我们“忘记表结构时快速确认字段”的高频语句。
18、查询当前数据库所有表名
-- MySQL
SELECT TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_database_name' -- 替换为你的数据库名
AND TABLE_TYPE = 'BASE TABLE'; -- 只查询基础表(排除视图等)
-- SQL Server
SELECT name AS TABLE_NAME
FROM sys.tables;
-- Oracle
SELECT table_name
FROM user_tables;
解析:通过系统表查询当前数据库的所有表名,用在“新接手项目了解结构”、“批量生成脚本”等场景,是我们在数据库管理、项目交接时的高频语句。
19、JSON字段查询
SELECT profile->'$.contact.phone' AS phone FROM users; -- 提取JSON字段中的手机号
解析:->
运算符(MySQL 5.7+)便捷查询JSON类型字段,适用于半结构化数据处理,但提取结果是带引号的字符串(如:"138****8000")。若需获取“无引号的纯文本”,需使用->>
运算符(JSON解引用),更符合日常使用场景:
-- 推荐:返回无引号的手机号(138****8000)
SELECT profile->>'$.contact.phone' AS phone FROM users;
说明:其他数据库语法差异较大,如:PostgreSQL用profile->'contact.phone'
,返回的是text
类型(无引号);SQL Server用JSON_VALUE(profile, '$.contact.phone')
,返回的可能是带引号的字符串(取决于数据类型)。
20、跨数据库查询
SELECT * FROM db1.student s
JOIN db2.scores sc ON s.id = sc.stu_id; -- 关联两个不同数据库的表
解析:通过database.table
语法实现跨库操作,需用户有对应权限,适用于分布式数据库架构。
二、排序与分页(21-25条)
21、按指定列升序排序
SELECT * FROM student ORDER BY score ASC; -- 按成绩升序排序(ASC可省略,默认升序)
解析: