首先创建一个table

mysql> create table Total (id int AUTO_INCREMENT PRIMARY KEY,name char(20),stu_num int NOT NULL,teacher_num int NOT NULL);
Query OK, 0 rows affected (0.11 sec) mysql> insert into Total (name,stu_num,teacher_num) values ("小学1",400,20),("小学2",356,24),("小学3",403,19),("小学4",367,26),("小学5",373,20),("小学6",406,21);
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0 mysql> select * from Total;
+----+---------+---------+-------------+
| id | name | stu_num | teacher_num |
+----+---------+---------+-------------+
| 1 | 小学1 | 400 | 20 |
| 2 | 小学2 | 356 | 24 |
| 3 | 小学3 | 403 | 19 |
| 4 | 小学4 | 367 | 26 |
| 5 | 小学5 | 373 | 20 |
| 6 | 小学6 | 406 | 21 |
+----+---------+---------+-------------+
6 rows in set (0.00 sec)

接下来就以这个表格为例,介绍select语句的深层运用。

一、查询不重复的记录

语句:select distinct [属性1,属性2] from 表名 

说明:distinct必须放在最前的位置;

          distinct只能使用需要去重的字段进行操作,也就是说如果distinct采用了name,stu_num两个字段,但是后面想利用id进行排序是不可以的,因为只能对name和stu_name两个字段进行操作;

          distinct去重多个字段时,含义是几个字段同时重复时才会被过滤。

示例:

mysql> select distinct name,teacher_num from Total;
+---------+-------------+
| name | teacher_num |
+---------+-------------+
| 小学1 | 20 |
| 小学2 | 24 |
| 小学3 | 19 |
| 小学4 | 26 |
| 小学5 | 20 |
| 小学6 | 21 |
+---------+-------------+
6 rows in set (0.00 sec) mysql> select distinct teacher_num from Total;
+-------------+
| teacher_num |
+-------------+
| 20 |
| 24 |
| 19 |
| 26 |
| 21 |
+-------------+
5 rows in set (0.00 sec)

二、排序

语法:select * from 表名 [where 条件] [ order by 属性1 [desc/asc],属性2 [desc/asc]... ];

说明:desc 降序排列,asc 升序排列;

             order by 可以有多个参数,每个排序参数可以有不同的排序顺序;

             如果第一个排序字段的值一样,则按照第二个排序字段进行排序;

             如果只有一个排序字段,则字段值相同的记录将会无序排列。

示例:

mysql> select id,name from Total where id<4 order by teacher_num desc;
+----+---------+
| id | name |
+----+---------+
| 2 | 小学2 |
| 1 | 小学1 |
| 3 | 小学3 |
+----+---------+
3 rows in set (0.00 sec)

三、限制

语句:select ... [limit 起始偏移量,行数];    或    select ... [limit 行数] offset 偏移量;

说明:.默认情况下,起始偏移量为0

示例:

mysql> select * from Total order by teacher_num asc;
+----+---------+---------+-------------+
| id | name | stu_num | teacher_num |
+----+---------+---------+-------------+
| 3 | 小学3 | 403 | 19 |
| 1 | 小学1 | 400 | 20 |
| 5 | 小学5 | 373 | 20 |
| 6 | 小学6 | 406 | 21 |
| 2 | 小学2 | 356 | 24 |
| 4 | 小学4 | 367 | 26 |
+----+---------+---------+-------------+
6 rows in set (0.00 sec) mysql> select * from Total limit 4 offset 1;
+----+---------+---------+-------------+
| id | name | stu_num | teacher_num |
+----+---------+---------+-------------+
| 2 | 小学2 | 356 | 24 |
| 3 | 小学3 | 403 | 19 |
| 4 | 小学4 | 367 | 26 |
| 5 | 小学5 | 373 | 20 |
+----+---------+---------+-------------+
4 rows in set (0.00 sec)
mysql> select * from Total order by teacher_num asc limit 4 offset 1;
+----+---------+---------+-------------+
| id | name | stu_num | teacher_num |
+----+---------+---------+-------------+
| 1 | 小学1 | 400 | 20 |
| 5 | 小学5 | 373 | 20 |
| 6 | 小学6 | 406 | 21 |
| 2 | 小学2 | 356 | 24 |
+----+---------+---------+-------------+
4 rows in set (0.00 sec)

 mysql> (select * from Total limit 4 offset 1) order by teacher_num asc;
 +----+---------+---------+-------------+
 | id | name | stu_num | teacher_num |
 +----+---------+---------+-------------+
 | 3 | 小学3 | 403 | 19 |
 | 5 | 小学5 | 373 | 20 |
 | 2 | 小学2 | 356 | 24 |
 | 4 | 小学4 | 367 | 26 |
 +----+---------+---------+-------------+
 4 rows in set (0.00 sec)

