文章目录

  • 一、检索数据
  • (一)检索列
  • (二)限制结果
  • (三)使用完全限定的表名
  • 二、排序检索数据
  • (一)单列排序数据
  • (二)多列排序数据
  • 三、过滤数据
  • (一)范围值检查
  • (二)空值检查
  • (三)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()

返回一个角度的正切

对于四种联结查询,看下面这篇文章,清晰易懂,写的非常好!


🐱🏍