示例资料来源:必知必会官网(点击链接进入后下拉网页到Supporting Resources --> Appendix A: Sample Table Scripts -->选择对应的数据库管理软件下载
- 检索单个列
SELECT prod_name
- 检索多个列
SELECT prod_id, prod_name, prod_price
- 检索所有列
SELECT *
FROM Products;
SELECT DISTINCT vend_id,prod_price
注意:不能部分使用 DISTINCT, DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。
- 返回从首行开始共计5行的数据
SELECT prod_name
FROM Products
LIMIT 5;
- 返回从第 5行(不包括第5行)起的 5行数据(即6,7,8,9,10行数据)
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
LIMIT 5,5;//作用同上
SELECT prod_name -- 这是一条注释
FROM Products;
/*SELECT prod_name, vend_id
FROM Products; 这也是注释*/
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;//表示先按prod_price,再按prod_name进行排序
ORDER BY 2, 3;//表示先按prod_price,再按prod_name进行排序
ORDER BY prod_price DESC //降序排序
ORDER BY prod_price DESC, prod_name; //只对prod_price列指定DESC,对prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准的升序排序。
在同时使用 ORDER BY和 WHERE子句时,应该让 ORDER BY位于WHERE之后
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;
WHERE prod_price BETWEEN 5 AND 10;
WHERE vend_id != 'DLL01';
WHERE prod_price IS NULL;(空 prod_price字段,不是价格为 0)
WHERE vend_id = 'DLL01' AND prod_price <= 4;
WHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’;
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10; //注意加括号
WHERE vend_id IN ( 'DLL01', 'BRS01' )
//IN操作符完成了与OR相同的功能
WHERE NOT vend_id = 'DLL01'
//在与 IN操作符联合使用时,NOT可以非常简单地找出与条件列表不匹配的行。
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
//找出所有以词Fish起头的产品
WHERE prod_name LIKE '%bean bag%';
//匹配任何位置上包含文本bean bag的值
WHERE prod_name LIKE '__ inch teddy bear';
/*两个下划线_字符,8 inch teddy bear 被过滤
输出结果
BR02 12 inch teddy bear
BR03 18 inch teddy bear*/
- 方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符
- 只有微软的 Access和 SQL Server支持集合。
-
找出所有名字以J或M起头的联系人
WHERE cust_contact LIKE '[JM]%'
计算字段作用:直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化
将值联结到一起(将一个值附加到另一个值)构成单个值。
SELECT Concat(vend_name, ' (', vend_country, ')')
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
说明:TRIM 函数
RTRIM()(它去掉字符串右边的空格)、
LTRIM()(去掉字符串左边的空格)
TRIM()(去掉字符串左右两边的空格)
SELECT Concat(vend_name, ' (', vend_country, ')')
AS vend_title
SELECT quantity * item_price AS expanded_price
UPPER()将文本转换为大写
SELECT vend_name, UPPER(vend_name) AS vend_name_upcase
LEFT() 返回字符串左边的字符
LENGTH() 返回字符串的长度
LOWER() 将字符串转换为小写
ABS() 返回一个数的绝对值
COS() 返回一个角度的余弦
EXP() 返回一个数的指数值
PI() 返回圆周率
SIN() 返回一个角度的正弦
SQRT() 返回一个数的平方根
TAN() 返回一个角度的正切
AVG() 返回某列的平均值
SELECT AVG(prod_price) AS avg_price
COUNT() 返回某列的行数
1. 使用 COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值
2. 使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和
SELECT AVG(DISTINCT prod_price) AS avg_price
//在使用了DISTINCT后,此例子中的avg_price比较高,因为有多个物品具有相同的较低价格。排除它们提升了平均价格
SELECT COUNT(DISTINCT prod_price) AS different__price
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM Products;
GROUP BY: 将相同vend_id分成一组,使用COUNT函数时就会对每组vend_id而不是整个表里所有的vend_id计算一遍
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2;
说明:HAVING 和 WHERE 的差别
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;
(1)检索包含物品RGAN01的所有订单的编号。
SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01';
(2)检索具有前一步骤列出的订单编号的所有顾客的 ID。
SELECT cust_id
FROM Orders
WHERE order_num IN (20007,20008);
(2) +(1)
现在,结合这两个查询,把第一个查询(返回订单号的那一个)变为子查询。
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01');
(3)检索前一步骤返回的所有顾客 ID的顾客信息。
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN ('1000000004','1000000005');
(3)+(2)+(1)
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'));
(1)从Customers表中检索顾客列表;
(2)对于检索出的每个顾客,统计其在Orders表中的订单数目
SELECT cust_name,cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id
) AS orders
FROM Customers
ORDER BY cust_name;
/*这条SELECT语句对Customers表中每个顾客返回三列:cust_name、cust_state
和 orders。orders是一个计算字段,它是由圆括号中的子查询建立的。
该子查询对检索出的每个顾客执行一次。在此例中,该子查询执行了 5次,因为检索出了 5个顾客。*/