四、聚合

语句:select 字段 fun_name from 表名 [where 条件] [group by 属性1,属性2...] [with rollup] [having 条件];

说明:fun_name表示要做的聚合操作,也就是聚合函数,常用的有sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)等;

            group by 表示要进行分类聚合的字段,比如要按照部门分类统计员工数量;

            with rollup是可选项,表示是否对分类聚合后的结果进行再汇总;

            having 表示对分类后的结果再进行条件过滤。

示例:

mysql> create table Staff
-> (id int AUTO_INCREMENT PRIMARY KEY,
-> xing char(20),
-> ming char(20),
-> slary int NOT NULL);
Query OK, 0 rows affected (0.07 sec) mysql> insert into Staff (xing,ming,slary) value('guo','ding',3200),
-> ('ding','tao',2800),
-> ('hao','fugui',3500),
-> ('guo','ming',4000),
-> ('hao','tian',2900),
-> ('feng','fei','3200'),
-> ('guo','ting',2600);
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0 mysql> select * from Staff;
+----+------+-------+-------+
| id | xing | ming | slary |
+----+------+-------+-------+
| 8 | guo | ding | 3200 |
| 9 | ding | tao | 2800 |
| 10 | hao | fugui | 3500 |
| 11 | guo | ming | 4000 |
| 12 | hao | tian | 2900 |
| 13 | feng | fei | 3200 |
| 14 | guo | ting | 2600 |
+----+------+-------+-------+
7 rows in set (0.00 sec)
mysql> select count('xing') as xing_num from Staff where xing='guo';   //此处涉及了新的语法
+----------+
| xing_num |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
mysql> select sum(slary) from Staff;
+------------+
| sum(slary) |
+------------+
| 22200 |
+------------+
1 row in set (0.00 sec) mysql> select xing,sum(slary) from Staff group by xing;
+------+------------+
| xing | sum(slary) |
+------+------------+
| ding | 2800 |
| feng | 3200 |
| guo | 9800 |
| hao | 6400 |
+------+------------+
4 rows in set (0.00 sec)
mysql> select xing,sum(slary) from Staff group by xing with rollup;
+------+------------+
| xing | sum(slary) |
+------+------------+
| ding | 2800 |
| feng | 3200 |
| guo | 9800 |
| hao | 6400 |
| NULL | 22200 |
+------+------------+
5 rows in set (0.00 sec)

mysql> select xing,sum(slary) from Staff group by xing having sum(slary)>5000;
+------+------------+
| xing | sum(slary) |
+------+------------+
| guo | 9800 |
| hao | 6400 |
+------+------------+
2 rows in set (0.00 sec)

  

五、表连接

表连接分为内连接和外连接,其中内连接仅选出两张表中互相匹配的记录,外连接会选出其他不匹配的记录。

假设有以下Staff表和post表:

mysql> select * from staff;
+----+----------+-------+
| id | name | slary |
+----+----------+-------+
| | guoding | |
| | dingtao | |
| | haofugui | |
| | guoming | |
| | haotian | |
| | fengfei | |
| | guoting | |
+----+----------+-------+
rows in set (0.00 sec) mysql> select * from post;
+-----+----------+-------+
| num | name | level |
+-----+----------+-------+
| | | |
| | fengfei | |
| | haotian | |
| | guoming | |
| | haofugui | |
| | dingtao | |
| | guoding | |
+-----+----------+-------+
rows in set (0.00 sec)

