🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 数据检索操作 ## 简单的数据检索 * **指定字段的数据记录查询** 如果某张表的字段较多,但是在具体的某个场景中,只需要用到部分字段的信息,使用该查询。 语法: ```sql SELECT field1, field2,... FROM table_name [WHERE condition] [ORDER BY field1 ASC/DESC, field2 ASC/DESC,...] ``` 示例: ```sql SELECT course.name AS '名称', course.code AS '编码' FROM c AS course ``` > 我们习惯的会在查询中指定表的别名,同样在字段上写可以定义别名。 * **查询所有数据** 使用通配符`*`查询 语法: ```sql SELECT * FROM table_name [WHERE condition] ``` 示例: ~~~ SELECT * FROM c AS course ~~~ > 此处遍历出来的数据的顺序是创建表中字段的顺序。 * **避免重复数据的查询** 使用关键字:DISTINCT > 例如要查询有在校生的班级编号,就可以使用 DISTINCT 关键字,查询 stu\_info 表。 > > 在使用 DISTINCT 查询时要注意:其效率较低的。 ```sql SELECT DISTINCT clazz FROM stu_info ``` * **查询数据处理** * 数学运算的数据结果处理:+ - \* / % ```sql SELECT name, price AS '人民币', price/6 AS '美元' FROM t_menu ``` * 格式化的数据处理 使用`+`进行字符串拼接是最常用的。 ~~~ SELECT name,('¥'+convert(varchar(50),price)) AS '人民币',('$'+CONVERT(varchar(50),CONVERT(decimal(10,2),price/6))) AS '美元' FROM t_menu ~~~ > 必须显示的将数字转化为字符串,否则SQL server会将前面的字符串隐式转化为整型,出现类型转换错误。 在SQL SERVER中,cast和convert函数都可用于类型转换,其功能是相同的, 只是语法不同. ~~~ SELECT name,('¥'+convert(varchar(50),price)) AS '人民币',('$'+CONVERT(varchar(50),cast(price/6 as decimal(10,2)))) AS '美元' FROM t_menu ~~~ 拓展资料(SQL SERVER中强制类型转换cast和convert的区别): https://blog.csdn.net/dragon_ton/article/details/50623470 ## 条件查询 * 带关系运算符和逻辑运算符的表达式; * 带 BETWEEN AND 关键字的条件查询; * 带 IS NULL 关键字的条件查询; * 带 IN 关键字的条件查询; * 带 LIKE 关键字的条件查询。 **关系运算符和逻辑运算符** 关系运算符:&gt;、 &gt;=、 &lt;、 &lt;=、 !=\(&lt;&gt;\)、 =; 逻辑运算符:AND\(&&\)、OR\(\|\|\)、NOT\(!\)、XOR。 示例: ```sql SELECT * FROM stu_info WHERE age >= 22 AND clazz = 'java105' ``` **BETWEEN ADN** > 一般用在对数值或者日期的区间判断条件中,而且是可以被替代的。 ```sql SELECT * FROM stu_info WHERE age BETWEEN 16 AND 22 SELECT * FROM stu_info WHERE age >= 16 AND age <=22 -- 使用 NOT 取反 SELECT * FROM stu_info WHERE NOT (age >= 16 AND age <=22) ``` **IS NULL** > 判断数据结果集中非空元素,要注意的是:NULL 和 空字符串是两个概念,使用的查询条件不尽相同 ```sql SELECT * FROM stu_info WHERE name IS NULL; SELECT * FROM stu_info WHERE name = ''; -- 判断空字符串 ``` 使用非空判断是要注意 ```sql SELECT * FROM stu_info WHERE name IS NOT NULL ``` **IN** > 条件在某些离散的数据范围内 ```sql SELECT * FROM stu_info WHERE clazz IN ('java105', 'java106'); -- 替代方案 SELECT * FROM stu_info WHERE clazz = 'java105' OR clazz = 'java106' ``` LIKE > 模糊查询:用的较多,一般用到的是全匹配 `%搜索字%`,尾部匹配 `搜索字%` > > 其他还有单个字匹配 `_` 和首部匹配 `%搜索字` ```sql SELECT * FROM stu_info WHERE name LIKE '李_强'; SELECT * FROM stu_info WHERE name LIKE '李%'; SELECT * FROM stu_info WHERE name LIKE '%李%'; ``` ## 数据排序 > 数据的排序方式:顺序 ASC、逆序 DESC。 > > 在排序中是可以多字段排序的,即会有第一排序条件和第二、三...次排序条件 ```sql SELECT * FROM stu_info ORDER BY clazz ASC, code DESC ``` ## 限制数据记录数量 使用 TOP 关键字,用于规定要返回的记录的数目。 如果要查询上述结果中前6条记录,则相应的SQL语句是: ~~~ SELECT top 6 * FROM stu_info ORDER BY clazz ASC, code DESC ~~~ 如果要查询上述结果中第 7 条到第 9 条记录,则相应的SQL语句是: ~~~ select top 3 * from stu_info where id not in ( select top 6 id from stu_info) ~~~ 取第m条到第n条记录: ~~~ select top (n-m+1) id from tablename where id not in ( select top m-1 id from tablename ) ~~~ **问题**:那么已知每页显示多少条,知道第几页可否查出相应数据呢? ~~~ -- 显示 page 页,每页显示 num 条记录 select top num id from tablename where id not in ( select top (page - 1) * num id from tablename ) ~~~ 比如第二页: ~~~ select top 6 * from stu_info where id not in ( select top 6 id from stu_info) ~~~ ## 统计函数和分组查询 例如要查询: * 每个班级有多少学生; * 每个班级中年龄最大的学生是谁; > 对于一个较完整的 SQL 语句执行的解释 ```sql SELECT clazz,MAX(age) AS '最大年龄', COUNT(*) AS '多少人' FROM stu_info WHERE id > 2 GROUP BY clazz HAVING count(*) > 1 ORDER BY MAX(age) DESC ``` 执行顺序 1. 筛选整个表找那个`id > 2` 的数据; 2. 把筛选出的记录按照 `clazz` 字段进行分组; 3. 把分组完的结果,筛选出每组数据总数量 &gt; 1的数据 `count(*) > 1`; 4. 按照分组后的字段进行排序 `MAX(age) DESC`; 5. 按照 SELECT 中要求显示的字段输出结果集。 **常用的统计函数** COUNT:在实际开发中,会使用 COUNT 函数计算条件查询后的总数据量,用于计算总页数。另外用在分组聚合函数中求分组单元中的数据量。 SUM/AVG/MAX/MIN:自学。 分组查询语法: ```sql SELECT 分组完的字段1, 分组完的字段2, ... FROM 表名 [WHERE 全局表的过滤条件] [GROUP BY 表字段1, 表字段2 HAVING 分组完成后的过滤条件(可以加聚合) ] [ORDER BY 分组完的字段1 ASC/DESC, 分组完的字段2 ASC/DESC,...] ```