A-A+

MySQL基本SQL查询语句:多表查询和子查询示例

2017年10月23日 PHP技术文章 暂无评论 阅读 0 views 次

mysql中表单查询用到select命令了,如果是多表查询我们用很多方法,如select union与left join之类的联合查询了,下面我给各位mysql初学者来介绍sql查询示例。

一、简单查询.

基本语法:SELECT * FROM tb_name;

查询全部:SELECT field1,field2 FROM tb_name;

投影代码如下:

SELECT [DISTINCT] * FROM tb_name WHERE qualification;

选择说明:FROM子句:要查询的关系 表、多个表、其它SELECT语句

WHERE子句:布尔关系表达式,主要包含如下这几类表达式:

比较:=、>、>=、<=、<

逻辑关系:

AND

OR

NOT

BETWEEN ... AND ... :在两个值之间

LIKE ‘’

%: 任意长度任意字符

_:任意单个字符

REGEXP, RLIKE :正则表达式,此时索引无效

IN

IS NULL

IS NOT NULL

如下查询本博客的wp-links和wp_posts表,代码如下:

  1. mysql> select * from wp_links; 查询全部 mysql> select link_name,link_url from wp_links; 投影   
  2. +-------------------+--------------------------------------+   
  3. | link_name               | link_url                                              |   
  4. +-------------------+--------------------------------------+   
  5. | 旺旺腾讯微博          | http://www.xiariboke.net              |   
  6. | 旺旺新浪微博          | http://weibo.com/gz100ww               |   
  7. | 51CTO技术博客      | http://www.xiariboke.net/ |   
  8. +-------------------+--------------------------------------+   
  9. 10 rows in set (0.00 sec)   
  10.    
  11. mysql> select ID,post_title,post_date from wp_posts where ID>1290 and post_status='publish';选择   
  12. +------+----------------------------------------------------------------+----------------------+   
  13. | ID   | post_title                                                                                      | post_date                   |   
  14. +------+----------------------------------------------------------------+----------------------+   
  15. | 1291 | 【转】HP 3PAR存储概念之三                                                      | 2013-08-29 17:21:27 |   
  16. | 1298 | 【转】HP 3PAR存储概念之四                                                      | 2013-08-29 17:22:33 |   
  17. | 1351 | 【转】XenDesktop 5.5+vSphere 5创建虚拟机报错                      | 2013-09-04 17:41:26 |   
  18. | 1357 | linux下强大的网络工具Netcat                                                     | 2013-09-09 22:26:45 |   
  19. | 1360 | MySQL常用命令、技巧和注意事项                                              | 2013-09-20 11:04:15 |   
  20. | 1369 | 【转】数据库设计原理知识--B树、B-树、B+树、B*树都是什么     | 2013-09-21 12:30:18 |   
  21. | 1379 | MySQL基本SQL语句之常用管理SQL                                           | 2013-09-21 12:39:23 |   
  22. +------+----------------------------------------------------------------+---------------------+   
  23. rows in set (0.01 sec)   

对查询结果排序:ORDER BY field_name {ASC|DESC},代码如下:

  1. mysql> select ID,post_title,post_date from wp_posts where ID>1290 and post_status='publish' ORDER by ID;     
  2.    
  3. ##升序,ID是排序的字段   
  4.    
  5. mysql> select ID,post_title,post_date from wp_posts where ID>1290 and post_status='publish' ORDER by ID DESC;      
  6.    
  7. ##降序   