示例:(内连接),语句:select 属性1,属性2 from 表1,表2 where 表1.属性值=表2.属性值

mysql> select post.name,level,slary from staff,post where staff.name=post.name;
+----------+-------+-------+
| name | level | slary |
+----------+-------+-------+
| fengfei | | |
| haotian | | |
| guoming | | |
| haofugui | | |
| dingtao | | |
| guoding | | |
+----------+-------+-------+

外连接又分为左连接与右连接:

左连接:包含所有左边表中的记录,甚至是右边表中没有和他匹配的记录。

右连接:包含所有右边表中的记录,甚至是右边表中没有和他匹配的记录。

示例:(左连接),语句:select 属性1,属性2 from 表1 left join 表2 on 表1.属性值=表2.属性值

mysql> select post.name,level,slary from staff left join post on staff.name=post.name;
+----------+-------+-------+
| name | level | slary |
+----------+-------+-------+
| guoding | | |
| dingtao | | |
| haofugui | | |
| guoming | | |
| haotian | | |
| fengfei | | |
| NULL | NULL | |
+----------+-------+-------+
rows in set (0.00 sec)

示例:(右连接),语句:select 属性1,属性2 from 表1 right join 表2 on 表1.属性值=表2.属性值

mysql> select post.name,level,slary from staff right join post on staff.name=post.name;
+----------+-------+-------+
| name | level | slary |
+----------+-------+-------+
| | | NULL |
| fengfei | | |
| haotian | | |
| guoming | | |
| haofugui | | |
| dingtao | | |
| guoding | | |
+----------+-------+-------+
rows in set (0.00 sec)

需要说明的是,如果根据ON给出的连接条件,两个欲进行连接查询的表中存在一对多的匹配关系,则会输出对应的多条记录。

比如有以下两个表:

mysql> select * from YSHA;
+------+------+
| code | NAME |
+------+------+
| | A1 |
| | A2 |
+------+------+
rows in set (0.01 sec) mysql> select * from YSHB;
+------+------+
| code | col |
+------+------+
| | Row1 |
| | Row2 |
| | Row3 |
| | Row1 |
+------+------+
rows in set (0.00 sec)

接下来以YSHA.code=YSHB.code作为连接条件:

mysql> select * from YSHA left join YSHB on YSHA.code=YSHB.code;
+------+------+------+------+
| code | NAME | code | col |
+------+------+------+------+
| | A1 | | Row1 |
| | A1 | | Row2 |
| | A1 | | Row3 |
| | A2 | NULL | NULL |
+------+------+------+------+ mysql> select * from YSHA right join YSHB on YSHA.code=YSHB.code;
+------+------+------+------+
| code | NAME | code | col |
+------+------+------+------+
| | A1 | | Row1 |
| | A1 | | Row2 |
| | A1 | | Row3 |
| NULL | NULL | | Row1 |
+------+------+------+------+
 

六、联合查询

MySQL使用UNION和UNION ALL实现数据的联合查询。

假设有以下4个table:

mysql> select * from staff;
+----+----------+-------+
| id | name | slary |
+----+----------+-------+
| | guoding | |
| | dingtao | |
| | haofugui | |
| | guoming | |
| | haotian | |
| | fengfei | |
| | guoting | |
+----+----------+-------+
rows in set (0.00 sec) mysql> select * from staff_1;
+----+----------+-------+
| id | name | slary |
+----+----------+-------+
| | guoding | |
| | liding | |
| | haofugui | |
| | xiaoli | |
| | yazhi | |
| | yuanfei | |
| | guoting | |
+----+----------+-------+
rows in set (0.00 sec) mysql> select * from staff_2;
+----+-------+----------+
| id | slary | name |
+----+-------+----------+
| | | guoding |
| | | liding |
| | | haofugui |
| | | xiaoli |
| | | yazhi |
| | | yuanfei |
| | | guoting |
+----+-------+----------+
rows in set (0.00 sec) mysql> select * from staff_3;
+----------+-------+
| name | slary |
+----------+-------+
| guoding | |
| liding | |
| haofugui | |
| xiaoli | |
+----------+-------+
rows in set (0.00 sec)

