MySQL select语句


MySQL SELECT语句用于从MySQL中的一个或多个表中检索记录。

在本教程中,将通过语法和示例说明如何使用MySQL SELECT语句。

MySQL select语句语法

MySQL的SELECT语句的完整语法是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT [ ALL | DISTINCT | DISTINCTROW ]
[ HIGH_PRIORITY ]
[ STRAIGHT_JOIN ]
[ SQL_SMALL_RESULT | SQL_BIG_RESULT ] [ SQL_BUFFER_RESULT ]
[ SQL_CACHE | SQL_NO_CACHE ]
[ SQL_CALC_FOUND_ROWS ]
expressions
FROM tables
[WHERE conditions]
[GROUP BY expressions]
[HAVING condition]
[ORDER BY expression [ ASC | DESC ]]
[LIMIT [offset_value] number_rows | LIMIT number_rows OFFSET offset_value]
[PROCEDURE procedure_name]
[INTO [ OUTFILE 'file_name' options
| DUMPFILE 'file_name'
| @variable1, @variable2, ... @variable_n]
[FOR UPDATE | LOCK IN SHARE MODE];

里面有很多关键词。

一般我们都先用MySQL中SELECT语句语法中最简单的形式:

1
2
3
SELECT expressions
FROM tables
[WHERE conditions];

然后再根据需要添加相应的关键词。

MySQL SELECT语句关键词的说明

在语法中,中括号[]括起来的都是可选的

关键字 说明
SELECT 指定执行SELECT操作
ALL 可选的。返回所有匹配的行
DISTINCT 可选的。从结果集中删除重复项。
DISTINCTROW 可选的。 和DISTINCT一样
HIGH_PRIORITY 可选的。它告诉MySQL,当SELECT和UPDATE语句在等待相同资源时,先运行SELECT。它可以和使用了表级锁定的MyISAM,MEMORY和MERGE表一起使用。
STRAIGHT_JOIN 可选的。它告诉MySQL按照在FROM子句中列出的顺序连接表。
SQL_SMALL_RESULT 可选的。使用快速临时表存储结果(与DISTINCT和GROUP BY一起使用)。(避免排序和IO操作)
SQL_BIG_RESULT 可选的。优先做排序操作,而不是使用临时表存储结果(与DISTINCT和GROUP BY一起使用)。
SQL_BUFFER_RESULT 可选的。使用临时表存储结果(不能与子查询一起使用)。
SQL_CACHE 可选的。将结果存储在查询缓存中。
SQL_NO_CACHE 可选的。不要将结果存储在查询缓存中。
SQL_CALC_FOUND_ROWS 可选的。计算结果集中有多少条之后可以使用FOUND_ROWS函数检索出来的记录(不考虑LIMIT修饰符)。
expressions 想要获取的列或者表达式。如果想选择所有列,那么用 星号*
FROM tables 从哪些表获取数据。在FROM子句中必须列出至少一个表。
WHERE conditions 可选的。conditions是选择的数据行必须满足的条件。
GROUP BY expressions 可选的。跨多个记录收集数据,并按一个或多个列对结果进行分组。
HAVING condition 可选的。与GROUP BY组合使用,结果只返回那些满足条件 condition的行组。
ORDER BY expression 可选的。用于对结果集中的记录(数据行)进行排序。
LIMIT 可选的。限定返回结果的行数。最大数由上面的number_rows指定,而offset_value指定了从结果集中的第几行开始算,默认是第一行。
PROCEDURE 可选的。用于指定对结果集中的数据进行处理的过程。procedure_name是过程名称
INTO 将结果集写入到文件或者变量。 比如
INTO OUTFILE 'filename' options
INTO DUMPFILE 'filename'
INTO @variable1, @variable2
FOR UPDATE 可选的。(写锁)受查询影响的记录将被写锁锁定,直到事务完成。
LOCK IN SHARE MODE 可选的。(共享模式锁定)受查询影响的记录可以被其他事务使用,但不能被那些其他事务更新或删除。

MySQL select语句例子

MySQL SELECT从一个表中查询所有字段

1
2
3
4
SELECT *
FROM orderdetails
WHERE quantity >= 20
ORDER BY quantity DESC;
  • *表示选择所有字段,
  • quantity>=20 只获取数量大于或等于20的记录,
  • 结果集按quantity降序排序。

MySQL SELECT从一个表中只选择特定的字段

1
2
3
4
SELECT orderid, quantity, unitprice
FROM orderdetails
WHERE quantity < 300
ORDER BY quantity ASC, unitprice DESC;
  • 只返回order_id、quantity和unit_price字段,
  • 这些字段来自order_details表,
  • 只返回quantity小于300的记录。
  • 结果按数量进行升序排序,然后按unit_price进行降序排序。

MySQL SELECT从多个表中检索字段

1
2
3
4
5
SELECT orders.OrderID, customers.CompanyName
FROM customers
INNER JOIN orders
ON customers.CustomerID = orders.CustomerID
ORDER BY OrderID;
  • 我们通过 CustomerID将两个表连接在一起。
  • 然后选择检索orders_id和customer_name两个字段。
  • 最后对结果集按order_id升序排序。

MySQL SELECT将结果集写入文件

1
2
3
4
5
6
7
SELECT OrderID, Quantity, UnitPrice
FROM orderdetails
WHERE Quantity < 500
ORDER BY Quantity
INTO OUTFILE 'results.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
  • 执行该MySQL SELECT语句后,将会在数据库的目录(比如D:\mysqldata\northwind) 下创建一个results.txt。
  • 所有的数据将保存在这个文件中。
  • 其中,每一条记录通过 换行符号\n进行分割,所有每条记录一行。
  • 每个字段通过 逗号,进行分隔,
  • 如果字段需要封装起来,那么就是用 分号

INTO OUTFILE 'filename' options中的options可以指定为以下值

FIELDS ESCAPED BY 'character'
FIELDS TERMINATED BY 'character' [ OPTIONALLY ENCLOSED BY 'character' ]
LINES TERMINATED BY 'character'

character是某一个字符,比如 逗号,, 分号;

ESCAPED表示转义
TERMINATED表示分隔
ENCLOSED表示封装 (比如字段的值本身带有 逗号,, 那么就需要封装起来)


原文链接:https://codingdict.com/