文章目录
- 一、检索数据
- (一)检索列
- (二)限制结果
- (三)使用完全限定的表名
- 二、排序检索数据
- (一)单列排序数据
- (二)多列排序数据
- 三、过滤数据
- (一)范围值检查
- (二)空值检查
- (三)AND和OR操作符
- (四)IN和NOT操作符
- (五)通配符过滤----LIKE操作符
- 1、百分号(%)通配符
- 2、下划线(_)通配符
- 四、正则表达式搜索
- (一)基本字符匹配
- (二)OR匹配
- (三)匹配几个字符范围之一
- (四)匹配范围
- (五)匹配特殊字符
- (六)匹配字符类
- (七)匹配多个实例
- (八)定位符
- 五、汇总数据
- (一)聚集函数
- 六、分组数据
- (一)创建分组
- (二)过滤分组
- (三)SELECT子句顺序
- 七、创建计算字段
- (一)拼接字段
- 八、使用数据处理函数
- (一)文本处理函数
- (二)日期和时间的处理函数
- (三)数值处理函数
SQL----结构化查询语言
show databases;//返回可用数据库的一个列表
show tables;//返回一个数据库内的表的列表
show columns from customers;//显示表的列
describe customers;//显示表的列,和上条语句等价
show status;//显示广泛的服务器状态信息
show grants;//显示授予用户的安全权限
show errors;//显示服务器错误信息
show warnings;//显示服务器警告消息
help show;//进一步了解show语句
一、检索数据
(一)检索列
检索单个列
select pro_name
from products;
检索多个列
select pro_name,pro_price,pro_num
from products;
检索所有列
select *
from products;
检索不同的行(去重)
distinct关键字应用于所有的列
select distinct pro_vend
from products;
(二)限制结果
-
limit 5
表示MYSQL返回不多于5行
select pro_name
from products
limit 5;
-
limit 5,5
表示MYSQL返回从行5开始的5行,第一个数为开始位置,第二个数为要检索的行数
select pro_name
from products
limit 5,5;
- 所以,带一个值的
limit
总是从第一行开始,给出的数为返回的行数 - 带两个值的
limit
可以指定从行号为第一个值的位置开始 - 检索出来的第一条为行0而不是行1,所以
limit 1,1
将检索出第二行
(三)使用完全限定的表名
- pro_name是products表中的一列
select products.pro_name
from products;
- products是course数据库中的一个表
select products.pro_name
from course.products;
二、排序检索数据
(一)单列排序数据
- 对
pro_name
按照字母顺序排序并输出该列 - 升序asc
- 降序desc
- 不写默认升序
select pro_name
from products
order by pro_name;
select pro_price
from products
order by pro_price;//升序
select pro_price
from products
order by pro_price asc;//升序
select pro_price
from products
order by pro_price desc;//降序
(二)多列排序数据
- 在本例中,仅在多个行具有相同的pro_price值时才对pro_name进行排序;如果pro_price列中所有的值都是唯一的,则不会按pro_name排序。
select pro_id,pro_price,pro_name
from products
order by pro_price,pro_name;
- 下面这个例子中,只对pro_price降序排序,对pro_name(在每个价格内)依然按照字母顺序排序(标准的升序)
- DESC只应用到直接位于其前面的列名。
select pro_id,pro_price,pro_name
from products
order by pro_price desc,pro_name;
三、过滤数据
where子句的位置
- 在同时使用order by 和where子句时,应该让order by 位于where 之后,否则将会产生错误
select pro_id,pro_price,pro_name
from products
where pro_price=2.50;
where 子句操作符
操作符 | 说明 |
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
between | 在指定的两个值之间 |
(一)范围值检查
select pro_id,pro_name
from products
where pro_price between 5 and 10;
- 上面这个例子查找产品价格在[5,10]之间的产品id和产品名字
(二)空值检查
select pro_id,pro_name
from products
where pro_price is null;
(三)AND和OR操作符
select pro_id,pro_name,pro_price
from products
where vent_id = 1003 and price <= 10;
select pro_id,pro_name,pro_price
from products
where vent_id = 1002 or vent_id == 1003;
- AND相当于并且的意思,而OR相当于或的意思
select pro_price,pro_name
from products
where (vent_id = 1002 or vent_id = 1003)and pro_price >= 10;
- 当一条语句中既有AND又有OR时,SQL会优先处理AND【也就是AND在计算次序中的优先级高于OR】,所以在这种情况下,必须得加上()来确保自己的条件正确,从而输出正确的数据
(四)IN和NOT操作符
- IN和OR操作其实是等价的,但是IN操作的速度比OR操作的速度要快
- IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配
select pro_id,pro_name
from products
where vent_id in (1001,1002)//生产商id为1001或1002的
order by pro_name;
select pro_id,pro_name
from products
where vent_id not in (1001,1002)//生产商id为1001和1002之外的
order by pro_name;
(五)通配符过滤----LIKE操作符
- 如果在搜索子句中使用通配符,必须使用LIKE操作符。
1、百分号(%)通配符
- 在搜索中,%表示任何字符串出现任意次数
- %能够匹配0个、1个或多个字符
- 需要注意的是首位空格可能会干扰通配符的匹配
select pro_id,pro_name
from products
where pro_name like 'jet%';
select pro_id,pro_name
from products
where pro_name like '%jet%';
select pro_id,pro_name
from products
where pro_name like 'jet%vi';
select pro_id,pro_name
from products
where pro_name like '%jet';
2、下划线(_)通配符
- 下划线的用途和%一样,但下划线只匹配单个字符而不是多个字符
- 下划线只能匹配一个字符,不能多也不能少
select pro_id,pro_name
from products
where pro_name like '_jet';//只能输出ajet bjet cjet这样的值,而不能是abcjet这种类型的
- 通配符很有用,但是通配符搜索处理比前面所说的搜索处理所花费的时间要长
使用通配符的技巧:
- 不要过度使用通配符
- 在确实需要使用通配符时,除非绝对有必要,否则不要把他们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
- 仔细注意通配符的位置
四、正则表达式搜索
(一)基本字符匹配
正则表达式是用来匹配文本的特殊的串(字符集合)。
- 下面这个例子检索列pro_name包含文本’1000‘的所有行
select pro_name
from products
where pro_name regexp '1000'//这条语句告诉MYSQL:regexp后所跟的东西作为正则表达式处理
order by pro_name;
- 下面这个例子用来匹配文本中出现 000的所有行
-
.
是正则表达式语言中的一个特殊的字符,它表示匹配任意一个字符
select pro_name
from products
where pro_name regexp '.000'
order by pro_name;
LIKE和REGEXP之间的重要区别
看下面两条语句
//语句1
select pro_name
from products
where pro_name like '1000'
order by pro_name;
//语句2
select pro_name
from products
where pro_name regexp '1000'
order by pro_name;
- 执行上面两条语句,我们会发现第一条语句不会返回数据,而第二条语句会返回
- 这是因为,LIKE匹配整个列,如果被匹配的文本在列值中出现,LIKE将不会找到它,并且相应的行也不会返回(除非使用通配符)。
- 而REGEXP在列值类进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,并将相应的行返回
- 这是二者之间非常重要的差别
注意:
- MYSQL中的正则表达式匹配(自版本3.23.4)不区分大小写。
- 如果要区分大小写,可以用BINARY关键字
- 如
where pro_name regexp binary ' JetPack .000';
(二)OR匹配
- 为搜索两个串之一(或者为这个串,或者为另一个串),使用
|
select pro_name
from products
where pro_name regexp '1000|2000'
order by pro_name;
(三)匹配几个字符范围之一
select pro_name
from products
where pro_name regexp '[123] ton'
order by pro_name;
- [123]定义一组字符,它的意思是匹配1或2或3
- 如果否定一个字符集,在集合的开始处放置一个
^
即可,即[^123]
匹配除1、2、3以外的任何字符
(四)匹配范围
select pro_name
from products
where pro_name regexp '[1-5] ton'
order by pro_name;
(五)匹配特殊字符
- 例如我们要匹配文本中的
.
的行,但.
又是正则表达式中的一个特殊字符,我们应该进行如下匹配
select pro_name
from products
where pro_name regexp '\\.'
order by pro_name;
- MYSQL需要两个
\
进行转义 - MYSQL自己解释一个,正则表达式库解释另一个
(六)匹配字符类
- 为了方便工作,可以使用预定义的字符集,称为字符类
- 下表列出了常见字符类和它们的含义(不全)
字符类 | 含义 |
[:alnum:] | 任意字母和数字【a-z A-Z 0-9】 |
[:alpha:] | 任意字符【a-z A-Z】 |
[:lower:] | 任意小写字母 |
[:digit:] | 任意数字 |
[:print:] | 任意可打印字符 |
[:upper:] | 任意大写字母 |
[:xdigit:] | 任意十六进制数字 |
(七)匹配多个实例
匹配多个实例可以用正则表达式重复元字符来完成
- 常见重复元字符如下表
元字符 | 说明 |
* | 0个或多个匹配 |
+ | 1个或多个匹配 |
? | 0个或1个匹配 |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围(m不超过255) |
- 如下几个例子所示:
select pro_name
from products
where pro_name regexp '[0-9] tail?'
order by pro_name;
select pro_name
from products
where pro_name regexp 'tail{4}'
order by pro_name;
(八)定位符
定位符可以匹配任意位置的文本
定位元字符列表如下:
元字符 | 说明 |
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
- 如下例子代表的是,只在.或任意一个数字为串中的第一个字符时,才匹配
select pro_name
from products
where pro_name regexp '^[0-9\\.]'
order by pro_name;
五、汇总数据
(一)聚集函数
聚集函数运行在行组上,计算和返回单个值的函数
SQL聚集函数如下表所示:
函数 | 说明 |
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
select avg(pro_price)
from products
select count(*) as num_items,
max(pro_price) as max_price,
min(pro_price) as min_price,
avg(pro_price) as avg_price//as是对该列取别名的操作
from products;
- 聚集函数平常使用的也比较多,再这里就不再过多的举例子了
六、分组数据
(一)创建分组
- 找出每个产品供应商所供应产品的总数
select vent_id,count(*) as num
from products
group by vent_id;
-
GROUP BY
子句指示MYSQL分组数据,然后对每个组而不是整个结果进行聚集 -
GROUP BY
子句必须出现在WHERE
子句之后,ORDER BY
子句之前 - 使用
WITH ROLLUP
关键字可以得到每个分组以及每个分组汇总级别(针对每个分组)的值。
select vent_id,count(*) as num
from products
group by vent_id with rollup;
(二)过滤分组
- 过滤分组的时候必须用
HAVING
子句 -
WHERE
子句过滤行,HAVING
子句过滤分组
看下面这个例子
select vent_id ,count(*) as num
from products
where pro_price>10
group by vent_id
having count(*)>=2;
(三)SELECT子句顺序
子句 | 说明 |
select | 要返回的列或表达式 |
from | 从中检索数据的表 |
where | 行级过滤 |
group by | 分组说明 |
having | 组级过滤 |
order by | 输出排序顺序 |
limit | 要检索的行数 |
七、创建计算字段
(一)拼接字段
- 在通常情况下,我们需要将不同的字段显示到同一个列中,方便查看,这个时候我们就需要用到拼接字段了
- 在MYSQL的SELECT语句中,可以使用Concat()函数来拼接两个列
- 看下面两个例子:
select Concat(vend_name,' (',vend_country,')') as vend_title
from vendors
order by vend_name;
select concat(pro_name,pro_price,pro_vent) as pro_title
from products
order by pro_name;
- Concat()拼接串:即把多个串连接起来形成一个较长的串
- Concat()需要一个或多个指定的串,各个串之间用逗号分隔开
- 还能给新拼接起来的串起别名
MYSQL支持三种函数分别可以去掉串中固定位置的空格,如下表所示:
函数 | 说明 |
Trim() | 去掉串左右两边的空格 |
RTrim() | 去掉串右边的空格 |
LTrim() | 去掉串左边的空格 |
SELECT Now()可以利用Now()函数返回当前的日期和时间
八、使用数据处理函数
(一)文本处理函数
- 下表是一些常用的文本处理函数
函数 | 说明 |
Left() | 返回串左边的字符 |
Length() | 返回串的长度 |
Locate() | 找出一个串的子串 |
Lower() | 将串转为小写 |
Right() | 返回串右边的字符 |
Soundex() | 返回串SOUNDEX的值 |
SubString() | 返回子串的字符 |
Trim() | 去掉串左右两边的空格 |
RTrim() | 去掉串右边的空格 |
LTrim() | 去掉串左边的空格 |
Upper() | 将串转为大写 |
- SOUNDEX是一个将任何文本串转为描述其语音表示的字母数字模式的算法
- SOUNDEX考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。
select vent_name,Upper(vent_name) as Name
from vent
order by vent_name;
(二)日期和时间的处理函数
- 下表列出了某些常用的日期和时间的处理函数
函数 | 说明 |
Hour() | 返回一个时间的小时部分 |
Minute() | 返回一个时间的分钟部分 |
Month() | 返回一个日期的月份部分 |
Now() | 返回当前日期和时间 |
Second() | 返回一个时间的秒部分 |
Time() | 返回一个日期时间的时间部分 |
Year() | 返回一个日期的年份部分 |
Day() | 返回一个日期的天数部分 |
DateDiff() | 计算两个日期之差 |
Date() | 返回日期时间的日期部分 |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
AddDate() | 增加一个日期 |
AddTime() | 增加一个时间 |
- 看下面两个例子
select order_id,order_name
from order_title
where Date(order_date)='2005-09-01';
select order_id,order_name
from order_title
where Time(order_time)='12:21:12';
(三)数值处理函数
- 下表列出常用的集中数值处理函数
函数 | 说明 |
abs() | 返回一个数的绝对值 |
cos() | 返回一个角度的余弦 |
exp() | 返回一个数的指数值 |
mod() | 返回除操作的余数 |
pi() | 返回圆周率 |
rand() | 返回一个随机数 |
sin() | 返回一个角度的正弦值 |
sqrt() | 返回一个数的平方根 |
tan() | 返回一个角度的正切 |
对于四种联结查询,看下面这篇文章,清晰易懂,写的非常好!
🐱🏍