【SQL】你想要的查询语句都在这里哦~


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()返回一个角度的正切

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

https://blog.csdn.net/wangjingna/article/details/48765931

🐱‍🏍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值