#查询数据
1.基本查询语句
select
(*|<字段列表>)
[
from <表1>,<表2>...
[where <表达式>]
[group by <group by definition>]
[having <expression> [{<operator> <expression>} ...]]
[order by <order by definition>]
[limit [<offset>,] <row count>]
]
select 字段1,字段2.... from 表或视图 where 查询条件;
{*| <字段列表>}:包含星号通配符选择字段列表,表示查询字段,字段列至少包含一个字段名称,多个字段每个字段间用逗号隔开,最后一个字段后不加逗号
from<表1>,<表2>... 表1和表2查询数据的来源,可以是多个
where 可选项,限定查询行必须满足的查询条件
group by <字段>:按照指定的字段分组,显示查询出来的数据
order by <字段>:按照什么样的顺序显示查询出来的数据,可进行的排序有升序(ASC)、降序(DESC)
limit [<offset>,] <row count>:控制每次查询显示的数据条数
#单表查询
1.查询所有字段
(1) 格式:select * from 表名 或者 select 所有列名 from 表名
作用: 从一个表中检索所有记录
eg.
mysql> select * from test1;
+------+------+------------+---------+
| f_id | s_id | f_name | f_price |
+------+------+------------+---------+
| a1 | 101 | apple | 5.20 |
| a2 | 103 | apricot | 2.20 |
| b1 | 102 | blackberry | 10.20 |
| b2 | 104 | berry | 7.60 |
| b5 | 107 | xxxx | 3.60 |
| bs1 | 103 | orange | 11.20 |
| bs2 | 104 | melon | 8.20 |
| c0 | 101 | cherry | 3.20 |
| l2 | 104 | lemon | 6.40 |
| m1 | 106 | mango | 15.70 |
| m2 | 105 | xbabay | 2.60 |
| m3 | 105 | xxtt | 11.60 |
| o2 | 107 | coconut | 9.20 |
| t1 | 105 | banana | 10.30 |
| t2 | 106 | grape | 5.30 |
| t4 | 107 | xbababa | 3.60 |
+------+------+------------+---------+
2.查询指定字段
(1) 格式:select 列名 from 表名
作用:查询表中的某一个字段
eg.
mysql> select f_id from test1;
+------+
| f_id |
+------+
| a1 |
| a2 |
| b1 |
| b2 |
| b5 |
| bs1 |
| bs2 |
| c0 |
| l2 |
| m1 |
| m2 |
| m3 |
| o2 |
| t1 |
| t2 |
| t4 |
+------+
(2) 格式:select 字段名1,字段名2,...,字段名n from 表名
作用:查询表中的多个字段
eg.
mysql> select f_name,f_price from test1;
+------------+---------+
| f_name | f_price |
+------------+---------+
| apple | 5.20 |
| apricot | 2.20 |
| blackberry | 10.20 |
| berry | 7.60 |
| xxxx | 3.60 |
| orange | 11.20 |
| melon | 8.20 |
| cherry | 3.20 |
| lemon | 6.40 |
| mango | 15.70 |
| xbabay | 2.60 |
| xxtt | 11.60 |
| coconut | 9.20 |
| banana | 10.30 |
| grape | 5.30 |
| xbababa | 3.60 |
+------------+---------+
3.查询指定记录
格式:select 字段名1,字段名2,...,字段名n from 表名 where 查询条件
作用:从表中根据字段名查询符合查询条件的值
where条件判断符
操作符 说明
= 相等
<>,!= 不相等
< 小于
<= 小于或者等于
> 大于
>= 大于或者等于
between 位于两值之间
eg.
mysql> select f_name,f_price from test1 where f_price < 10.00;
+---------+---------+
| f_name | f_price |
+---------+---------+
| apple | 5.20 |
| apricot | 2.20 |
| berry | 7.60 |
| xxxx | 3.60 |
| melon | 8.20 |
| cherry | 3.20 |
| lemon | 6.40 |
| xbabay | 2.60 |
| coconut | 9.20 |
| grape | 5.30 |
| xbababa | 3.60 |
+---------+---------+
4.带IN关键字查询
(1) 格式:select 字段名1,字段名2,...,字段名n from 表名 where 字段名_x IN (条件) order by 字段名_v
作用:从表中查询数据,且字段名_x在条件中,并安照字段名_v排序
eg.
mysql> select s_id,f_name,f_price from test1 where s_id IN (101,102) order by f_name;
+------+------------+---------+
| s_id | f_name | f_price |
+------+------------+---------+
| 101 | apple | 5.20 |
| 102 | blackberry | 10.20 |
| 101 | cherry | 3.20 |
(2) 格式:select 字段名1,字段名2,...,字段名n from 表名 where 字段名_x NOT IN (条件) order by 字段名_v
作用:从表中查询数据,且字段名_x不在条件中,并安照字段名_v排序
eg.
mysql> select s_id,f_name,f_price from test1 where s_id NOT IN (101,102) order by f_name;
+------+---------+---------+
| s_id | f_name | f_price |
+------+---------+---------+
| 103 | apricot | 2.20 |
| 105 | banana | 10.30 |
| 104 | berry | 7.60 |
| 107 | coconut | 9.20 |
| 106 | grape | 5.30 |
| 104 | lemon | 6.40 |
| 106 | mango | 15.70 |
| 104 | melon | 8.20 |
| 103 | orange | 11.20 |
| 107 | xbababa | 3.60 |
| 105 | xbabay | 2.60 |
| 105 | xxtt | 11.60 |
| 107 | xxxx | 3.60 |
+------+---------+---------+
5.带between and范围查询
格式:select 字段名1,字段名2,...,字段名n from 表名 where 字段名_x between 值1 and 值2;
作用:查询符合在between and之间的值
eg.
mysql> select f_name,f_price from test1 where f_price between 2.00 and 10.00;
+---------+---------+
| f_name | f_price |
+---------+---------+
| apple | 5.20 |
| apricot | 2.20 |
| berry | 7.60 |
| xxxx | 3.60 |
| melon | 8.20 |
| cherry | 3.20 |
| lemon | 6.40 |
| xbabay | 2.60 |
| coconut | 9.20 |
| grape | 5.30 |
| xbababa | 3.60 |
+---------+---------+
6.带like的字符匹配查询
(1).通配符%,匹配任意长度的字符,包括零字符
格式:select 字段名1,字段名2,...,字段名n from 表名 where 字段名_x f_name 'b_%'
作用:查询表中以b开头的f_name,%可以放在任何位置,%g%,中间包含g字符的f_name
eg.
mysql> select f_id,f_name from test1 where f_name like 'b%';
+------+------------+
| f_id | f_name |
+------+------------+
| b1 | blackberry |
| b2 | berry |
| t1 | banana |
+------+------------+
(2).通配符'-',匹配任意一个字符
格式:select 字段名1,字段名2,...,字段名n from 表名 where 字段名_x f_name '----y'
作用:查询以y结尾,且y前面有4个字母记录
eg.
mysql> select f_id,f_name from test1 where f_name like '____y';
+------+--------+
| f_id | f_name |
+------+--------+
| b2 | berry |
+------+--------+
7.查询空值
空值为NULL,不等同于0,也不等同于空字符串,表示数据未知、不适用或将在以后添加数据
格式:select 字段名1、字段名2、... from 表名 where 字段名 is null;
作用:从表中查询数据,并判断字段名是否为空
eg.
mysql> select c_id, c_name,c_email from test2 where c_email is null;
+-------+-----------+---------+
| c_id | c_name | c_email |
+-------+-----------+---------+
| 10003 | NetbHoood | NULL |
+-------+-----------+---------+
格式:select 字段名1、字段名2、... from 表名 where 字段名 is not null;
作用:从表中查询数据,并判断字段名是否为空
eg.
mysql> select c_id, c_name,c_email from test2 where c_email is not null;
+-------+---------+-------------------+
| c_id | c_name | c_email |
+-------+---------+-------------------+
| 10001 | redhook | LMing@163.com |
| 10002 | Stars | Jerry@hotmail.com |
| 10004 | JOTO | sam@hotmail.com |
+-------+---------+-------------------+
8.带AND的多条件查询
格式:select 字段名1、字段名2、... from 表名 where 条件1 and 条件2;
作用:多条件查询,&的关系
eg.
mysql> select f_id, f_price, f_name from test1 where s_id = '101' and f_price >=5;
+------+---------+--------+
| f_id | f_price | f_name |
+------+---------+--------+
| a1 | 5.20 | apple |
+------+---------+--------+
9.带OR的多条件查询
格式:select 字段名1、字段名2、... from 表名 where 条件1 or 条件2;
作用:多条件查询,|的关系
eg.
mysql> select f_id, f_price, f_name from test1 where s_id = 101 or s_id = 102;
+------+---------+------------+
| f_id | f_price | f_name |
+------+---------+------------+
| a1 | 5.20 | apple |
| b1 | 10.20 | blackberry |
| c0 | 3.20 | cherry |
+------+---------+------------+
10.查询结果不重复
格式:select distinct 字段名 from 表名;
作用:消除表中重复的记录值
eg.
mysql> select s_id from test1;
+------+
| s_id |
+------+
| 101 |
| 103 |
| 102 |
| 104 |
| 107 |
| 103 |
| 104 |
| 101 |
| 104 |
| 106 |
| 105 |
| 105 |
| 107 |
| 105 |
| 106 |
| 107 |
+------+
mysql> select distinct s_id from test1;
+------+
| s_id |
+------+
| 101 |
| 103 |
| 102 |
| 104 |
| 107 |
| 106 |
| 105 |
+------+
11.对查询结果排序
(1).单列排序
格式:select 字段名 from 表名 order by 字段名;
作用:将查询的结果进行排序
eg.
mysql> select f_name from test1 order by f_name;
+------------+
| f_name |
+------------+
| apple |
| apricot |
| banana |
| berry |
| blackberry |
| cherry |
| coconut |
| grape |
| lemon |
| mango |
| melon |
| orange |
| xbababa |
| xbabay |
| xxtt |
| xxxx |
+------------+
mysql> select f_name from test1 order by f_name;
+------------+
| f_name |
+------------+
| apple |
| apricot |
| banana |
| berry |
| blackberry |
| cherry |
| coconut |
| grape |
| lemon |
| mango |
| melon |
| orange |
| xbababa |
| xbabay |
| xxtt |
| xxxx |
+------------+
(2)多列排序
格式:selct 字段名1,字段名2 from 表名 order by 字段名1,字段名2
作用:从表中查询字段名1,字段名2 先按字段名1排序,再按字段名2排序
eg.
mysql> select f_name from test1 order by f_name;
+------------+
| f_name |
+------------+
| apple |
| apricot |
| banana |
| berry |
| blackberry |
| cherry |
| coconut |
| grape |
| lemon |
| mango |
| melon |
| orange |
| xbababa |
| xbabay |
| xxtt |
| xxxx |
+------------+
(3)指定排序方式
格式:select 字段名1,字段名2 from 表名 order by 字段名 DESC;
作用:将字段名按照降序方式排序,不加参数DESC默认为升序方式,升序的参数为(ASC)
注意:排序只应用于位于其前面的字段
eg.
mysql> select f_price,f_name from test1 order by f_price DESC, f_name;
+---------+------------+
| f_price | f_name |
+---------+------------+
| 15.70 | mango |
| 11.60 | xxtt |
| 11.20 | orange |
| 10.30 | banana |
| 10.20 | blackberry |
| 9.20 | coconut |
| 8.20 | melon |
| 7.60 | berry |
| 6.40 | lemon |
| 5.30 | grape |
| 5.20 | apple |
| 3.60 | xbababa |
| 3.60 | xxxx |
| 3.20 | cherry |
| 2.60 | xbabay |
| 2.20 | apricot |
+---------+------------+
12.分组查询
[GROUP BY 字段] [having <条件表达式>]
(1)创建分组
格式:select 字段名 from 表名 group by 字段名;
作用:从表中查询数据,并安装字段名进行分组
eg.
mysql> select s_id, count(*) as Total from test1 group by s_id;
+------+-------+
| s_id | Total |
+------+-------+
| 101 | 2 |
| 102 | 1 |
| 103 | 2 |
| 104 | 3 |
| 105 | 3 |
| 106 | 2 |
| 107 | 3 |
+------+-------+
(2)使用having过滤分组
格式:select 字段名 from 表名 group by 字段名 having 条件
作用:将查询出来的数据根据条件再次进行过滤
eg.
mysql> select s_id, count(*) as Total from test1 group by s_id having count(*) > 1;
+------+-------+
| s_id | Total |
+------+-------+
| 101 | 2 |
| 103 | 2 |
| 104 | 3 |
| 105 | 3 |
| 106 | 2 |
| 107 | 3 |
+------+-------+
(3)使用with rollup
格式:select 字段名 from 表名 group by 字段名 with rollup;
作用:计算查询出来的所有记录的总和
eg.
mysql> select s_id, count(*) as Total from test1 group by s_id having count(*) > 1;
+------+-------+
| s_id | Total |
+------+-------+
| 101 | 2 |
| 103 | 2 |
| 104 | 3 |
| 105 | 3 |
| 106 | 2 |
| 107 | 3 |
+------+-------+
(4)多字段分组
格式:select 字段名1,字段名2 from 表名 group by 字段名1,字段名2
作用:将查询到的数据进行分组,从左到右的顺序依次执行,第一个相同才会执行第二个条件
eg.
mysql> select s_id,f_name, count(*) from test1 group by s_id,f_name;
+------+------------+----------+
| s_id | f_name | count(*) |
+------+------------+----------+
| 101 | apple | 1 |
| 101 | cherry | 1 |
| 102 | blackberry | 1 |
| 103 | apricot | 1 |
| 103 | orange | 1 |
| 104 | berry | 1 |
| 104 | lemon | 1 |
| 104 | melon | 1 |
| 105 | banana | 1 |
| 105 | xbabay | 1 |
| 105 | xxtt | 1 |
| 106 | grape | 1 |
| 106 | mango | 1 |
| 107 | coconut | 1 |
| 107 | xbababa | 1 |
| 107 | xxxx | 1 |
+------+------------+----------+
(5)group by和order by一起使用
格式:select 字段名1,sum(字段名2 * 字段名3) as 变量名 from 表名 group by 字段名1 having sum(字段名2 * 字段名3) >= 100 order by 变量名
作用:从表中查询指定数据,并对指定的数据进行排序
注意:使用rollup时不能同时使用order by,两者互斥
13.使用limit限制查询结果数量
格式:select * from 表名 limit [位置偏移量,] 行数,位置偏移量表示从哪一行开始,默认为0,表示从第一行开始
作用:返回查询结果中指定的一些信息
eg.
mysql> select * from test1 limit 4,3;
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| b5 | 107 | xxxx | 3.60 |
| bs1 | 103 | orange | 11.20 |
| bs2 | 104 | melon | 8.20 |
+------+------+--------+---------+