字段别名:AS

  1. select col_name AS COL_Aliases … :对字段使用别名   
  2.   
  3. select col_name,… from tb_name AS tb_Aliases …:对表使用别名,如下:  
  4.   
  5. mysql> select post_title AS 文章标题 from wp_posts where ID>1290 and post_status='publish';   
  6. +----------------------------------------------------------------+   
  7. | 文章标题                                                                                    |   
  8. +----------------------------------------------------------------+   
  9. | 【转】HP 3PAR存储概念之三                                                      |   
  10. | 【转】HP 3PAR存储概念之四                                                      |   
  11. | 【转】XenDesktop 5.5+vSphere 5创建虚拟机报错                      |   
  12. | linux下强大的网络工具Netcat                                                     |   
  13. | MySQL常用命令、技巧和注意事项                                              |   
  14. | 【转】数据库设计原理知识--B树、B-树、B+树、B*树都是什么     |   
  15. | MySQL基本SQL语句之常用管理SQL                                           |   
  16. +----------------------------------------------------------------+   
  17. rows in set (0.02 sec)   
  18.    
  19. ##还可以这样:   
  20.   
  21. mysql> select 3+2 AS SUM;   
  22. +-----+   
  23. SUM |   
  24. +-----+   
  25. |   5    |   
  26. +-----+   
  27. 1 row in set (0.00 sec)   
  28. LIMIT子句:LIMIT [offset,]Count,代码如下:  
  29.   
  30. mysql> select ID,post_title,post_date from wp_posts where ID>1290 and post_status='publish' limit 5;   
  31. +------+--------------------------------------------------+---------------------+   
  32. | ID      | post_title                                                                | post_date               |   
  33. +------+--------------------------------------------------+---------------------+   
  34. | 1291 | 【转】HP 3PAR存储概念之三                                 | 2013-08-29 17:21:27 |   
  35. | 1298 | 【转】HP 3PAR存储概念之四                                 | 2013-08-29 17:22:33 |   
  36. | 1351 | 【转】XenDesktop 5.5+vSphere 5创建虚拟机报错  | 2013-09-04 17:41:26 |   
  37. | 1357 | linux下强大的网络工具Netcat                                 | 2013-09-09 22:26:45 |   
  38. | 1360 | MySQL常用命令、技巧和注意事项                          | 2013-09-20 11:04:15 |   
  39. +------+--------------------------------------------------+---------------------+   
  40. rows in set (0.01 sec)   
  41.    
  42. mysql> select ID,post_title,post_date from wp_posts where ID>1290 and post_status='publish' limit 2,3;  ##红色部分(逗号前的数字)表示偏移量   
  43. +------+--------------------------------------------------+---------------------+   
  44. | ID      | post_title                                                              | post_date                 |   
  45. +------+--------------------------------------------------+---------------------+   
  46. | 1351 | 【转】XenDesktop 5.5+vSphere 5创建虚拟机报错  | 2013-09-04 17:41:26 |   
  47. | 1357 | linux下强大的网络工具Netcat                                 | 2013-09-09 22:26:45 |   
  48. | 1360 | MySQL常用命令、技巧和注意事项                          | 2013-09-20 11:04:15 |   
  49. +------+--------------------------------------------------+---------------------+   
  50. rows in set (0.00 sec)   

聚合:SUM(), MIN(), MAX(), AVG(), COUNT(),括号中为字段名

mysql> select sum(ID) from wp_posts;计算和

mysql> select min(ID) from wp_posts;查早最小的

mysql> select max(ID) from wp_posts; 查找最大的

mysql> select avg(ID) from wp_posts; 平均值

mysql> select count(ID) from wp_posts;计数

分组:GROUP BY,一般配合聚合运算使用,如下:

  1. mysql> select count(post_status) AS 各状态数量,post_status AS 状态名称 from wp_posts group by post_status;   
  2. +-----------------+--------------+   
  3. | 各状态数量           | 状态名称        |   
  4. +-----------------+--------------+   
  5. |               1           | auto-draft     |   
  6. |               9           | draft             |   
  7. |             251         | inherit           |   
  8. |             238         | publish          |   
  9. |               2           | trash             |   
  10. +-----------------+--------------+   
  11. rows in set (0.01 sec)   

注意:可以使用HAVING qualification将GROUP BY的结果再次过滤,用法同where.

二、多表查询

连接:

交叉连接:笛卡尔乘积

自然连接:将两张表某字段中相等连接起来,代码如下:

  1. mysql> SELECT students.Name,students.Age,courses.Cname,students.Gender FROM students,courses WHERE students.CID1 = courses.CID;   
  2. +--------------+------+------------------+--------+   
  3. Name             | Age   | Cname                 | Gender |   
  4. +--------------+------+------------------+--------+   
  5. | GuoJing          |   19   | TaiJiquan              | M        |   
  6. | YangGuo        |   17   | TaiJiquan              | M        |   
  7. | DingDian        |   25   | Qishangquan       | M         |   
  8. | HuFei             |   31   | Wanliduxing         | M         |   
  9. | HuangRong    |   16   | Qianzhuwandushou | F       |   
  10. | YueLingshang |   18   | Wanliduxing         | F          |   
  11. | ZhangWuji      |   20   | Hamagong           | M         |   
  12. | Xuzhu             |   26   | TaiJiquan              | M         |   
  13. +--------------+------+------------------+--------+   
  14. rows in set (0.00 sec)   

