SELECT语句
检查单个列
SELECT prod_name FROM products;
检查多个列
SELECT prod_id,prod_name,prod_price
FROM products;
检查所有列
SELECT * FROM products;
检查不同的行
SELECT DISTINCT vend_id From products;
限制结果
SELECT prod_name FROM products LIMIT 5; #显示五行结果
排序检索数据
排序数据
SELECT prod_name From products
ORDER BY prod_name; #升序(从小到大)
按多个列排序
首先按价格,然后按名称排序
SELECT prod_name,prod_price,prod_name
FROM products
ORDER BY prod_price,prod_name;
制定排序方向
SELECT prod_id FROM products
ORDER BY prod_id DESC; # 降序(从大到小)
EG:通过排序显示最贵物品的价值
SELECT prod_price FROM products
ORDER BY prod_price DESC
LIMIT 1;
过滤分组
使用WHERE子句
SELECT prod_name,prod_price
FROM products
WHERE prod_price=2.50; # 寻找价格位2.50的物品
WEHERE字句操作符
- = 等于
- <> 不等于
- != 不等于
- <小于
- <=小于等于
- >大于
- >=大于等于
- BETWEEN在指定两个值之间
数据过滤
组合WHERE子句
AND操作符
SELECT prod_id,prod_price,prod_name
FROM products
WEHRE vend_id=1003 AND prod_price<=10; #AND操作符,两个条件同时满足才满足
OR操作符
SELECT prod_id,prod_price,prod_name
FROM products
WEHRE vend_id=1003 OR vend_id=1002; #OR操作符,两个条件满足一个即可。
AND运算符优先级高于OR
IN操作符
SELECT prod_name,prod_price
FROM products
WHERE vend_id IN(1002,1003) #IN操作符,属于括号里面的即会出现。
ORDER BY prod_name;
NOT操作符
SELECT prod_name,prod_price
FROM products
WHERE vend_id NOT IN(1002,1003) #NOT操作符,取相反结果
利用通配符进行过滤
LIKE操作符
百分号(%)通配符
%表示任意字符出现任意次
SELECT prod_id,prod_name FROM products
WHERE prod_name LIKE 'jet%' #搜索所有name为jet的内容
SELECT prod_id,prod_name FROM products
WHERE prod_name LIKE '%anvil%' #搜索所有name包含anvil的内容
下划线(_)通配符
_表示任意符号出现一次
SELECT prod_id,prod_name FROM product
WHERE prod_name LIKE '_ ton anvil'; #搜索出第一个字符任意,后面位ton anvil的内容
使用通配符技巧
- 不要过度使用通配符。如果有其他操作符能达到相同的目的,应该使用其他操作符。
- 在确实需要使用通配符时,除非非常有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式开始处,搜索起来是最慢的。
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数剧。
用正则表达式进行搜索
使用MYSQL正则表达式
基本字符匹配
SELECT prod_name FROM products
WHERE prod_name REGEXP '1000'; #name搜索出包含1000的内容
进行OR匹配
SELECT prod_name FROM products
WHERE prod_name REGEXP '1000|2000'; # 匹配到name包含1000或2000的内容
匹配几个字符之一
SELECT prod_name FROM products
WHERE prod_name REGEXP '[123] TON'; # 匹配到name包含1 TON、2TON、3TON的内容
匹配范围
SELECT prod_name FROM products
WHERE prod_name REGEXP'[1-5] ton' # 匹配到name包含1 TON、2TON……5TON的内容
创建计算字段
拼接字段
SELECT Concat(vend_name,' (',vend_country,')')
FROM vendors;
# 把vend_name和vend_country连接起来
# EG:vend_name='ACME' , vend_country='USA'
#OUTPUT: ACME (USA)
执行算术计算
SELECT prod_id,quantity,item_price,
quantity*item_prics as expanded_price # 可以把乘积结果显示到表中,并且列名可以用别名
FROM orderitems WHERE order_name=20005;
使用数据处理函数
文本处理函数
SELECT vend_name,Upper(vend_name) AS vend_name_upase
FROM vendors; # Upper函数,将字母转化为大写
日期和时间处理函数
SELECT cust_id,order_num
FROM order
WHERE Data(order_data) BETWEEN '2005-09-01' AND '2005-09-30';
# 用data函数可以进行日期处理
汇总数据
聚焦函数
AVG函数
SELECT AVG(prod_price) AS avg_price FROM products;
# 求出price的平均数。
COUT函数
SELECT cout(*) AS num_cust FROM customers;
# 求出顾客总数。
MAX函数(MIN、SUM函数省略)
SELECT MAX(prod_price) AS max_price FROM produces;
求出price的最大值。
聚集不同值
SELECT AVG(DISTINCT prod_price) AS agv_price
FROM products WHERE vend_id=1003; #去重后的平均值。
组合聚集函数
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM produces; # 把这些函数结果组合起来
分组数据
创建分组
SELECT vend_id,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;
# 先对vend_id进行分组求出每组的个数后进行显示。
过滤分组
SELECT vend_id,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id
HAVING COUNT(*)>=2; #对显示的组加了判断条件
SELECT vend_id,COUNT(*) AS num_prods
FROM products WHERE prod_price>=10 # 进行条件赛选后分组,然后再次进行赛选
GROUP BY vend_id
HAVING COUNT(*)>=2; #对显示的组加了判断条件
#同时用WEHRE和HAVING赛选
分组和排序
SELECT order_num.SUM(quantity*item_price) AS ordertotal
FROM orderitems
ORDER BY ordertotal; # 分组后进行排序
使用子查询
使用子查询进行过滤
SELECT cust_id
FROM orders
WHERE order_num IN(SELECT order_num
FROM orderitems
WHERE prod_id='TNT2');
#先对orderitems表中检测出id为TNT2的数据的num,在从order中检索出num属于那个的id
作为计算字段的子查询
select cust_name,
cust_state,
(select count(*)
from orders where orders.cust_id=customers.cust_id)
as orders
from customers;
# 将结果作为一个字段显示。
+----------------+---------------+----------+
| cust_name | cust_state | orders |
+----------------+---------------+----------+
| Coyote Inc. | MI | 2 |
| Mouse Hos | OH | 0 |
| Wascals | IN | 1 |
| Yosemite Place | AZ | 1 |
| E Fudd | IL | 1 |
| Pep E. laPew | CA | 0 |
| M.Martian | NY | 0 |
+----------------+------------+--------+
联合表
SQL最强大的功能之一就是能在数据检索检查的执行中联结(jion)表。
创建联结
SELECT vend_name,prod_name,prod_price
FROM vendors,products
WHERE vendors.vend_id=products.vend_id;
# 将两个表通过笛卡尔积的方式联结起来,然后进行赛选。
内部联结
SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id=products.vend_id;
# 将两个表进行内部联结(其实等价于笛卡尔积)后进行赛选
创建高级联结
使用不同类型的联结
自联结
SELECT p1.prod_id,p1.prod_name
FROM products AS p1,products AS p2
WHERE p1.vend_id=p2.vend_id
AND p2.prod_id='DTNTR';
# 两个products表进行笛卡尔积联结后进行筛选.
外部联结
SELECT customers.cust_id,orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id=orders.cust_id;
# 检索所有客户的订单,没有订单的输出NULL