MySQL必知必会笔记----查询部分(1/2)

示例资料来源:必知必会官网(点击链接进入后下拉网页到Supporting Resources --> Appendix A: Sample Table Scripts -->选择对应的数据库管理软件下载

1.SELECT语句

  • 基础检索
- 检索单个列
SELECT prod_name 

- 检索多个列
SELECT prod_id, prod_name, prod_price

- 检索所有列
SELECT *
FROM Products;
  • 对所有列去重,即vend_id,prod_price显示的都是唯一值
SELECT DISTINCT vend_id,prod_price

注意:不能部分使用 DISTINCT, DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。

  • 选择特定行的返回值
- 返回从首行开始共计5行的数据
SELECT prod_name
FROM Products
LIMIT 5;

- 返回从第 5行(不包括第5行)起的 5行数据(即678910行数据)
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
LIMIT 5,5;//作用同上
  • 注释
SELECT prod_name -- 这是一条注释
FROM Products;
/*SELECT prod_name, vend_id
FROM Products; 这也是注释*/

2. 排序

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列(在每个价格内)仍然按标准的升序排序。

3.过滤数据

在同时使用 ORDER BYWHERE子句时,应该让 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字段,不是价格为 0WHERE 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可以非常简单地找出与条件列表不匹配的行。

4.用通配符(用来匹配值的一部分的特殊字符)过滤

  • 百分号(%)通配符:表示任何字符出现任意次数
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支持集合。
- 
找出所有名字以JM起头的联系人
WHERE cust_contact LIKE '[JM]%'

5.创建计算字段

计算字段作用:直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化

  • 拼接字段(concatenate): 将值联结到一起(将一个值附加到另一个值)构成单个值
将值联结到一起(将一个值附加到另一个值)构成单个值。
SELECT Concat(vend_name, ' (', vend_country, ')')

SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'

说明:TRIM 函数
RTRIM()(它去掉字符串右边的空格)、
LTRIM()(去掉字符串左边的空格)
TRIM()(去掉字符串左右两边的空格)
  • 别名(alias)是一个字段或值的替换名。别名用AS关键字赋予
SELECT Concat(vend_name, ' (', vend_country, ')')
AS vend_title
  • 执行算术计算
SELECT quantity * item_price AS expanded_price

6.函数

  • 文本处理函数
UPPER()将文本转换为大写
SELECT vend_name, UPPER(vend_name) AS vend_name_upcase

LEFT() 返回字符串左边的字符
LENGTH() 返回字符串的长度
LOWER() 将字符串转换为小写
  • 数值处理函数
ABS()  返回一个数的绝对值
COS() 返回一个角度的余弦
EXP() 返回一个数的指数值
PI() 返回圆周率
SIN() 返回一个角度的正弦
SQRT() 返回一个数的平方根
TAN() 返回一个角度的正切
  • 聚集函数(aggregate function)
    对某些行运行的函数,计算并返回一个值。
AVG()     返回某列的平均值
SELECT AVG(prod_price) AS avg_price

COUNT()    返回某列的行数
1. 使用 COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值
2. 使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。

MAX()      返回某列的最大值
MIN()      返回某列的最小值
SUM()      返回某列值之和
  • 聚集唯一值(去重后聚集)
    只包含不同的值,指定DISTINCT参数。
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;

7.分组和排序

GROUP BY: 将相同vend_id分成一组,使用COUNT函数时就会对每组vend_id而不是整个表里所有的vend_id计算一遍

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
  • 过滤分组
    列出具有两个以上产品且其价格大于等于4的供应商:
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2;

说明:HAVING 和 WHERE 的差别

  1. WHERE 过滤行,而HAVING过滤分组。
  2. WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响 HAVING子句中基于这些值过滤掉的分组。
  • 排序分组
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;

MySQL必知必会笔记----查询部分(1/2)_第1张图片

10.使用子查询

  • 利用子查询进行过滤
    Ex1: 假如需要列出订购物品 RGAN01的所有顾客
(1)检索包含物品RGAN01的所有订单的编号。
SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01';

(2)检索具有前一步骤列出的订单编号的所有顾客的 IDSELECT 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+1SELECT 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'));
  • 作为计算字段使用子查询
    EX2: 显示Customers表中每个顾客的订单总数
(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个顾客。*/

你可能感兴趣的:(小白自学)