外连接:

左外连接:left_tb LEFT JOIN right_tb ON ...:以左表为标准,代码如下:

  1. mysql> SELECT s.Name,c.Cname FROM students AS s LEFT JOIN courses AS c ON s.CID1=c.CID;   
  2. +--------------+--------------------+   
  3. Name             | Cname                    |   
  4. +--------------+--------------------+   
  5. | GuoJing          | TaiJiquan                 |   
  6. | YangGuo        | TaiJiquan                 |   
  7. | DingDian        | Qishangquan           |   
  8. | HuFei              | Wanliduxing            |   
  9. | HuangRong    | Qianzhuwandushou |   
  10. | YueLingshang | Wanliduxing            |   
  11. | ZhangWuji      | Hamagong              |   
  12. | Xuzhu             | TaiJiquan                 |   
  13. | LingHuchong  | NULL                      |   
  14. | YiLin               | NULL                      |   
  15. +--------------+--------------------+   
  16. 10 rows in set (0.00 sec)   

右外连接:left_tb RIGHT JOIN right_tb ON ...:以右表为标准,代码如下:

  1. mysql> SELECT s.Name,c.Cname FROM students AS s RIGHT JOIN courses AS c ON s.CID1=c.CID;   
  2. +--------------+--------------------+   
  3. Name             | Cname                    |   
  4. +--------------+--------------------+   
  5. | GuoJing         | TaiJiquan                  |   
  6. | YangGuo       | TaiJiquan                  |   
  7. | DingDian       | Qishangquan            |   
  8. | HuFei             | Wanliduxing             |   
  9. | HuangRong    | Qianzhuwandushou |   
  10. | YueLingshang | Wanliduxing            |   
  11. | ZhangWuji     | Hamagong               |   
  12. | Xuzhu            | TaiJiquan                  |   
  13. NULL             | Yiyangzhi                 |   
  14. NULL             | Jinshejianfa              |   
  15. NULL             | Qiankundanuoyi      |   
  16. NULL             | Pixiejianfa                |   
  17. NULL             | Jiuyinbaiguzhua       |   
  18. +--------------+--------------------+   
  19. 13 rows in set (0.01 sec)   

自连接:本表中不同字段间进行连接,代码如下:

  1. mysql> SELECT c.Name AS student,s.Name AS teacher FROM students AS c,students AS s WHERE c.TID=s.SID;   
  2. +-----------+-------------+   
  3. | student   | teacher     |   
  4. +-----------+-------------+   
  5. | GuoJing   | DingDian    |   
  6. | YangGuo   | GuoJing     |   
  7. | DingDian  | ZhangWuji   |   
  8. | HuFei     | HuangRong   |   
  9. | HuangRong | LingHuchong |   
  10. +-----------+-------------+   
  11. rows in set (0.02 sec)  

注意:使用了别名

三、子查询:一个查询中嵌套另外一个查询

如下,在students表中查询年龄大于平均年龄的学生,代码如下:

  1. mysql> SELECT Name,Age FROM students WHERE Age > (SELECT AVG(Age) FROM students);   
  2. +-------------+------+   
  3. Name           | Age    |   
  4. +-------------+------+   
  5. | DingDian      |   25 |   
  6. | HuFei           |   31 |   
  7. | Xuzhu           |   26 |   
  8. | LingHuchong |   22 |   
  9. +-------------+------+   
  10. rows in set (0.08 sec)   

子查询注意事项:

■比较操作中使用子查询:子查询只能返回单个值;

■IN():使用子查询;

■在FROM中使用子查询;

联合查询:UNION,将两个查询的结果合并,代码如下:

  1. mysql> (SELECT Name,Age FROM students) UNION (SELECT Tname,Age FROM tutors);   
  2. +--------------+------+   
  3. Name             | Age    |   
  4. +--------------+------+   
  5. | GuoJing          |   19   |   
  6. | YangGuo        |   17   |   
  7. | DingDian        |   25   |   
  8. | HuFei              |   31   |   
  9. | HuangRong    |   16   |   
  10. | YueLingshang |   18   |   
  11. | ZhangWuji      |   20   |   
  12. | HuYidao          |   42  |   
  13. | NingZhongze  |   49   |   
  14. +--------------+------+   
  15. 19 rows in set (0.00 sec)   
  16. //开源代码www.xiariboke.net  
标签:

给我留言