SQL
SQL
DBMS: Database Management System
检索语句
SELECT
:
- 检索单列
select name(列名) FROM users(表名) ;
- 检索多列
select id(列名) , name(列名) FROM users(表名) ;
- 检索所有列
select * FROM users(表名)
- 检索不同的值
select DISTINCT name from users(表名);
,DISTINCT
关键字,它指示数据库只返回不同的值 - 限制结果(取前5条)
select name(列名) from users(表名) limit 5(前5行数据);
,指定从哪里开始检索:select name(列名) from users(表名) limit 5(前5行数据) offset 5(从第5条开始);
mysql的简写形式limit 5,5
注释使用
#
,/* 注释 */
,-- 注释
排序检索数据
SELECT
结合ORDER BY
的使用
- 排序数据
select name from users order by name(排序 按照名字排序);
- 多个列排序
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price, prod_name;
检索3个列,并按其中两个列对结果进行排序——首先按价格,然后按名称排序。 - 按列位置排序
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2, 3;
ORDER BY 2,3表示先按prod_price,再按prod_name进行排序。 - 指定排序方向
DESC(降序) / ASC(升序,默认就是升序)
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price DESC, prod_name;
以价格降序来排序产品
过滤数据
SELECT
结合WHERE
的使用
- 使用
WHERE
子句:SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49;
在同时使用ORDER BY
和WHERE
子句时,应该让ORDER BY
位于WHERE
之后 - 使用
WHERE
子句操作符:
操作符 | 说明 |
---|---|
= |
等于 |
<> |
不等于 |
!= |
不等于 |
< |
小于 |
<= |
小于等于 |
!< |
不小于 |
> |
大于 |
>= |
大于等于 |
!> |
不大于 |
BETWEEN |
在制定的2个值之间 |
IS NULL |
为NULL的值 |
并非所有的DBMS 都支持这些操作符
高级数据过滤
多个WHERE
子句,以及与 逻辑操作符AND / OR
结合
AND
操作符:SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4 ;
WHERE子句中的关键字AND
,用来指示检索满足所有给定条件的行。OR
操作符:SELECT prod_name, prod_price FROM Products WHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’;
WHERE子句中使用的关键字OR
,用来表示检索匹配任一给定条件的行。- 同时使用
AND , OR
: 任何时候使用具有AND
和OR
操作符的WHERE
子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。 IN
指定取值范围:SELECT prod_name, prod_price FROM Products WHERE vend_id IN ( 'DLL01', 'BRS01' ) ORDER BY prod_name;
NOT
操作符:SELECT prod_name FROM Products WHERE NOT vend_id ='DLL01' ORDER BY prod_name;
是用来否定其后条件的关键字,也可以使用<>
操作符来完成
使用通配符过滤
通配符(wildcard):用来匹配值的一部分的特殊字符。
搜索模式(search pattern):由字面值、通配符或两者组合构成的搜索条件。
*通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。
使用LIKE
操作符进行通配搜索:
%
表示任何字符出现任意次数:SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE 'Fish%';
找出所有以词Fish
起头的name。LIKE '%bean bag%'
表示匹配任何位置上包含文本bean bag
,LIKE 'F%y'
表示匹配f开头y结尾的。_
匹配单个字符 :SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE '_ inch teddy bear';
[]
指定一个字符集: 只有微软的Access和SQL Server支持集合。SELECT cust_contact FROM Customers WHERE cust_contact LIKE '[JM]%' ORDER BY cust_contact;
找出所有名字以J或M起头的联系人
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
- 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
创建计算字段
计算字段是运行时在SELECT语句内创建的。
- 拼接字段(不同DBMS 语法不同):
拼接(concatenate)
将值联结到一起(将一个值附加到另一个值)构成单个值。
SELECT CONCAT(vend_name ,' (' ,vend_country ,')')
FROM Vendors
ORDER BY vend_name;
// mysql用 concat 来实现拼接
AS
别名(给新计算的列定义一个别名):
SELECT CONCAT(vend_name ,' (' ,vend_country ,')') AS vend_concat
FROM Vendors
ORDER BY vend_name ;
// AS 语法
- 执行算术计算(
+ - * /
):
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
使用函数处理数据
与大多数其他计算机语言一样,SQL也可以用函数来处理数据。函数一般是在数据上执行的,为数据的转换和处理提供了方便。
每一个DBMS都有特定的函数,不同DBMS支持的函数不同。
函 数 | 语 法 |
---|---|
提取字符串的组成部分 | Access使用MID();DB2、Oracle、PostgreSQL和SQLite使用SUBSTR();MySQL和SQL Server使用SUBSTRING() |
数据类型转换 | Access和Oracle使用多个函数,每种类型的转换有一个函数;DB2和PostgreSQL使用CAST();MariaDB、MySQL和SQL Server使用CONVERT() |
取当前日期 | Access使用NOW();DB2和PostgreSQL使用CURRENT_DATE;MariaDB和MySQL使用CURDATE();Oracle使用SYSDATE;SQL Server使用GETDATE();SQLite使用DATE() |
- 文本处理函数:
SELECT vend_name, UPPER(vend_name) AS vend_name_upcase
FROM Vendors
ORDER BY vend_name;
// UPPER() 文本转换为大写
函 数 | 说 明 |
---|---|
LEFT()(或使用子字符串函数) | 返回字符串左边的字符 |
LENGTH()(也使用DATALENGTH()或LEN()) | 返回字符串的长度 |
LOWER()(Access使用LCASE()) | 将字符串转换为小写 |
LTRIM() | 去掉字符串左边的空格 |
RIGHT()(或使用子字符串函数) | 返回字符串右边的字符 |
RTRIM() | 去掉字符串右边的空格 |
SOUNDEX() | 返回字符串的SOUNDEX值 |
UPPER()(Access使用UCASE()) | 将字符串转换为大写 |
SOUNDEX
是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。SOUNDEX
考虑了类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较。虽然SOUNDEX
不是SQL概念,但多数DBMS都提供对SOUNDEX
的支持
- 日期和时间处理函数:
SELECT *
FROM Orders
WHERE YEAR( order_date) = 2012;
// mysql
- 数值处理函数:
主要DBMS的函数中,数值函数是最一致、最统一的函数。
函 数 | 说 明 |
---|---|
ABS() | 返回一个数的绝对值 |
COS() | 返回一个角度的余弦 |
EXP() | 返回一个数的指数值 |
PI() | 返回圆周率 |
SIN() | 返回一个角度的正弦 |
SQRT() | 返回一个数的平方根 |
TAN() | 返回一个角度的正切 |
汇总数据
SQL的聚集函数,如何利用它们汇总表的数据
函 数 | 说 明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
AVG
:通过对表中行数计数并计算其列值之和,求得该列的平均值
SELECT AVG(prod_price) AS avg_price
FROM Products;
//mysql
COUNT
:帮助确定表中行的数目或符合特定条件的行的数目。
SELECT COUNT(*) AS num_cust
FROM Customers;
//mysql
MAX
:返回指定列中的最大值
SELECT MAX(prod_price) AS max_price
FROM Products;
//mysql
在用于文本数据时,MAX()返回按该列排序后的最后一行。
MIN
:返回指定列中的最小值
SELECT MIN(prod_price) AS min_price
FROM Products;
//mysql
在用于文本数据时,MIN()返回该列排序后最前面的行。
-SUM
: 用来返回指定列值的和
SELECT SUM(quantity) AS items_ordered
FROM OrderItems
WHERE order_num = 20005;
//mysql
Now or nerver .