1. UNION

语句:SELECT column_name FROM table1 UNION SELECT column_name FROM table2

说明:1)用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行;
           2)UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型;
           3)同时,每条 SELECT 语句中的列的顺序必须相同;

           4)如果子句中有order by,limit等,需用括号()包起来,推荐放到所有子句之后,即对最终合并的结果来排序或筛选。

mysql> select * from staff union select * from staff_1;
+----+----------+-------+
| id | name | slary |
+----+----------+-------+
| | guoding | |
| | dingtao | |
| | haofugui | |
| | guoming | |
| | haotian | |
| | fengfei | |
| | guoting | |
| | liding | |
| | xiaoli | |
| | yazhi | |
| | yuanfei | |
| | guoting | |
+----+----------+-------+
rows in set (0.00 sec) mysql> select * from staff union select * from staff_2;
+----+----------------------+----------------------+
| id | name | slary |
+----+----------------------+----------------------+
| | guoding | |
| | dingtao | |
| | haofugui | |
| | guoming | |
| | haotian | |
| | fengfei | |
| | guoting | |
| | | guoding |
| | | liding |
| | | haofugui |
| | | xiaoli |
| | | yazhi |
| | | yuanfei |
| | | guoting |
+----+----------------------+----------------------+
rows in set (0.00 sec) mysql> select * from staff union select name from staff_1;
ERROR (): The used SELECT statements have a different number of columns mysql> select * from staff union select * from staff_3;
ERROR (): The used SELECT statements have a different number of columns
mysql> (select * from staff order by id asc) union (select * from staff_1 order by slary desc);
+----+----------+-------+
| id | name | slary |
+----+----------+-------+
| | guoding | |
| | dingtao | |
| | haofugui | |
| | guoming | |
| | haotian | |
| | fengfei | |
| | guoting | |
| | liding | |
| | xiaoli | |
| | yazhi | |
| | yuanfei | |
| | guoting | |
+----+----------+-------+
rows in set (0.00 sec)

2. UNION ALL

作用及规则与UNION相同,区别是,UNION ALL不消除重复行

mysql> select * from staff union select * from staff_1;
+----+----------+-------+
| id | name | slary |
+----+----------+-------+
| | guoding | |
| | dingtao | |
| | haofugui | |
| | guoming | |
| | haotian | |
| | fengfei | |
| | guoting | |
| | liding | |
| | xiaoli | |
| | yazhi | |
| | yuanfei | |
| | guoting | |
+----+----------+-------+
rows in set (0.00 sec) mysql> select * from staff union all select * from staff_1;
+----+----------+-------+
| id | name | slary |
+----+----------+-------+
| | guoding | |
| | dingtao | |
| | haofugui | |
| | guoming | |
| | haotian | |
| | fengfei | |
| | guoting | |
| | guoding | |
| | liding | |
| | haofugui | |
| | xiaoli | |
| | yazhi | |
| | yuanfei | |
| | guoting | |
+----+----------+-------+
rows in set (0.00 sec)

