数据库管理系统的一个最重要的功能就是数据查询,数据查询不应只是简单查询数据库中存储的数据,还应该根据需要对数据进行筛选,以及确定数据以什么样的格式显示。MySQL提供了功能强大、灵活的语句来实现这些操作。
下面是通过help帮助查看到的select语法格式
1. Name: 'SELECT' 2. Description: 3. Syntax: 4. SELECT 5. select_expr [, select_expr] ... 6. [FROM table_references] 7. [WHERE where_condition] 8. [GROUP BY {col_name | expr | position} 9. [ASC | DESC], ... [WITH ROLLUP]] 10. [HAVING where_condition] 11. [ORDER BY {col_name | expr | position} 12. [ASC | DESC], ...] 13. [LIMIT {[offset,] row_count | row_count OFFSET offset}]
基本查询
mysql从数据表中查询数据的基本语句为select语句。
select语句的基本格式如下:
SELECT {* | <字段列表>} [ FROM <表1>, <表2>.... [ where <表达式> ] [ group by ] [ having ] [ order by<..> ] [ limit <...> ]
- {*|<字段列表>}包含星号通配符选择字段列表,表示查询的字段,其中字段列至少包含一个字段名称,如果要查询多个字段,多个字段之间用逗号隔开,最后一个字段后不要加逗号。
- FROM<表1>,<表2>...:表1和表2表示查询数据的来源,可以是单个或多个。
- WHERE子句是可选项,如果选择该项,将限定查询必须满足的查询条件。
- GROUP BY<字段>,该子句告诉MySQL按什么样的顺序显示查询出来的数据,可以进行的排序有:升序(asc)、降序(desc)。
- [limit],该子句告诉mysql每次显示查询出来的数据条款。
1. mysql> create table fruits 2. -> ( 3. -> f_id char(10) not null, 4. -> s_id int not null, 5. -> f_name char(255) not null, 6. -> f_price decimal(8,2) not null, 7. -> primary key(f_id) 8. -> ); 9. Query OK, 0 rows affected (0.02 sec) 10. mysql> insert into fruits(f_id,s_id,f_name,f_price) 11. -> values('a1',101,'apple','5.2'), 12. -> ('b1',101,'blackberry','10.2'), 13. -> ('bs1',102,'orange','11.2'), 14. -> ('bs2',105,'melon','8.2'), 15. -> ('t1',102,'banana','10.3'), 16. -> ('t2',102,'grape','5.3'), 17. -> ('o2',103,'coconut','9.2'), 18. -> ('c0',101,'cherry','3.2'), 19. -> ('a2',103,'apricot','2.2'), 20. -> ('l2',104,'lemon','6.4'), 21. -> ('b2',104,'berry','7.6'), 22. -> ('m1',106,'mango','15.7'), 23. -> ('m2',105,'xbabay','2.6'), 24. -> ('t4',107,'xbababa','3.6'), 25. -> ('m3',105,'xxtt','11.6'), 26. -> ('b5',107,'xxxx','3.6'); 27. Query OK, 16 rows affected (0.02 sec) 28. Records: 16 Duplicates: 0 Warnings: 0
单表查询
单表查询是指从一张表数据中查询所需的数据。主要有:查询所有字段、查询指定字段、查询指定记录、查询空值、多条件的查询、对查询结果进行排序等方式。
查询所有字段
1、在select语句中使用星号()通配符查询所有字段。 select查询记录最简单的形式是从一个表中检索所有记录,实现的方法是使用星号()通配符指定查找所有列的名称。
1. mysql> select * from fruits; 2. +------+------+------------+---------+ 3. | f_id | s_id | f_name | f_price | 4. +------+------+------------+---------+ 5. | a1 | 101 | apple | 5.20 | 6. | a2 | 103 | apricot | 2.20 | 7. | b1 | 101 | blackberry | 10.20 | 8. | b2 | 104 | berry | 7.60 | 9. | b5 | 107 | xxxx | 3.60 | 10. | bs1 | 102 | orange | 11.20 | 11. | bs2 | 105 | melon | 8.20 | 12. | c0 | 101 | cherry | 3.20 | 13. | l2 | 104 | lemon | 6.40 | 14. | m1 | 106 | mango | 15.70 | 15. | m2 | 105 | xbabay | 2.60 | 16. | m3 | 105 | xxtt | 11.60 | 17. | o2 | 103 | coconut | 9.20 | 18. | t1 | 102 | banana | 10.30 | 19. | t2 | 102 | grape | 5.30 | 20. | t4 | 107 | xbababa | 3.60 | 21. +------+------+------------+---------+ 22. 16 rows in set (0.00 sec)
2、在select语句中指定所有字段 根据前面select语句的格式,select关键字后面的字段名为将要查询的数据,因此可以将表中所有字段的名称跟在select子句后面,如果忘记了字段名称,可以使用DESC命令查看表的结构。有时候,由于表中的字段多,不一定能记住所有的字段名称。因此很不方便,不建议使用。
语法格式:
1. mysql> select f_id,s_id,f_name,f_price from fruits; 2. +------+------+------------+---------+ 3. | f_id | s_id | f_name | f_price | 4. +------+------+------------+---------+ 5. | a1 | 101 | apple | 5.20 | 6. | a2 | 103 | apricot | 2.20 | 7. | b1 | 101 | blackberry | 10.20 | 8. | b2 | 104 | berry | 7.60 | 9. | b5 | 107 | xxxx | 3.60 | 10. | bs1 | 102 | orange | 11.20 | 11. | bs2 | 105 | melon | 8.20 | 12. | c0 | 101 | cherry | 3.20 | 13. | l2 | 104 | lemon | 6.40 | 14. | m1 | 106 | mango | 15.70 | 15. | m2 | 105 | xbabay | 2.60 | 16. | m3 | 105 | xxtt | 11.60 | 17. | o2 | 103 | coconut | 9.20 | 18. | t1 | 102 | banana | 10.30 | 19. | t2 | 102 | grape | 5.30 | 20. | t4 | 107 | xbababa | 3.60 | 21. +------+------+------------+---------+ 22. 16 rows in set (0.00 sec)
查询指定字段
语法格式:
select 字段名 from 表名;
1. mysql> select f_name from fruits; 2. +------------+ 3. | f_name | 4. +------------+ 5. | apple | 6. | apricot | 7. | blackberry | 8. | berry | 9. | xxxx | 10. | orange | 11. | melon | 12. | cherry | 13. | lemon | 14. | mango | 15. | xbabay | 16. | xxtt | 17. | coconut | 18. | banana | 19. | grape | 20. | xbababa | 21. +------------+ 22. 16 rows in set (0.00 sec)
查询多个字段 使用select声明,可以获取多个字段下的数据,只需要在关键字select后面指定要查询的字段的名称,不同字段名称之间用逗号分隔,最后一个字段后面不需要加逗号
语法格式:
select 字段1,字段2,字段3 ....,字段n from 表名;
1. mysql> select f_name,f_price from fruits; 2. +------------+---------+ 3. | f_name | f_price | 4. +------------+---------+ 5. | apple | 5.20 | 6. | apricot | 2.20 | 7. | blackberry | 10.20 | 8. | berry | 7.60 | 9. | xxxx | 3.60 | 10. | orange | 11.20 | 11. | melon | 8.20 | 12. | cherry | 3.20 | 13. | lemon | 6.40 | 14. | mango | 15.70 | 15. | xbabay | 2.60 | 16. | xxtt | 11.60 | 17. | coconut | 9.20 | 18. | banana | 10.30 | 19. | grape | 5.30 | 20. | xbababa | 3.60 | 21. +------------+---------+ 22. 16 rows in set (0.00 sec)
查询指定记录
数据库中包含大量的数据,根据特殊要求可能只需要查询表中的指定数据,相当于对数据的过滤。在select语句中,通过where子句可以对数据进行过滤。
语法格式:
select 字段1,字段2....字段n from 表名 where 查询条件;
操作符 |
说明 |
= |
相等 |
<>,!= |
不相等 |
< |
小于 |
<= |
小于等于 |
> |
大于 |
>= |
大于等于 |
BETWEEN |
位于两端之间 |
1. mysql> select f_name,f_price from fruits where f_price = 10.2; 2. +------------+---------+ 3. | f_name | f_price | 4. +------------+---------+ 5. | blackberry | 10.20 | 6. +------------+---------+ 7. 1 row in set (0.00 sec)
带in关键字的查询
in操作符用来查询满足指定范围内的条件的记录,使用IN操作符,将所有检索条件用括号括起来,检索条件之间用逗号分隔开,只要满足条件范围内的一个值即为匹配项。
1. mysql> select s_id,f_name,f_price 2. -> from fruits 3. -> where s_id in (101,102) 4. -> order by f_name; 5. +------+------------+---------+ 6. | s_id | f_name | f_price | 7. +------+------------+---------+ 8. | 101 | apple | 5.20 | 9. | 102 | banana | 10.30 | 10. | 101 | blackberry | 10.20 | 11. | 101 | cherry | 3.20 | 12. | 102 | grape | 5.30 | 13. | 102 | orange | 11.20 | 14. +------+------------+---------+ 15. 6 rows in set (0.00 sec)
带between and的范围查询
Between and用来查询某个范围内的值,该操作符需要两个参数,即范围的开始值和结束值,如果字段值满足指定的范围查询条件,则这些记录被返回。
1. mysql> select f_name,f_price 2. -> from fruits 3. -> where f_price between 2.00 and 10.20; 4. +------------+---------+ 5. | f_name | f_price | 6. +------------+---------+ 7. | apple | 5.20 | 8. | apricot | 2.20 | 9. | blackberry | 10.20 | 10. | berry | 7.60 | 11. | xxxx | 3.60 | 12. | melon | 8.20 | 13. | cherry | 3.20 | 14. | lemon | 6.40 | 15. | xbabay | 2.60 | 16. | coconut | 9.20 | 17. | grape | 5.30 | 18. | xbababa | 3.60 | 19. +------------+---------+ 20. 12 rows in set (0.00 sec)
带like的字符匹配查询
通配符是一种在SQL的where条件子句中拥有特殊意思的字符,SQL语句中支持多种通配符,可以和like一起使用的通配符有‘%’和‘_’。
- 百分号(%)通配符,匹配任意长度的字符,甚至包括零字符
1. mysql> select f_id,f_name 2. -> from fruits 3. -> where f_name like 'b%'; 4. +------+------------+ 5. | f_id | f_name | 6. +------+------------+ 7. | b1 | blackberry | 8. | b2 | berry | 9. | t1 | banana | 10. +------+------------+ 11. 3 rows in set (0.00 sec)
- 下划线(__)通配符,一次只能匹配任意一个字符
1. mysql> select f_id,f_name 2. -> from fruits 3. -> where f_name like '____y'; 4. +------+--------+ 5. | f_id | f_name | 6. +------+--------+ 7. | b2 | berry | 8. +------+--------+ 9. 1 row in set (0.00 sec)
查询空值
数据表创建的时候,设计者可以指定某列中是否可以包含空值(NULL)。空值不同于0,也不同于空字符串。空值一般表示数据未知、不适用或将在以后添加数据。
创建customers表并插入数据
1. mysql> create table customers 2. -> ( 3. -> c_id int not null auto_increment, 4. -> c_name char(50) not null, 5. -> c_address char(50) null, 6. -> c_city char(50) null, 7. -> c_zip char(50) null, 8. -> c_contact char(50) null, 9. -> c_email char(50) null, 10. -> primary key(c_id) 11. -> ); 12. Query OK, 0 rows affected (0.03 sec) 13. 14. mysql> insert into customers(c_id,c_name,c_address,c_city,c_zip,c_contact,c_email) 15. -> values(10001,'RedHook','200Street','Tianjin','300000','LiMing','LMing@163.com'), 16. -> (10002,'Stars','333 FromageLane','Dalian','116000','Zhangbo','Jerry@hotmail.com'), 17. -> (10003,'Netbhood','1 Sunny Place','Qingdao','266000','LuoCong',NULL), 18. -> (10004,'JOTO','829 Riverside Drive', 'Haikou','570000','YangShan','sam@hotmail.com'); 19. Query OK, 4 rows affected (0.00 sec) 20. Records: 4 Duplicates: 0 Warnings: 0
在select语句中使用IS NULL子句,可以查询某字段内容为空的记录。
1. mysql> select c_id,c_name,c_email from customers where c_email is null; 2. +-------+----------+---------+ 3. | c_id | c_name | c_email | 4. +-------+----------+---------+ 5. | 10003 | Netbhood | NULL | 6. +-------+----------+---------+ 7. 1 row in set (0.00 sec)
带and的多条件查询
使用select查询时,可以增加查询的限制条件,这样可以使查询的结果更加精确。MySQL在where子句中使用and操作符限定只有满足所有查询条件的记录才会被返回。可以使用and连接两个甚至多个查询条件,多个条件表达式之间用and分开。
1. mysql> select f_id,f_price,f_name 2. -> from fruits 3. -> where s_id = '101' and f_price >=5; 4. +------+---------+------------+ 5. | f_id | f_price | f_name | 6. +------+---------+------------+ 7. | a1 | 5.20 | apple | 8. | b1 | 10.20 | blackberry | 9. +------+---------+------------+ 10. 2 rows in set (0.00 sec)
带or的多条件查询
与and相反,在where声明中使用or操作符,表示只需要满足其中一个条件的记录即可返回。or也可以连接两个甚至多个查询条件,多个条件表达式之间用or分开。
1. mysql> select s_id,f_name,f_price 2. -> from fruits 3. -> where s_id =101 or s_id =102; 4. +------+------------+---------+ 5. | s_id | f_name | f_price | 6. +------+------------+---------+ 7. | 101 | apple | 5.20 | 8. | 101 | blackberry | 10.20 | 9. | 102 | orange | 11.20 | 10. | 101 | cherry | 3.20 | 11. | 102 | banana | 10.30 | 12. | 102 | grape | 5.30 | 13. +------+------------+---------+ 14. 6 rows in set (0.00 sec)
查询结果不重复
语法格式:select distinct 列名 from 表名;
现在查看fruits表s_id列可以看到很多重复的行
1. mysql> select s_id from fruits; 2. +------+ 3. | s_id | 4. +------+ 5. | 101 | 6. | 103 | 7. | 101 | 8. | 104 | 9. | 107 | 10. | 102 | 11. | 105 | 12. | 101 | 13. | 104 | 14. | 106 | 15. | 105 | 16. | 105 | 17. | 103 | 18. | 102 | 19. | 102 | 20. | 107 | 21. +------+ 22. 16 rows in set (0.00 sec)
添加关键字再次查看s_id列
1. mysql> select distinct s_id from fruits; 2. +------+ 3. | s_id | 4. +------+ 5. | 101 | 6. | 103 | 7. | 104 | 8. | 107 | 9. | 102 | 10. | 105 | 11. | 106 | 12. +------+ 13. 7 rows in set (0.00 sec)
对查询结果排序
1、单列排序
1. mysql> select f_name from fruits; 2. +------------+ 3. | f_name | 4. +------------+ 5. | apple | 6. | apricot | 7. | blackberry | 8. | berry | 9. | xxxx | 10. | orange | 11. | melon | 12. | cherry | 13. | lemon | 14. | mango | 15. | xbabay | 16. | xxtt | 17. | coconut | 18. | banana | 19. | grape | 20. | xbababa | 21. +------------+ 22. 16 rows in set (0.00 sec) 23. 24. mysql> select f_name from fruits order by f_name; 25. +------------+ 26. | f_name | 27. +------------+ 28. | apple | 29. | apricot | 30. | banana | 31. | berry | 32. | blackberry | 33. | cherry | 34. | coconut | 35. | grape | 36. | lemon | 37. | mango | 38. | melon | 39. | orange | 40. | xbababa | 41. | xbabay | 42. | xxtt | 43. | xxxx | 44. +------------+ 45. 16 rows in set (0.01 sec)
2、多列排序
在多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。
1. mysql> select f_name,f_price from fruits order by f_name,f_price; 2. +------------+---------+ 3. | f_name | f_price | 4. +------------+---------+ 5. | apple | 5.20 | 6. | apricot | 2.20 | 7. | banana | 10.30 | 8. | berry | 7.60 | 9. | blackberry | 10.20 | 10. | cherry | 3.20 | 11. | coconut | 9.20 | 12. | grape | 5.30 | 13. | lemon | 6.40 | 14. | mango | 15.70 | 15. | melon | 8.20 | 16. | orange | 11.20 | 17. | xbababa | 3.60 | 18. | xbabay | 2.60 | 19. | xxtt | 11.60 | 20. | xxxx | 3.60 | 21. +------------+---------+ 22. 16 rows in set (0.00 sec)
3、指定排序方向
默认情况下,查询数据按字母升序进行排序(从A~Z),但数据的排序并不仅限于此,还可以使用order by对查询结果进行降序排序(从Z~A),这可以通过关键字DESC实现。
1. mysql> select f_name,f_price from fruits order by f_name,f_price DESC; 2. +------------+---------+ 3. | f_name | f_price | 4. +------------+---------+ 5. | apple | 5.20 | 6. | apricot | 2.20 | 7. | banana | 10.30 | 8. | berry | 7.60 | 9. | blackberry | 10.20 | 10. | cherry | 3.20 | 11. | coconut | 9.20 | 12. | grape | 5.30 | 13. | lemon | 6.40 | 14. | mango | 15.70 | 15. | melon | 8.20 | 16. | orange | 11.20 | 17. | xbababa | 3.60 | 18. | xbabay | 2.60 | 19. | xxtt | 11.60 | 20. | xxxx | 3.60 | 21. +------------+---------+ 22. 16 rows in set (0.00 sec)
注:与DESC相反ASC是升序