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
也可以用于检索不参考任何表而计算出的行。
例如:
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 | [email protected] | | 10002 | Mouse House | 中国深圳南山区 | Columbus | OH | 43333 | 中国 | Jerry Mouse | NULL | | 10003 | Wascals | 中国深圳南山区 | Muncie | IN | 42222 | 中国 | Jim Jones | [email protected] | | 10004 | Yosemite Place | 北京西城区 | Phoenix | AZ | 88888 | 中国 | Y Sam | [email protected] | | 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 | [email protected] | | 10002 | Mouse House | 中国深圳南山区 | Columbus | OH | 43333 | 中国 | Jerry Mouse | NULL | | 10003 | Wascals | 中国深圳南山区 | Muncie | IN | 42222 | 中国 | Jim Jones | [email protected] | | 10004 | Yosemite Place | 北京西城区 | Phoenix | AZ | 88888 | 中国 | Y Sam | [email protected] | | 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 | [email protected] | | 10002 | Mouse House | 中国深圳南山区 | Columbus | OH | 43333 | 中国 | Jerry Mouse | NULL | | 10003 | Wascals | 中国深圳南山区 | Muncie | IN | 42222 | 中国 | Jim Jones | [email protected] | | 10004 | Yosemite Place | 北京西城区 | Phoenix | AZ | 88888 | 中国 | Y Sam | [email protected] | | 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 | [email protected] | | 10003 | Wascals | 中国深圳南山区 | Muncie | IN | 42222 | 中国 | Jim Jones | [email protected] | | 10002 | Mouse House | 中国深圳南山区 | Columbus | OH | 43333 | 中国 | Jerry Mouse | NULL | | 10001 | Coyote Inc. | 中国深圳南山区 | Detroit | MI | 44444 | 中国 | Y Lee | [email protected] | | 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>
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>
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>
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)
查看另外的数据库的表数据
• Straight_join关键词代表强制优化器在表连接操作时按照语句中from子句中的表的顺序执行
• Sql_cache/sql_no_cache代表是否直接从query cache中获取查询结果
• SELECT sid,sname,sex INTO OUTFILE '/tmp/students.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM students;
导出文件报错:
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 ~]#
一般所说的左连接,外连接是指左外连接,右外连接。
左外连接是以左边的表为基准。通俗的讲,先将左边的表全部显示出来,然后右边的表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
• 第一个select语句的column_name会被当做最后查询结果的列名,接下来的每个select语句所一一对应的列应该和第一个语句的列的数据类型最好保持一致
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>
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>