MySQL查询命令_SELECT 子查询的更多相关文章

  1. mysql 外键和子查询,视图

    1.mysql 外键约束 建表时生成外键   foreing key ('sid') references' student'('id'); 建表后添加外键  alter table' course ...

  2. MySQL(八)子查询和分组查询

    一.子查询 1.子查询(subquery):嵌套在其他查询中的查询. 例如:select user_id from usertable where mobile_no in (select mobil ...

  3. 在MySQL中使用子查询和标量子查询的基本用法

    一.MySQL 子查询 子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用.MySQL 支持 SQL 标准要求的所有子查询格式和操作,也扩展了特有的几种特性.子查询没 ...

  4. mysql update不支持子查询更新

    先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...

  5. 黑马MySQL数据库学习day03 级联 多表查询 连接和子查询 表约束

    /* 存在外键的表 删表限制: 1.先删除从表,再删除主表.(不能直接删除主表,主表被从表引用,尽管实际可能还没有记录引用) 建表限制: 1.必须先建主表,再建从表(没有主表,从表无法建立外键关系) ...

  6. mysql优化---in型子查询,exists子查询,from 型子查询

    in型子查询引出的陷阱:(扫更少的行,不要临时表,不要文件排序就快) 题: 在ecshop商城表中,查询6号栏目的商品, (注,6号是一个大栏目) 最直观的: mysql); 误区: 给我们的感觉是, ...

  7. Mysql查询优化器之关于子查询的优化

    下面这些sql都含有子查询: mysql> select * from t1 where a in (select a from t2); mysql> select * from (se ...

  8. mysql---where子查询、form子查询、exists子查询

    1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询. 2.子查询有什么好处? 子查询可以使用几个简单命令构造功能强大的复合命令. 那么,现在让我们一起来学习子查询. 3.where型的子 ...

  9. in型子查询陷阱,exists子查询

    in 型子查询引出的陷阱 select goods_id from goods where cat_id in (1,2,3) 直接用id,不包含子查询,不会中陷阱 题: 在ecshop商城表中,查询 ...

随机推荐

  1. 一种隐蔽性较高的Java ConcurrentModificationException异常场景

    前言 在使用Iterator遍历容器类的过程中,如果对容器的内容进行增加和删除,就会出现ConcurrentModificationException异常.该异常的分析和解决方案详见博文<Jav ...

  2. MSF实现RID劫持和MSF实现PsExec执行命令

    msf实现rid劫持 rid劫持原理: 每个帐户都有一个指定的RID来标识它.与域控制器不同,Windows工作站和服务器会将大部分数据存储在HKLM\SAM\SAM\Domains\Account\ ...

  3. php操作redis案例

    <?php     //实例化     $redis = new Redis();     //连接服务器     //默认端口是6379,可不写     $redis->connect( ...

  4. SVN版本管理系统的使用(CentOS+Subversion+Apache+Jsvnadmin+TortoiseSVN)

    1.服务器: 192.168.4.221root 用 户操作安装 装 apache# yum install httpd httpd-devel# service httpd start# chkco ...

  5. css的小知识3

    1.补充 margin的margin:0 auto:会解决元素的居中,前提是给这个元素设置width 2.css的层叠问题 css有两个性质 1.继承性 2.层叠性  选择器的一种选择能力,谁的权重大 ...

  6. bootstrap-treeview 中文开发手册

    官方文档URL:  https://www.npmjs.com/package/bootstrap-treeview 2017年11月21日10:45:10 演示:http://www.htmleaf ...

  7. 20175320 2018-2019-2 《Java程序设计》第1周学习总结

    20175320 2018-2019-2 <Java程序设计>第1周学习总结 教材学习内容总结 本周学习了教材的第一章内容.在这一章中,我了解了Java这门编程语言的特点和地位,而本章的重 ...

  8. python->读写excel

    from openpyxl import load_workbook#将一个excel文档中的数据存放内存中,即变量wb保存了该excel的所有信息wb = load_workbook(r" ...

  9. 微信小程序点击图片全屏

    作为一个只懂简单HTML,jQuery,JS的web后台开发者,最近在学习小程序开发,现在将小程序的点击全屏功能的相关内容记录下来.如果有不对的地方或者有更简单的方法,请留言指教 0_0~ .js 文 ...

  10. intellij idea 的全局搜索快捷键方法

    1.Ctrl+N按名字搜索类 相当于eclipse的ctrl+shift+R,输入类名可以定位到这个类文件,就像idea在其它的搜索部分的表现一样,搜索类名也能对你所要搜索的内容多个部分进行匹配,而且 ...