合并查询结果
1、利用UNION关键字,可以给出多条SELECT语句,并将它们的查询结果组合成单个结果集
2、在合并时,两个查询结果对应的列数、数据类型必须相同
3、各个SELECT语句之间使用UNION或UNION ALL关键字分隔
⑴UNION不使用关键字ALL,执行的时候会删除重复的记录,所有返回的行都是唯一的
⑵使用关键字ALL的作用是不删除重复行也不对结果进行自动排序
4、语法:SELECT column,... FROM table1 UNION [ALL] SELECT column,... FROM table2
例1:UNION
mysql> SELECT * FROM fruits WHERE f_price >= 120;
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| 2 | 102 | apple | 120 |
| 3 | 103 | melon | 130 |
| 5 | 103 | grape | 150 |
+------+------+--------+---------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM fruits WHERE f_price IN (111,120);
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| 1 | 101 | orange | 111 |
| 2 | 102 | apple | 120 |
+------+------+--------+---------+
2 rows in set (0.00 sec)
-- 使用UNION:删除重复的行
mysql> SELECT * FROM fruits WHERE f_price >= 120 UNION SELECT * FROM fruits WHERE f_price IN (111,120);
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| 2 | 102 | apple | 120 |
| 3 | 103 | melon | 130 |
| 5 | 103 | grape | 150 |
| 1 | 101 | orange | 111 |
+------+------+--------+---------+
4 rows in set (0.00 sec)
例2:
-- 使用UNION ALL:不删除重复的行
mysql> SELECT * FROM fruits WHERE f_price >= 120 UNION ALL SELECT * FROM fruits WHERE f_price IN (111,120);
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| 2 | 102 | apple | 120 |
| 3 | 103 | melon | 130 |
| 5 | 103 | grape | 150 |
| 1 | 101 | orange | 111 |
| 2 | 102 | apple | 120 |
+------+------+--------+---------+
5 rows in set (0.00 sec)
为表取别名
1、当表的名字很长或者执行一些特殊查询时,为了方便操作或者需要多次使用相同的表时,可以为表指定别名,以替代表原来的名称
2、在为表取别名时,要保证不能与数据库中的其他表的名称冲突
3、语法格式如下:
表名 [AS] 表别名
参数说明
表名:为数据库中存储的数据表的名称
表别名:为查询时指定的表的新名称
AS:为Mysql关键字,为可选参数
例2:不省略关键字AS
mysql> SELECT * FROM fruits AS f;
+------+------+------------+---------+
| f_id | s_id | f_name | f_price |
+------+------+------------+---------+
| 1 | 101 | orange | 111 |
| 2 | 102 | apple | 120 |
| 3 | 103 | melon | 130 |
| 4 | 101 | banana | 101 |
| 5 | 103 | grape | 150 |
| 6 | 101 | huolongguo | 100 |
+------+------+------------+---------+
6 rows in set (0.00 sec)
注:
1、上例子中,给表fruits取了一个别名为f,因此后面在SQL语句中用到fruits表时都可以使用其别名f来代替
2、为表指定别名,AS关键字可以省略不写
例3:省略AS关键字
-- 在使用表中的字段(列)时,最好使用"表别名.列名"来表明该列是属于哪个表的
-- 如果表没有别名,那可以使用"表名.列名"来表明,不过这样有些麻烦,这也是别名的好处之一
mysql> SELECT f.f_id,f.s_id,f.f_name,f.f_price FROM fruits f WHERE f.f_price >= 120;
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| 2 | 102 | apple | 120 |
| 3 | 103 | melon | 130 |
| 5 | 103 | grape | 150 |
+------+------+--------+---------+
3 rows in set (0.00 sec)
例4:为多个表取别名
mysql> SELECT * FROM fruits;
+------+------+------------+---------+
| f_id | s_id | f_name | f_price |
+------+------+------------+---------+
| 1 | 101 | orange | 111 |
| 2 | 102 | apple | 120 |
| 3 | 103 | melon | 130 |
| 4 | 101 | banana | 101 |
| 5 | 103 | grape | 150 |
| 6 | 101 | huolongguo | 100 |
+------+------+------------+---------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM suppliers;
+------+----------------+--------+-------------+
| s_id | s_name | s_city | s_telephone |
+------+----------------+--------+-------------+
| 101 | 西南第一水果商 | 成都 | 9090980 |
| 102 | 华东第一水果商 | 山东 | 12345678911 |
| 103 | 西北西北 | 山西 | 98765432101 |
+------+----------------+--------+-------------+
3 rows in set (0.00 sec)
-- 在连接查询中为多个表取别名
mysql> SELECT s.s_id,s.s_name,s.s_name,s.s_telephone,f.f_name FROM suppliers s LEFT JOIN fruits f ON f.s_id=s.s_id WHERE f.f_price >= 120;
+------+----------------+----------------+-------------+--------+
| s_id | s_name | s_name | s_telephone | f_name |
+------+----------------+----------------+-------------+--------+
| 102 | 华东第一水果商 | 华东第一水果商 | 12345678911 | apple |
| 103 | 西北西北 | 西北西北 | 98765432101 | melon |
| 103 | 西北西北 | 西北西北 | 98765432101 | grape |
+------+----------------+----------------+-------------+--------+
3 rows in set (0.00 sec)
例5:为同一个表取不同别名
mysql> SELECT * FROM fruits f1,fruits f2 WHERE f1.s_id=f2.s_id;
+------+------+------------+---------+------+------+------------+---------+
| f_id | s_id | f_name | f_price | f_id | s_id | f_name | f_price |
+------+------+------------+---------+------+------+------------+---------+
| 1 | 101 | orange | 111 | 1 | 101 | orange | 111 |
| 4 | 101 | banana | 101 | 1 | 101 | orange | 111 |
| 6 | 101 | huolongguo | 100 | 1 | 101 | orange | 111 |
| 2 | 102 | apple | 120 | 2 | 102 | apple | 120 |
| 3 | 103 | melon | 130 | 3 | 103 | melon | 130 |
| 5 | 103 | grape | 150 | 3 | 103 | melon | 130 |
| 1 | 101 | orange | 111 | 4 | 101 | banana | 101 |
| 4 | 101 | banana | 101 | 4 | 101 | banana | 101 |
| 6 | 101 | huolongguo | 100 | 4 | 101 | banana | 101 |
| 3 | 103 | melon | 130 | 5 | 103 | grape | 150 |
| 5 | 103 | grape | 150 | 5 | 103 | grape | 150 |
| 1 | 101 | orange | 111 | 6 | 101 | huolongguo | 100 |
| 4 | 101 | banana | 101 | 6 | 101 | huolongguo | 100 |
| 6 | 101 | huolongguo | 100 | 6 | 101 | huolongguo | 100 |
+------+------+------------+---------+------+------+------------+---------+
14 rows in set (0.00 sec)
注:
1、在连接查询中连接的两个表可以是同一个表,此时就需要给同一个表取不同的别名来区分彼此
2、这个例子中,如果不使用表别名的话,Mysql就不知道引用的是哪个fruits表。这就是表别名分非常有用的一个地方
3、一个SQL语句中涉及到多个表时,最好给每个表取好别名,在使用表字段(列)时,使用"表别名.列名"的方式,以便区分该列是属于哪个表的
为字段取别名
1、SELECT语句显示查询结果时,MySQL会显示每个SELECT后面指定的输出列,在有些情况下,显示的列的名称会很长或者名称不够直观,这时可以指定列别名
2、Mysql可以指定列别名,替换字段或表达式
3、 语法格式如下,
列名 [AS] 列别名
参数说明:
列名:表中字段的名称
列别名:为字段新的名称
AS关键字为可选参数
例6:
-- 未给列名取别名时,默认的就是其真实的列名f_name和f_price
mysql> SELECT f1.f_name, f1.f_price FROM fruits AS f1 WHERE f1.f_price<130;
+------------+---------+
| f_name | f_price |
+------------+---------+
| orange | 111 |
| apple | 120 |
| banana | 101 |
| huolongguo | 100 |
+------------+---------+
4 rows in set (0.00 sec)
-- 给列名取别名后,返回的就是其别名了fruit_name和fruit_price
mysql> SELECT f1.f_name AS fruit_name, f1.f_price AS fruit_price FROM fruits AS f1 WHERE f1.f_price<130;
+------------+-------------+
| fruit_name | fruit_price |
+------------+-------------+
| orange | 111 |
| apple | 120 |
| banana | 101 |
| huolongguo | 100 |
+------------+-------------+
4 rows in set (0.00 sec)
例7:给聚合函数值取别名
mysql> SELECT COUNT(*) FROM fruits AS f1 WHERE f1.f_price<130;
+----------+
| COUNT(*) |
+----------+
| 4 |
+----------+
1 row in set (0.00 sec)
mysql> SELECT COUNT(*) AS total FROM fruits AS f1 WHERE f1.f_price<130;
+-------+
| total |
+-------+
| 4 |
+-------+
1 row in set (0.00 sec)
注:
1、表的别名只在执行查询的时候使用,并不在返回结果中显示;而列别名定义之后,将返回给客户端显示,显示的结果字段为字段列的别名
2、为列名指定别名,AS关键字可以省略不写
例8:
mysql> SELECT f1.f_name fruit_name, f1.f_price fruit_price FROM fruits f1 WHERE f1.f_price<130;
+------------+-------------+
| fruit_name | fruit_price |
+------------+-------------+
| orange | 111 |
| apple | 120 |
| banana | 101 |
| huolongguo | 100 |
+------------+-------------+
4 rows in set (0.00 sec)
注:在给表取别名或给列名取别名时,如果省略了AS关键字,那么都需要使用空格来分隔