一、检索数据
- 查询结果不包括重复的行 DISTINCT
SELECT DISTINCT id
FROM products; - (1) LIMIT查询结果不多于5行
SELECT name
FROM products
LIMIT 5;
(2) 查询结果从第5行开始显示5行(下标从第0行开始)
SELECT name
FROM products
LIMIT 5,5; - 按照两个列对结果进行排序
SELECT id, price, name
FROM products
ORFER BY price,name;
DESC 降序
SELECT price
FROM products
ORDER BY price DESC
LIMIT 1;
ORDER BY子句对检索出的数据进行
排序。这个子句必须是SELECT语句中的最后一条子句。
二、过滤数据
加单引号与不加的区别:对字符串类型:加单引号
对数值型:不加
空值检查:
SELECT name
FROM products
WHERE price IS NULL;
三、数据过滤
SELECT name, price
FROM products
WHERE id=‘1002’ OR id=‘1003’
优先级:AND>OR, 在处理OR操作符前,优先处理AND操作符
SELECT name, price
FROM products
WHERE (id=‘1002’ OR id = ‘1003’) AND price>=100;
SELECT name, price
FROM products
WHERE id in (‘1002’,‘1003’)
ORDER BY name;
IN和OR功能相当,为什么用IN?
为什么要使用IN操作符?其优点具体如下。
在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
IN操作符一般比OR操作符清单执行更快。
IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建
立WHERE子句。
四、使用通配符进行过滤
使用通配符搜索速度慢
%: 任意字符,任意多个字符
下划线 _ :匹配一个字符
SELECT id, price
FROM products
WHERE name LIKE ‘jet%’
找出以s起头以e结尾的所有产品:
SELECT id,name, price
FROM products
WHERE name LIKE ‘s%e’;
五、使用正则表达式进行搜索
SELECT name
FROM prodects
WHERE name regexp ‘1000’
ORDER BY name;
正则表达式中 . 匹配任意一个字符
LIKE与REGEXP 在LIKE和REGEXP之间有一个重要的差别。
如果执行上述两条语句,会发现第一条语句不返回数据,而第
二条语句返回一行。为什么?
LIKE匹配整个串而REGEXP匹配子串
正如第8章所述,LIKE匹配整个列。如果被匹配的文本在列值
中出现,LIKE将不会找到它,相应的行也不被返回(除非使用
通配符)。而REGEXP在列值内进行匹配,如果被匹配的文本在
列值中出现,REGEXP将会找到它,相应的行将被返回。这是一
个非常重要的差别。
正则表达式匹配不区分大小写
| : 表示或者
SELECT name
FROM products
WHERE name REGEXP ‘ycy|hlc’
ORDER BY name;
[ ]: 匹配多个字符之一
SELECT name
FROM prodects
WHERE name REGEXP ‘[123]Tony’
ORDER BY name;
SELECT name
FROM products
WHERE name REGEXP ‘[1-5] Ton’
ORDER BY name;
匹配特殊字符
\为前导,\. 匹配.
SELECT name
FROM products
WHERE name REGEXP ‘\.’
ORDER BY name;
SELECT name
FROM products
WHERE name REGEXP ‘\\( [0-9] stick? \\)’
ORDER BY name;
SELECT name
FROM products
WHERE name REGEXP ‘[[:digit]]{4}’
ORDER BY name;
类似于:
SELECT name
FROM products
WHERE name REGEXP ‘[0-9][0-9][0-9][0-9]’
ORDER BY name;
定位符
如果你想找出以一个数(包括以小数点开始的数)开始的所有产品,怎么办?
SELECT name
FROM products
WHERE REGEXP ‘^ [0-9\.]’
ORDER BY name;
六、创建计算字段
拼接字段
字段(field) 基本上与列(column)的意思相同
将name和country的信息按照 name(country) 的形式输出
SELECT Concat(ven_name,’(’,ven_country,’)’)
FROM vendors
ORDER BY name;
到通过删除数据右侧多余的空格来整理数据,这可以使用MySQL的 RTrim() 函数来完成
使用别名
SELECT Concat(RTrim(ven_name),’(’, RTrim(ven_country),’)’) AS ven_title
FROM vendors
ORDER BY name;
执行算术计算
SELECT prod_id, quantity,item_price, quantity*item_price AS expanded_price
FROM orderitems
WHERE prod_num = 2005
七、使用数据处理函数
函数没有SQL的可移植性强
文本处理函数:
日期和时间处理函数
SELECT id, name
FROM orders
WHERE Date(order_date) = ‘2019-07-01’;
SELECT id, name
FROM orders
WHERE Date(order_date) BETWEEN ‘2019-07-01’ AND ‘2019-07-30’;
SELECT id, name
FROM orders
WHERE Year(order_date) = 2019 Month(order_date)= 7;
数值处理函数
八、汇总数据
聚集函数:
AVG():
SELECT AVG(price) AS avg_price
FROM products;
COUNT()函数
SELECT COUNT(cust_email) AS num_cust
FROM customs; 不计算null值
MAX():需要指定列名,需要返回指定列中最大值
MAX()函数忽略列值为NULL的行。
SELECT MAX(price) AS max_price
FROM products;
下面的例子使用AVG()函数返回特定供应商提供的产品的平均价格。
它与上面的SELECT语句相同,但使用了DISTINCT参数,因此平均值只
考虑各个不同的价格:
九、分组数据
SELECT id,COUNT() AS nums
FROM products
GROUP BY id;
过滤分组
SELECT id,COUNT() AS num
FROM products
WHERE price>2
GROUP BY id
HAVING COUNT( * )>2;
分组和排序