Mysql:合并查询结果、别名

合并查询结果

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关键字,那么都需要使用空格来分隔

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不怕猫的耗子A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值