select语句表达式
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr] ...
[into_option]
[FROM table_references
[PARTITION partition_list]]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
[HAVING where_condition]
[WINDOW window_name AS (window_spec)
[, window_name AS (window_spec)] ...]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[into_option]
[FOR {UPDATE | SHARE}
[OF tbl_name [, tbl_name] ...]
[NOWAIT | SKIP LOCKED]
| LOCK IN SHARE MODE]
[into_option]
into_option: {
INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name] ...
}
最常用的SELECT语句子句 如下:
- 每个
select_expr
表示您要检索的列。必须至少有一个select_expr
。 table_references
指示要从中检索行的一个或多个表。第13.2.10.2节“ JOIN子句”中描述了其语法。SELECT
支持使用,PARTITION
在的表名后使用分区或子分区(或两者)的列表进行显式分区选择table_reference
(请参见 第13.2.10.2节“ JOIN子句”)。在这种情况下,仅从列出的分区中选择行,并且忽略表的任何其他分区。有关更多信息和示例,请参见 第23.5节“分区选择”。- 该
WHERE
子句(如果给出)指示必须满足行才能被选择的一个或多个条件。where_condition
是一个表达式,对于要选择的每一行,其值为true。如果没有WHERE
子句,该语句将选择所有行 。
在WHERE
表达式中,可以使用MySQL支持的任何功能和运算符,但聚合(摘要)功能除外。请参见 第9.5节“表达式”和 第12章,函数和运算符。
Select语句常规用法:
• Select * from students;##查看表中所有数据
• Select sid,sname from students; ##查看所有的sid和sname
• Select sid,sname from students where sid=1; ##查看符合条件的数据
• Select * from students order by sid; ##查看排序后的数据
• Select sex,count(*) from students group by sex having count(*)>=2; ##查看分组的数据
• Select * from students a inner join students2 b on a.sid=b.sid; ##查看两个表链接后的数据
• Select sid as a,sname as b from students;##字段使用别名的方法1
• Select sid a,sname b from students;##字段使用别名的方法2
SELECT 也可以用于检索不参考任何表而计算出的行。
例如:
mysql> select 1+1;
+-----+
| 1+1 |
+-----+
| 2 |
+-----+
1 row in set (0.03 sec)
mysql> select 500.1*2/3;
+-----------+
| 500.1*2/3 |
+-----------+
| 333.40000 |
+-----------+
1 row in set (0.03 sec)
mysql>
DUAL
在未引用任何表的情况下, 可以将其指定为虚拟表名称:
mysql> select 500.1*2/3 from dual;
+-----------+
| 500.1*2/3 |
+-----------+
| 333.40000 |
+-----------+
1 row in set (0.00 sec)
mysql>
DUAL
纯粹是为了方便那些要求所有SELECT 语句都应有FROM
其他条款的人。MySQL可能会忽略这些子句。FROM DUAL
如果没有引用表,MySQL不需要 。
通常,必须严格按照语法说明中显示的顺序给出所使用的子句。例如, HAVING
子句必须在任何 GROUP BY
子句之后和任何ORDER BY
子句之前。该INTO
子句(如果存在)可以出现在语法描述指示的任何位置,但是在给定语句内只能出现一次,不能出现在多个位置。有关更多信息 INTO
,请参见第13.2.10.1节“ SELECT ... INTO语句”。
select_expr
术语 列表包括指示要检索的列的选择列表。术语指定列或表达式,或者可以使用 *
-shorthand:
mysql> select * from customers7;
+---------+----------------+-----------------------+-----------+------------+----------+--------------+--------------+---------------------+
| cust_id | cust_name | cust_address | cust_city | cust_state | cust_zip | cust_country | cust_contact | cust_email |
+---------+----------------+-----------------------+-----------+------------+----------+--------------+--------------+---------------------+
| 110 | 大班 | 中国台湾 | 台湾 | 南山区 | NULL | 中国 | NULL | NULL |
| 123 | | 中国深圳南山区 | NULL | NULL | NULL | 中国 | NULL | NULL |
| 10001 | Coyote Inc. | 中国深圳南山区 | Detroit | MI | 44444 | 中国 | Y Lee | ylee@coyote.com |
| 10002 | Mouse House | 中国深圳南山区 | Columbus | OH | 43333 | 中国 | Jerry Mouse | NULL |
| 10003 | Wascals | 中国深圳南山区 | Muncie | IN | 42222 | 中国 | Jim Jones | rabbit@wascally.com |
| 10004 | Yosemite Place | 北京西城区 | Phoenix | AZ | 88888 | 中国 | Y Sam | sam@yosemite.com |
| 10005 | E Fudd | 北京西城区 | Chicago | IL | 54545 | 中国 | E Fudd | NULL |
+---------+----------------+-----------------------+-----------+------------+----------+--------------+--------------+---------------------+
7 rows in set (0.00 sec)
mysql> select cust_address,count(*) from customers7 group by cust_address;
+-----------------------+----------+
| cust_address | count(*) |
+-----------------------+----------+
| 中国台湾 | 1 |
| 中国深圳南山区 | 4 |
| 北京西城区 | 2 |
+-----------------------+----------+
3 rows in set (0.00 sec)
mysql> select cust_address,count(*) from customers7 group by cust_address;
+-----------------------+----------+
| cust_address | count(*) |
+-----------------------+----------+
| 中国台湾 | 1 |
| 中国深圳南山区 | 4 |
| 北京西城区 | 2 |
+-----------------------+----------+
3 rows in set (0.00 sec)
mysql> select cust_address,count(*) from customers7 group by cust_address having cust_address='中国台湾';
+--------------+----------+
| cust_address | count(*) |
+--------------+----------+
| 中国台湾 | 1 |
+--------------+----------+
1 row in set (0.00 sec)
mysql> select cust_address,count(*) from customers7 group by cust_address having cust_address in ('中国台湾','北京西城区');
+-----------------+----------+
| cust_address | count(*) |
+-----------------+----------+
| 中国台湾 | 1 |
| 北京西城区 | 2 |
+-----------------+----------+
2 rows in set (0.00 sec)
mysql>
mysql> select * from customers7 where cust_id >110;;
+---------+----------------+-----------------------+-----------+------------+----------+--------------+--------------+---------------------+
| cust_id | cust_name | cust_address | cust_city | cust_state | cust_zip | cust_country | cust_contact | cust_email |
+---------+----------------+-----------------------+-----------+------------+----------+--------------+--------------+---------------------+
| 123 | | 中国深圳南山区 | NULL | NULL | NULL | 中国 | NULL | NULL |
| 10001 | Coyote Inc. | 中国深圳南山区 | Detroit | MI | 44444 | 中国 | Y Lee | ylee@coyote.com |
| 10002 | Mouse House | 中国深圳南山区 | Columbus | OH | 43333 | 中国 | Jerry Mouse | NULL |
| 10003 | Wascals | 中国深圳南山区 | Muncie | IN | 42222 | 中国 | Jim Jones | rabbit@wascally.com |
| 10004 | Yosemite Place | 北京西城区 | Phoenix | AZ | 88888 | 中国 | Y Sam | sam@yosemite.com |
| 10005 | E Fudd | 北京西城区 | Chicago | IL | 54545 | 中国 | E Fudd | NULL |
+---------+----------------+-----------------------+-----------+------------+----------+--------------+--------------+---------------------+
6 rows in set (0.04 sec)
ERROR:
No query specified
mysql> select cust_address,count(*) from customers7 where cust_id >110 group by cust_address;
+-----------------------+----------+
| cust_address | count(*) |
+-----------------------+----------+
| 中国深圳南山区 | 4 |
| 北京西城区 | 2 |
+-----------------------+----------+
2 rows in set (0.00 sec)
mysql> select cust_address,count(*) from customers7 where cust_id >110 group by cust_address having count(*) >2;
+-----------------------+----------+
| cust_address | count(*) |
+-----------------------+----------+
| 中国深圳南山区 | 4 |
+-----------------------+----------+
1 row in set (0.00 sec)
mysql>
mysql> select * from customers7 order by cust_id;
+---------+----------------+-----------------------+-----------+------------+----------+--------------+--------------+---------------------+
| cust_id | cust_name | cust_address | cust_city | cust_state | cust_zip | cust_country | cust_contact | cust_email |
+---------+----------------+-----------------------+-----------+------------+----------+--------------+--------------+---------------------+
| 110 | 大班 | 中国台湾 | 台湾 | 南山区 | NULL | 中国 | NULL | NULL |
| 123 | | 中国深圳南山区 | NULL | NULL | NULL | 中国 | NULL | NULL |
| 10001 | Coyote Inc. | 中国深圳南山区 | Detroit | MI | 44444 | 中国 | Y Lee | ylee@coyote.com |
| 10002 | Mouse House | 中国深圳南山区 | Columbus | OH | 43333 | 中国 | Jerry Mouse | NULL |
| 10003 | Wascals | 中国深圳南山区 | Muncie | IN | 42222 | 中国 | Jim Jones | rabbit@wascally.com |
| 10004 | Yosemite Place | 北京西城区 | Phoenix | AZ | 88888 | 中国 | Y Sam | sam@yosemite.com |
| 10005 | E Fudd | 北京西城区 | Chicago | IL | 54545 | 中国 | E Fudd | NULL |
+---------+----------------+-----------------------+-----------+------------+----------+--------------+--------------+---------------------+
7 rows in set (0.00 sec)
mysql> select * from customers7 order by cust_id des;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'des' at line 1
mysql> select * from customers7 order by cust_id desc;
+---------+----------------+-----------------------+-----------+------------+----------+--------------+--------------+---------------------+
| cust_id | cust_name | cust_address | cust_city | cust_state | cust_zip | cust_country | cust_contact | cust_email |
+---------+----------------+-----------------------+-----------+------------+----------+--------------+--------------+---------------------+
| 10005 | E Fudd | 北京西城区 | Chicago | IL | 54545 | 中国 | E Fudd | NULL |
| 10004 | Yosemite Place | 北京西城区 | Phoenix | AZ | 88888 | 中国 | Y Sam | sam@yosemite.com |
| 10003 | Wascals | 中国深圳南山区 | Muncie | IN | 42222 | 中国 | Jim Jones | rabbit@wascally.com |
| 10002 | Mouse House | 中国深圳南山区 | Columbus | OH | 43333 | 中国 | Jerry Mouse | NULL |
| 10001 | Coyote Inc. | 中国深圳南山区 | Detroit | MI | 44444 | 中国 | Y Lee | ylee@coyote.com |
| 123 | | 中国深圳南山区 | NULL | NULL | NULL | 中国 | NULL | NULL |
| 110 | 大班 | 中国台湾 | 台湾 | 南山区 | NULL | 中国 | NULL | NULL |
+---------+----------------+-----------------------+-----------+------------+----------+--------------+--------------+---------------------+
7 rows in set (0.00 sec)
mysql> select * from customers7 having cust_city='Chicago' order by cust_id desc;
+---------+-----------+-----------------+-----------+------------+----------+--------------+--------------+------------+
| cust_id | cust_name | cust_address | cust_city | cust_state | cust_zip | cust_country | cust_contact | cust_email |
+---------+-----------+-----------------+-----------+------------+----------+--------------+--------------+------------+
| 10005 | E Fudd | 北京西城区 | Chicago | IL | 54545 | 中国 | E Fudd | NULL |
+---------+-----------+-----------------+-----------+------------+----------+--------------+--------------+------------+
1 row in set (0.00 sec)
mysql>
查询t1和t2表中所有的字段
• SELECT * FROM t1 INNER JOIN t2 ...
• SELECT t1.*, t2.* FROM t1 INNER JOIN t2
mysql> select * from products_temp;
+---------+---------+----------------+------------+-----------------------------+
| prod_id | vend_id | prod_name | prod_price | prod_desc |
+---------+---------+----------------+------------+-----------------------------+
| SAFE | 1003 | Safe | 50.00 | Safe with combination lock |
| SLING | 1003 | Sling | 4.49 | Sling, one size fits all |
| TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick |
| TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks |
+---------+---------+----------------+------------+-----------------------------+
4 rows in set (0.00 sec)
mysql> select * from orders_temp;
+-----------+---------------------+---------+
| order_num | order_date | cust_id |
+-----------+---------------------+---------+
| 20007 | 2005-09-30 00:00:00 | 10004 |
| 20008 | 2005-10-03 00:00:00 | 10005 |
| 20009 | 2005-10-08 00:00:00 | 10001 |
+-----------+---------------------+---------+
3 rows in set (0.00 sec)
mysql> select * from orders_temp inner join products_temp;
+-----------+---------------------+---------+---------+---------+----------------+------------+-----------------------------+
| order_num | order_date | cust_id | prod_id | vend_id | prod_name | prod_price | prod_desc |
+-----------+---------------------+---------+---------+---------+----------------+------------+-----------------------------+
| 20007 | 2005-09-30 00:00:00 | 10004 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock |
| 20008 | 2005-10-03 00:00:00 | 10005 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock |
| 20009 | 2005-10-08 00:00:00 | 10001 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock |
| 20007 | 2005-09-30 00:00:00 | 10004 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all |
| 20008 | 2005-10-03 00:00:00 | 10005 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all |
| 20009 | 2005-10-08 00:00:00 | 10001 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all |
| 20007 | 2005-09-30 00:00:00 | 10004 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick |
| 20008 | 2005-10-03 00:00:00 | 10005 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick |
| 20009 | 2005-10-08 00:00:00 | 10001 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick |
| 20007 | 2005-09-30 00:00:00 | 10004 | TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks |
| 20008 | 2005-10-03 00:00:00 | 10005 | TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks |
| 20009 | 2005-10-08 00:00:00 | 10001 | TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks |
+-----------+---------------------+---------+---------+---------+----------------+------------+-----------------------------+
12 rows in set (0.02 sec)
mysql> select orders_temp.*,products_temp.* from orders_temp inner join products_temp;
+-----------+---------------------+---------+---------+---------+----------------+------------+-----------------------------+
| order_num | order_date | cust_id | prod_id | vend_id | prod_name | prod_price | prod_desc |
+-----------+---------------------+---------+---------+---------+----------------+------------+-----------------------------+
| 20007 | 2005-09-30 00:00:00 | 10004 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock |
| 20008 | 2005-10-03 00:00:00 | 10005 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock |
| 20009 | 2005-10-08 00:00:00 | 10001 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock |
| 20007 | 2005-09-30 00:00:00 | 10004 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all |
| 20008 | 2005-10-03 00:00:00 | 10005 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all |
| 20009 | 2005-10-08 00:00:00 | 10001 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all |
| 20007 | 2005-09-30 00:00:00 | 10004 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick |
| 20008 | 2005-10-03 00:00:00 | 10005 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick |
| 20009 | 2005-10-08 00:00:00 | 10001 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick |
| 20007 | 2005-09-30 00:00:00 | 10004 | TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks |
| 20008 | 2005-10-03 00:00:00 | 10005 | TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks |
| 20009 | 2005-10-08 00:00:00 | 10001 | TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks |
+-----------+---------------------+---------+---------+---------+----------------+------------+-----------------------------+
12 rows in set (0.04 sec)
mysql>
Select_expr也可以使用MySQL内部的函数,另外字段也可以使用别名
• SELECT CONCAT(last_name,', ',first_name) AS full_name FROM mytable ORDER BY full_name;
• SELECT CONCAT(last_name,', ',first_name) full_name FROM mytable ORDER BY full_name;
mysql> select * from orders_temp;
+-----------+---------------------+---------+
| order_num | order_date | cust_id |
+-----------+---------------------+---------+
| 20007 | 2005-09-30 00:00:00 | 10004 |
| 20008 | 2005-10-03 00:00:00 | 10005 |
| 20009 | 2005-10-08 00:00:00 | 10001 |
+-----------+---------------------+---------+
3 rows in set (0.00 sec)
mysql> select concat(order_num,',',order_date) from orders_temp;
+----------------------------------+
| concat(order_num,',',order_date) |
+----------------------------------+
| 20007,2005-09-30 00:00:00 |
| 20008,2005-10-03 00:00:00 |
| 20009,2005-10-08 00:00:00 |
+----------------------------------+
3 rows in set (0.04 sec)
mysql>
Where条件中不能使用select_expr中定义的字段别名,因为语句执行顺序是where在select之前,所以where在执行时字段别名未知
ERROR 1054 (42S22): Unknown column 'a' in 'where clause'
mysql> select order_num a,order_date b from orders_temp where a=20007;
ERROR 1054 (42S22): Unknown column 'a' in 'where clause'
mysql> select order_num a,order_date b from orders_temp where order_num=20007;
+-------+---------------------+
| a | b |
+-------+---------------------+
| 20007 | 2005-09-30 00:00:00 |
+-------+---------------------+
1 row in set (0.00 sec)
From table_references子句中指定表名,tbl_name也可以指定别名,
当涉及的表不在当前的数据库时,需要使用db_name.tbl_name来指定表和所在的数据库名
• SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 WHERE t1.name = t2.name;
• SELECT t1.name, t2.salary FROM employee t1, info t2 WHERE t1.name = t2.name;
• 当多个表中有相同的字段名,且需要查询出来时,需要在select_expr中使用tbl_name.column_name来显视指定要查询哪个表的字段
查看另外的数据库的表数据
• Select * from test2.students;
• 两个数据库里的表关联查询
• Select * from students a inner join test2.students b on a.sid=b.sid;
• +------+-------+------+------+-------+
• | sid | sname | sex | sid | sname |
• +------+-------+------+------+-------+
• | 1 | aaa | 0 | 1 | abc |
• | 2 | ccc | 1 | 2 | bcd |
• 有相同字段名时要指定表名,可以用表的别名(注意执行顺序)
• mysql> select sname from students a inner join test2.students b on a.sid=b.sid;
• ERROR 1052 (23000): Column 'sname' in field list is ambiguous
• mysql> select a.sname from students a inner join test2.students b on a.sid=b.sid;
• +-------+
• | sname |
• +-------+
• | aaa |
• | ccc |
Group by子句代表分组,通常和聚合函数配合使用,如最大值max, 最小值min, 平均值avg, 个数count,求和sum
insert into scores
values(1,'english',88),(1,'chinese',86),(1,'math',90),(2,'english',95),(2,'chinese',
84);
• select sum(score) from scores;
• select sid,count(*),max(score),min(score),avg(score),sum(score) from scores
group by sid;
• +------+----------+------------+------------+------------+------------+
• | sid | count(*) | max(score) | min(score) | avg(score) | sum(score) |
• +------+----------+------------+------------+------------+------------+
• | 1 | 3 | 90 | 86 | 88.0000 | 264 |
• | 2 | 2 | 95 | 84 | 89.5000 | 179 |
• Order by和group by子句可以引用select_expr中的列,通过以下三种方式:
• SELECT college, region, seed FROM tournament
ORDER BY region, seed;
• SELECT college, region AS r, seed AS s FROM tournament
ORDER BY r, s;
• SELECT college, region, seed FROM tournament
ORDER BY 2, 3;
• Order by子句表示查询结果按照顺序排列,默认是升序排列,可以指定DESC
表明按照降序排列
• Having子句一般是跟在group by子句之后,代表限制分组之后的结果
• SELECT user, MAX(salary) FROM users
GROUP BY user HAVING MAX(salary) > 10;
• Limit子句用来限制查询结果的条数,其后可以带两位>0的整数,第一位代表
offset,第二位代表取多少行
• SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows,等同于select * from tbl limit 0,5
• SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Select … into语句代表将查询结果写入文件中或者定义的参数变量中
• For update关键词代表将查询的数据行加上写锁,直到本事务提交为止
• Lock in share mode关键词代表将查询的数据行加上读锁,则其他的链接可以读相同的数据但无法修改加锁的数据
• ALL/Distinct关键词代表是否将查询结果中完全重复的行都查询出来,ALL是默认值代表都查询出来,指定distinct代表重复行只显示一次
• HIGH_PRIORITY代表赋予读操作较高的操作优先级
• Max_statement_time=N子句代表设置语句执行超时时间(毫秒)
• Straight_join关键词代表强制优化器在表连接操作时按照语句中from子句中的表的顺序执行
• Sql_big_result/sql_small_result通常是和group by/distinct一起使用,其作用是事先告诉优化器查询结果是大还是小,以便优化器事先准备好将查询结果存放在磁盘临时表或者快速临时表中以便后续操作
• Sql_buffer_result强制将查询结果存入临时表中
• Sql_calc_found_rows关键词代表要求查询结果的同时计算结果的行数,以便后续通过SELECT FOUND_ROWS()直接获取行数
• Sql_cache/sql_no_cache代表是否直接从query cache中获取查询结果
• Select … into语句代表将查询结果存入定义的变量或者文件
• SELECT ... INTO var_list将查询结果存入定义的变量
• SELECT ... INTO OUTFILE将查询结果按照一定的格式写入到文件中
• SELECT ... INTO DUMPFILE将查询结果以一行的格式写入到文件中,且只能写入一行
• 当使用存入变量方法是,需要保证查询结果返回一行,如果不返回数据则报no data错误,如果返回多行则报Result consisted of more than one row错误,当返回行数不确定时,可以用limit 1强制只返回一行
• SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;
• 使用Select … into outfile ‘file_name’时,文件会创建在本地服务器上,所以要确保你的用户能创建文件,而且此file_name不能已经存在在服务器上以免覆盖其他文件
• SELECT sid,sname,sex INTO OUTFILE '/tmp/students.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM students;
• ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
• My.ini配置文件中添加secure_file_priv=/tmp/后重启再执行,成功
导出文件报错:
mysql> select orders_temp.*,products_temp.* into outfile '/tmp/orders_products.txt' from orders_temp inner join products_temp;
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
mysql>
通过增加secure_file_priv=/tmp/ 设置导出文件路径
[root@localhost ~]# cat /etc/my.cnf
[mysqld]
basedir=/mysql8/mysql
datadir=/mysql8/mysql_data
log_error=/mysql8/mysql_data/LogError.log
character-set-server=utf8
collation-server=utf8_unicode_ci
port=3306
secure_file_priv=/tmp/
[root@localhost ~]#
[root@localhost ~]# /etc/init.d/mysql restart
Shutting down MySQL..... SUCCESS!
Starting MySQL........... SUCCESS!
[root@localhost ~]#
导出成功:
mysql> select orders_temp.*,products_temp.* into outfile '/tmp/orders_products.txt' from orders_temp inner join products_temp;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 8
Current database: company
Query OK, 12 rows affected (0.09 sec)
mysql>
可以查看到文件:
[root@localhost ~]# cat /tmp/orders_products.txt
20007 2005-09-30 00:00:00 10004 SAFE 1003 Safe 50.00 Safe with combination lock
20008 2005-10-03 00:00:00 10005 SAFE 1003 Safe 50.00 Safe with combination lock
20009 2005-10-08 00:00:00 10001 SAFE 1003 Safe 50.00 Safe with combination lock
20007 2005-09-30 00:00:00 10004 SLING 1003 Sling 4.49 Sling, one size fits all
20008 2005-10-03 00:00:00 10005 SLING 1003 Sling 4.49 Sling, one size fits all
20009 2005-10-08 00:00:00 10001 SLING 1003 Sling 4.49 Sling, one size fits all
20007 2005-09-30 00:00:00 10004 TNT1 1003 TNT (1 stick) 2.50 TNT, red, single stick
20008 2005-10-03 00:00:00 10005 TNT1 1003 TNT (1 stick) 2.50 TNT, red, single stick
20009 2005-10-08 00:00:00 10001 TNT1 1003 TNT (1 stick) 2.50 TNT, red, single stick
20007 2005-09-30 00:00:00 10004 TNT2 1003 TNT (5 sticks) 10.00 TNT, red, pack of 10 sticks
20008 2005-10-03 00:00:00 10005 TNT2 1003 TNT (5 sticks) 10.00 TNT, red, pack of 10 sticks
20009 2005-10-08 00:00:00 10001 TNT2 1003 TNT (5 sticks) 10.00 TNT, red, pack of 10 sticks
[root@localhost ~]#
还可以增加参数修改分隔符等:
enclosed表示给每个字段前后加符号,fields terminated 表示给每个字段间加分隔符 lines terminated 表示给每行末尾加符号
mysql> select orders_temp.*,products_temp.* into outfile '/tmp/orders_products2.txt' fields terminated by '|' optionally enclosed by '#' lines terminated by '\n' from orders_temp inner join products_temp;
Query OK, 12 rows affected (0.00 sec)
mysql>
optionally 表示给chart varchart 类型的字段前后加符号
mysql> select orders_temp.*,products_temp.* into outfile '/tmp/orders_products3.txt' fields terminated by '|' enclosed by '#' lines terminated by '\n' from orders_temp inner join products_temp;
Query OK, 12 rows affected (0.00 sec)
mysql>
查看文件生成内容:
[root@localhost ~]# cat /tmp/orders_products.txt
20007 2005-09-30 00:00:00 10004 SAFE 1003 Safe 50.00 Safe with combination lock
20008 2005-10-03 00:00:00 10005 SAFE 1003 Safe 50.00 Safe with combination lock
20009 2005-10-08 00:00:00 10001 SAFE 1003 Safe 50.00 Safe with combination lock
20007 2005-09-30 00:00:00 10004 SLING 1003 Sling 4.49 Sling, one size fits all
20008 2005-10-03 00:00:00 10005 SLING 1003 Sling 4.49 Sling, one size fits all
20009 2005-10-08 00:00:00 10001 SLING 1003 Sling 4.49 Sling, one size fits all
20007 2005-09-30 00:00:00 10004 TNT1 1003 TNT (1 stick) 2.50 TNT, red, single stick
20008 2005-10-03 00:00:00 10005 TNT1 1003 TNT (1 stick) 2.50 TNT, red, single stick
20009 2005-10-08 00:00:00 10001 TNT1 1003 TNT (1 stick) 2.50 TNT, red, single stick
20007 2005-09-30 00:00:00 10004 TNT2 1003 TNT (5 sticks) 10.00 TNT, red, pack of 10 sticks
20008 2005-10-03 00:00:00 10005 TNT2 1003 TNT (5 sticks) 10.00 TNT, red, pack of 10 sticks
20009 2005-10-08 00:00:00 10001 TNT2 1003 TNT (5 sticks) 10.00 TNT, red, pack of 10 sticks
[root@localhost ~]# cat /tmp/orders_products2.txt
20007|#2005-09-30 00:00:00#|10004|#SAFE#|1003|#Safe#|50.00|#Safe with combination lock#
20008|#2005-10-03 00:00:00#|10005|#SAFE#|1003|#Safe#|50.00|#Safe with combination lock#
20009|#2005-10-08 00:00:00#|10001|#SAFE#|1003|#Safe#|50.00|#Safe with combination lock#
20007|#2005-09-30 00:00:00#|10004|#SLING#|1003|#Sling#|4.49|#Sling, one size fits all#
20008|#2005-10-03 00:00:00#|10005|#SLING#|1003|#Sling#|4.49|#Sling, one size fits all#
20009|#2005-10-08 00:00:00#|10001|#SLING#|1003|#Sling#|4.49|#Sling, one size fits all#
20007|#2005-09-30 00:00:00#|10004|#TNT1#|1003|#TNT (1 stick)#|2.50|#TNT, red, single stick#
20008|#2005-10-03 00:00:00#|10005|#TNT1#|1003|#TNT (1 stick)#|2.50|#TNT, red, single stick#
20009|#2005-10-08 00:00:00#|10001|#TNT1#|1003|#TNT (1 stick)#|2.50|#TNT, red, single stick#
20007|#2005-09-30 00:00:00#|10004|#TNT2#|1003|#TNT (5 sticks)#|10.00|#TNT, red, pack of 10 sticks#
20008|#2005-10-03 00:00:00#|10005|#TNT2#|1003|#TNT (5 sticks)#|10.00|#TNT, red, pack of 10 sticks#
20009|#2005-10-08 00:00:00#|10001|#TNT2#|1003|#TNT (5 sticks)#|10.00|#TNT, red, pack of 10 sticks#
[root@localhost ~]# cat /tmp/orders_products3.txt
#20007#|#2005-09-30 00:00:00#|#10004#|#SAFE#|#1003#|#Safe#|#50.00#|#Safe with combination lock#
#20008#|#2005-10-03 00:00:00#|#10005#|#SAFE#|#1003#|#Safe#|#50.00#|#Safe with combination lock#
#20009#|#2005-10-08 00:00:00#|#10001#|#SAFE#|#1003#|#Safe#|#50.00#|#Safe with combination lock#
#20007#|#2005-09-30 00:00:00#|#10004#|#SLING#|#1003#|#Sling#|#4.49#|#Sling, one size fits all#
#20008#|#2005-10-03 00:00:00#|#10005#|#SLING#|#1003#|#Sling#|#4.49#|#Sling, one size fits all#
#20009#|#2005-10-08 00:00:00#|#10001#|#SLING#|#1003#|#Sling#|#4.49#|#Sling, one size fits all#
#20007#|#2005-09-30 00:00:00#|#10004#|#TNT1#|#1003#|#TNT (1 stick)#|#2.50#|#TNT, red, single stick#
#20008#|#2005-10-03 00:00:00#|#10005#|#TNT1#|#1003#|#TNT (1 stick)#|#2.50#|#TNT, red, single stick#
#20009#|#2005-10-08 00:00:00#|#10001#|#TNT1#|#1003#|#TNT (1 stick)#|#2.50#|#TNT, red, single stick#
#20007#|#2005-09-30 00:00:00#|#10004#|#TNT2#|#1003#|#TNT (5 sticks)#|#10.00#|#TNT, red, pack of 10 sticks#
#20008#|#2005-10-03 00:00:00#|#10005#|#TNT2#|#1003#|#TNT (5 sticks)#|#10.00#|#TNT, red, pack of 10 sticks#
#20009#|#2005-10-08 00:00:00#|#10001#|#TNT2#|#1003#|#TNT (5 sticks)#|#10.00#|#TNT, red, pack of 10 sticks#
[root@localhost ~]#
• 在MySQL中,join/inner join/cross join三者的意思是一样的
• Join语句中表别名的用法
• SELECT t1.name, t2.salary FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
• SELECT t1.name, t2.salary FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
• From子句后面还可以跟子查询,但子查询必须带别名
• SELECT * FROM (SELECT 1, 2, 3) AS t1;
• 当inner join或者表之间用逗号隔开,且没有表之间的关联字段,则代表结果是两者的笛卡尔积
• conditional_expr子句一般代表指定两个表之间的关联条件,而where条件中指定查询结果的筛选条件
• STRAIGHT_JOIN和Join的用法大致相同,唯一不同是确保左表是先被读取的,以保证优化器的读取顺序
一般所说的左连接,外连接是指左外连接,右外连接。
左外连接是以左边的表为基准。通俗的讲,先将左边的表全部显示出来,然后右边的表id与左边表id相同的记录就“拼接”上去,比如说id为1的记录。如果没有匹配的id,比如说t1中id为2的t2中就没有。那边就以null显示。
右外连接过程正好相反。
内连接就是只取出符合过滤条件的记录 也就是orders_temp.id=products_temp.id 那么符合orders_temp.id=products_temp.id
的记录只有三条,所以只显示三条。 不像外连接,是将你作为基准的表(左外连接就是左边表为基准,右外连接就是右边表为基准)的所有行都显示出来。
mysql> select * from products_temp;
+---------+---------+----------------+------------+-----------------------------+----+
| prod_id | vend_id | prod_name | prod_price | prod_desc | id |
+---------+---------+----------------+------------+-----------------------------+----+
| SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 |
| SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 |
| TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 |
| TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks | 4 |
+---------+---------+----------------+------------+-----------------------------+----+
4 rows in set (0.00 sec)
mysql> select * from orders_temp;
+-----------+---------------------+---------+----+
| order_num | order_date | cust_id | id |
+-----------+---------------------+---------+----+
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 |
+-----------+---------------------+---------+----+
3 rows in set (0.00 sec)
mysql> select * from products_temp inner join orders_temp;
+---------+---------+----------------+------------+-----------------------------+----+-----------+---------------------+---------+----+
| prod_id | vend_id | prod_name | prod_price | prod_desc | id | order_num | order_date | cust_id | id |
+---------+---------+----------------+------------+-----------------------------+----+-----------+---------------------+---------+----+
| SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 | 20007 | 2005-09-30 00:00:00 | 10004 | 1 |
| SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 | 20008 | 2005-10-03 00:00:00 | 10005 | 2 |
| SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 | 20009 | 2005-10-08 00:00:00 | 10001 | 3 |
| SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 | 20007 | 2005-09-30 00:00:00 | 10004 | 1 |
| SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 | 20008 | 2005-10-03 00:00:00 | 10005 | 2 |
| SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 | 20009 | 2005-10-08 00:00:00 | 10001 | 3 |
| TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 | 20007 | 2005-09-30 00:00:00 | 10004 | 1 |
| TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 | 20008 | 2005-10-03 00:00:00 | 10005 | 2 |
| TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 | 20009 | 2005-10-08 00:00:00 | 10001 | 3 |
| TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks | 4 | 20007 | 2005-09-30 00:00:00 | 10004 | 1 |
| TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks | 4 | 20008 | 2005-10-03 00:00:00 | 10005 | 2 |
| TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks | 4 | 20009 | 2005-10-08 00:00:00 | 10001 | 3 |
+---------+---------+----------------+------------+-----------------------------+----+-----------+---------------------+---------+----+
12 rows in set (0.01 sec)
mysql> select * from orders_temp inner join products_temp;
+-----------+---------------------+---------+----+---------+---------+----------------+------------+-----------------------------+----+
| order_num | order_date | cust_id | id | prod_id | vend_id | prod_name | prod_price | prod_desc | id |
+-----------+---------------------+---------+----+---------+---------+----------------+------------+-----------------------------+----+
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 |
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 |
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 |
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 | TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks | 4 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 | TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks | 4 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 | TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks | 4 |
+-----------+---------------------+---------+----+---------+---------+----------------+------------+-----------------------------+----+
12 rows in set (0.00 sec)
mysql> select * from orders_temp left join products_temp;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
mysql> select * from orders_temp left join products_temp;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
mysql> select * from orders_temp left join products_temp on orders_temp.id=products_temp.id;
+-----------+---------------------+---------+----+---------+---------+---------------+------------+----------------------------+------+
| order_num | order_date | cust_id | id | prod_id | vend_id | prod_name | prod_price | prod_desc | id |
+-----------+---------------------+---------+----+---------+---------+---------------+------------+----------------------------+------+
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 |
+-----------+---------------------+---------+----+---------+---------+---------------+------------+----------------------------+------+
3 rows in set (0.00 sec)
mysql> select * from orders_temp right join products_temp on orders_temp.id=products_temp.id;
+-----------+---------------------+---------+------+---------+---------+----------------+------------+-----------------------------+----+
| order_num | order_date | cust_id | id | prod_id | vend_id | prod_name | prod_price | prod_desc | id |
+-----------+---------------------+---------+------+---------+---------+----------------+------------+-----------------------------+----+
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 |
| NULL | NULL | NULL | NULL | TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks | 4 |
+-----------+---------------------+---------+------+---------+---------+----------------+------------+-----------------------------+----+
4 rows in set (0.00 sec)
mysql> select * from products_temp inner join orders_temp on products_temp.id=orders_temp.id;
+---------+---------+---------------+------------+----------------------------+----+-----------+---------------------+---------+----+
| prod_id | vend_id | prod_name | prod_price | prod_desc | id | order_num | order_date | cust_id | id |
+---------+---------+---------------+------------+----------------------------+----+-----------+---------------------+---------+----+
| SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 | 20007 | 2005-09-30 00:00:00 | 10004 | 1 |
| SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 | 20008 | 2005-10-03 00:00:00 | 10005 | 2 |
| TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 | 20009 | 2005-10-08 00:00:00 | 10001 | 3 |
+---------+---------+---------------+------------+----------------------------+----+-----------+---------------------+---------+----+
3 rows in set (0.00 sec)
mysql> select * from orders_temp inner join products_temp on products_temp.id=orders_temp.id;
+-----------+---------------------+---------+----+---------+---------+---------------+------------+----------------------------+----+
| order_num | order_date | cust_id | id | prod_id | vend_id | prod_name | prod_price | prod_desc | id |
+-----------+---------------------+---------+----+---------+---------+---------------+------------+----------------------------+----+
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 |
+-----------+---------------------+---------+----+---------+---------+---------------+------------+----------------------------+----+
3 rows in set (0.00 sec)
连接并用的情况:
mysql> select * from orders_temp;
+-----------+---------------------+---------+----+
| order_num | order_date | cust_id | id |
+-----------+---------------------+---------+----+
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 |
+-----------+---------------------+---------+----+
3 rows in set (0.00 sec)
mysql> select * from orders_temp2;
+-----------+---------------------+---------+----+
| order_num | order_date | cust_id | id |
+-----------+---------------------+---------+----+
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 |
| 0 | 2015-10-08 00:00:00 | 10009 | 0 |
+-----------+---------------------+---------+----+
4 rows in set (0.00 sec)
mysql> select * from products_temp;
+---------+---------+----------------+------------+-----------------------------+----+
| prod_id | vend_id | prod_name | prod_price | prod_desc | id |
+---------+---------+----------------+------------+-----------------------------+----+
| SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 |
| SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 |
| TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 |
| TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks | 4 |
+---------+---------+----------------+------------+-----------------------------+----+
4 rows in set (0.00 sec)
mysql> select * from orders_temp2 left join products_temp on orders_temp2.id=products_temp.id;
+-----------+---------------------+---------+----+---------+---------+---------------+------------+----------------------------+------+
| order_num | order_date | cust_id | id | prod_id | vend_id | prod_name | prod_price | prod_desc | id |
+-----------+---------------------+---------+----+---------+---------+---------------+------------+----------------------------+------+
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 |
| 0 | 2015-10-08 00:00:00 | 10009 | 0 | NULL | NULL | NULL | NULL | NULL | NULL |
+-----------+---------------------+---------+----+---------+---------+---------------+------------+----------------------------+------+
4 rows in set (0.00 sec)
mysql> select * from orders_temp2 left join products_temp on orders_temp2.id=products_temp.id inner join orders_temp on orders_temp2.id=orders_temp.id;
+-----------+---------------------+---------+----+---------+---------+---------------+------------+----------------------------+------+-----------+---------------------+---------+----+
| order_num | order_date | cust_id | id | prod_id | vend_id | prod_name | prod_price | prod_desc | id | order_num | order_date | cust_id | id |
+-----------+---------------------+---------+----+---------+---------+---------------+------------+----------------------------+------+-----------+---------------------+---------+----+
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 | SAFE | 1003 | Safe | 50.00 | Safe with combination lock | 1 | 20007 | 2005-09-30 00:00:00 | 10004 | 1 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 | SLING | 1003 | Sling | 4.49 | Sling, one size fits all | 2 | 20008 | 2005-10-03 00:00:00 | 10005 | 2 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 | TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick | 3 | 20009 | 2005-10-08 00:00:00 | 10001 | 3 |
+-----------+---------------------+---------+----+---------+---------+---------------+------------+----------------------------+------+-----------+---------------------+---------+----+
3 rows in set (0.00 sec)#只有三条记录的原因是可以先把inner join前面的sql执行,返回的表再inner join
Union用来将多个select语句的执行结果合并成一个结果
• 第一个select语句的column_name会被当做最后查询结果的列名,接下来的每个select语句所一一对应的列应该和第一个语句的列的数据类型最好保持一致
• 默认情况下union语句会把最终结果中的重复行去掉,这和增加distinct这个关键词的作用一样,如果使用union all则代表最终结果中的重复行保留
mysql> select * from orders_temp;
+-----------+---------------------+---------+----+
| order_num | order_date | cust_id | id |
+-----------+---------------------+---------+----+
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 |
+-----------+---------------------+---------+----+
3 rows in set (0.00 sec)
mysql> select * from orders_temp2;
+-----------+---------------------+---------+----+
| order_num | order_date | cust_id | id |
+-----------+---------------------+---------+----+
| 20007 | 2005-09-30 00:00:00 | 10004 | 1 |
| 20008 | 2005-10-03 00:00:00 | 10005 | 2 |
| 20009 | 2005-10-08 00:00:00 | 10001 | 3 |
| 0 | 2015-10-08 00:00:00 | 10009 | 0 |
+-----------+---------------------+---------+----+
4 rows in set (0.00 sec)
mysql> select order_num,order_date from orders_temp union select order_num,order_date from orders_temp2;
+-----------+---------------------+
| order_num | order_date |
+-----------+---------------------+
| 20007 | 2005-09-30 00:00:00 |
| 20008 | 2005-10-03 00:00:00 |
| 20009 | 2005-10-08 00:00:00 |
| 0 | 2015-10-08 00:00:00 |
+-----------+---------------------+
4 rows in set (0.00 sec)
mysql> select order_num,order_date from orders_temp union all select order_num,order_date from orders_temp2;
+-----------+---------------------+
| order_num | order_date |
+-----------+---------------------+
| 20007 | 2005-09-30 00:00:00 |
| 20008 | 2005-10-03 00:00:00 |
| 20009 | 2005-10-08 00:00:00 |
| 20007 | 2005-09-30 00:00:00 |
| 20008 | 2005-10-03 00:00:00 |
| 20009 | 2005-10-08 00:00:00 |
| 0 | 2015-10-08 00:00:00 |
+-----------+---------------------+
7 rows in set (0.00 sec)
mysql>
• 如果相对union语句的最后结果做排序或者limit限制,则需要将每个select语句用括号括起来,把order by或limit语句放在最后
mysql> (select order_num,order_date from orders_temp) union all (select order_num,order_date from orders_temp2) order by order_num limit 3;
+-----------+---------------------+
| order_num | order_date |
+-----------+---------------------+
| 0 | 2015-10-08 00:00:00 |
| 20007 | 2005-09-30 00:00:00 |
| 20007 | 2005-09-30 00:00:00 |
+-----------+---------------------+
3 rows in set (0.00 sec)
mysql>