基本查询语句
mysql从数据表中查询数据的基本语句select语句,select语句的基本格式比较复杂,所以举例说明select查询语句的使用:
首先以一个例子说明如何使用select从单个表中获取数据:
单表查询
是指从一张表的数据中查询所需要的数据
查询所有字段:
select * from 表名
在select语句中指定所有字段
查询指定字段
查询单个字段
select 列名 from 表名;
查询多个字段
select 字段名1,字段名2… from 表名;
查询指定记录
select 字段名1,字段名2,…,字段名n
from 表名
where 查询条件
带in关键字的查询
in操作符用来查询满足指定范围内的条件的记录。注意:将所有检索条件用括号括起来,条件之间用‘,’分开,只要满足条件里的一个值即为匹配项。
下图中,查询了fruits数据表中s_id为101和102的记录,并按照s_id排序把记录显示出来
带between and的范围查询
用来查询某个范围的值,有两个参数,即范围的开始值和结束值。
下图查询s_id在101-102之间的记录
下图为查询f_price在5.0-10.0之间的记录
带like的字符匹配查询
前面的检索中,主要讲解了如何查询多个字段的记录,或者进行比较查询或者是查询一个条件范围内的记录,现在加入我要要查询包含“ge”字符的名称,单纯的比较操作是不可以实现的,需要采用通配符的方法。主要有两种“%”,“”
1.%:匹配任意长度的字符,甚至零字符。
查询所有以b开头的水果
2.:匹配任意一个字符
查询以e结尾的长度为5的水果,下图输入的下划线是由4个‘_’组成的
带and、or的多条件查询
and:只有满足所有查询条件的记录才可以返回。多个条件表达式用‘and’隔开;
or:满足其中一个条件即可返回。
查询s_id和f_price两个条件都满足的记录
查询s_id或f_price两个条件满足之一的记录
查询结果不重复
distinct:
语法格式:
select distinct 字段名 from 表名 ;
去除了重复的101数据记录
对查询结果进行排序
1.单列排序
order by子句对指定的列数据进行排序
语法格式:
select 字段名 from 表名 order by 字段名;
下图将数据按f_price排序并显示
2.多列排序
语法格式:
select 字段名1,字段名2 from 表名 order by 字段名1,字段名2;
如果第一列是相同的,才会对第二列进行排序,如果第一列数据都是唯一的,将不再对第二列进行排序。
3.指定排序方向
一般字母排序默认按升序方式,使用关键字desc可以实现降序排列,关键字asc是升序排序,是默认的排序方式
一般默认是升序排列(ASC),而DESC是降序排序
分组查询
分组查询是对数据按照某个或多个字段进行分组,关键字是group by
基本语法:【group by 字段】 【having <条件表达式>】
1.创建分组
group by关键字通常要和集合函数一起用,例如max(),min(),count(),sum(),avg()。group_concat()将分组中的各个字段显示出来。
2.添加with rollup
添加此关键字之后,在所有查询分组的记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量
3.多字段分组
语法格式:
select * from 数据表名 group by 字段名1,字段名2…
PS:group by和order by可以一起使用,即对分组进行排序
limit限制查询结果的数量
语法格式:
limit 【位置偏移量,】 行数
位置偏移量可以省略
下图显示了4行记录
下图从第4行记录开始显示,显示行数长度为2的之后的记录
使用集合函数查询
主要有max(),min(),count(),sum(),avg()(求平均值)几个函数,括号里为要求的参数,使用比较简单,不作介绍。
返回数据表的行数
返回数据某一列值的总和
连接查询
连接查询是关系型数据库模型的主要特点,是关系型数据库的主要查询方法,主要包括内连接,外链接等。通过连接运算符可以实现多个表查询。
内连接查询
内连接(inner join)使用比较运算符进行表间某列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组合成新的记录。
首先创建数据表suppliers
插入数据
在fruits表和suppliers表之间使用内连接查询。
查询之前,查看两个表的结构:
fruits表和suppliers表中都有相同数据类型的字段s_id,两个表通过s_id字段建立联系。接下来从fruits表中查询f_name、f_price字段,从suppliers表中查询s_id、s_name,SQL语句如下:
在fruits表和suppliers表之间,使用INNER JOIN语法进行内连接查询,SQL语句如下:
查询供应f_id= ‘a1’的水果供应商提供的其他水果种类,SQL语句如下:
外链接查询
1.left join左连接
2.right join右连接
复合条件查询
在连接查询的过程中,添加过滤条件,限制查询的结果。
子查询
指 一个查询语句嵌套在另一个查询语句的内部的查询。
带any some关键字的子查询
ANY和SOME关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
下面定义两个表tb1和tb2:
CREATE table tbl1 ( num1 INT NOT NULL);
CREATE table tbl2 ( num2 INT NOT NULL);
分别向两个表中插入数据:
INSERT INTO tbl1 values(1), (5), (13), (27);
INSERT INTO tbl2 values(6), (14), (11), (20);
ANY关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为TRUE,则返回TRUE。
返回tbl2表的所有num2列,然后将tbl1中的num1的值与之进行比较,只要大于num2的任何1个值,即为符合查询条件的结果。
带all关键字的子查询
带exists关键字的子查询
查询suppliers表中是否存在s_id=107的供应商,如果存在,则查询fruits表中的记录,SQL语句如下:
带比较运算的子查询
在suppliers表中查询s_city等于“Tianjin”的供应商s_id,然后在fruits表中查询所有该供应商提供的水果的种类,SQL语句如下:
合并查询结果
查询所有价格小于9的水果的信息,查询s_id等于101和103所有的水果的信息,使用UNION连接查询结果,SQL语句如下:
如前所述,UNION将多个SELECT语句的结果组合成一个结果集合。可以分开查看每个SELECT语句的结果:
为表和字段取别名
查询fruits表,为f_name取别名fruit_name,f_price取别名fruit_price,为fruits表取别名f1,查询表中f_price
使用正则表达式查询
在fruits表中,查询f_name字段以字母’b’开头的记录,SQL语句如下:
字符“^”匹配以特定字符或者字符串开头的文本
字符“$”匹配以特定字符或者字符串结尾的文本
用“.”来替代字符串中的任意一个字符
用“*”和“+”来匹配多个字符
星号’*’匹配前面的字符任意多次,包括0次。加号’+’匹配前面的字符至少一次。
在fruits表中,查询f_name字段值以字母’b’开头,且’b’后面出现字母’a’的记录,SQL语句如下:
匹配指定字符串
正则表达式可以匹配指定字符串,只要这个字符串在查询文本中即可,如要匹配多个字符串,多个字符串之间使用分隔符’|’隔开。
在fruits表中,查询f_name字段值包含字符串“on”的记录,SQL语句如下:
在fruits表中,查询f_name字段值包含字符串“on”或者“ap”的记录,SQL语句如下:
匹配指定字符中的任意一个
方括号“[]”指定一个字符集合,只匹配其中任何一个字符,即为所查找的文本。
在fruits表中,查找f_name字段中包含字母’o’或者’t’的记录,SQL语句如下:
在fruits表,查询s_id字段中数值中包含4、5或者6的记录,SQL语句如下
匹配指定字符以外的字符
“[^字符集合]”匹配不在指定集合中的任何字符。
在fruits表中,查询f_id字段包含字母ae和数字12以外的字符的记录,SQL语句如下:
在fruits表中,查询f_name字段值出现字符串“ba”最少1次,最多3次的记录,SQL语句如下: