SELECT FROM语句
在 MySQL 中,可以使用 SELECT 语句来查询数据。查询数据是指从数据库中根据需求,使用不同的查询方式来获取不同的数据,是使用频率最高、最重要的操作。
语法格式:
SELECT * / select_list1 (, select_list2, ...)
FROM table_name1 (, table_name2, ...);
'''
[WHERE <表达式>
[GROUP BY <group by definition>
[HAVING <expression> [{<operator> <expression>}…]]
[ORDER BY <order by definition>]
[LIMIT[<offset>,] <row count>]
]'''
-
SELCECT
:需要查询的字段可以为一个或多个 -
使用
*
可以查询所有字段 ,使用’ * '查询时,只能按照数据表中字段的顺序进行排列,不能改变字段的排列顺序 -
如果忘记了字段名称,可以使用
DESC
命令查看表的结构 -
FROM
:查询数据的来源,可以为一个或多个表
当执行 SELECT
语句时,MySQL在 SELECT
子句之前先执行 FROM
子句
SELECT 语句
可以单独使用 SELECT 语句来执行一些简单的操作
SELECT 1+1;
'''
+-------+
| 1 + 1 |
+-------+
| 2 |
+-------+
1 row in set (0.00 sec)
'''
可以借助 SELECT
语句来执行 MySQL 中的内置函数:
SELECT NOW();
'''
+---------------------+
| NOW() |
+---------------------+
| 2021-07-26 08:08:02 |
+---------------------+
1 row in set (0.00 sec)
'''
SELECT CONCAT('John',' ','Will');
'''
+--------------------------+
| CONCAT('John',' ','Will') |
+--------------------------+
| John Will |
+--------------------------+
1 row in set (0.00 sec)
'''
dual table
使用 SELECT FROM dual
这样的语法来执行一个简单的查询,即从名为 dual
的虚拟表中检索数据。
虚拟表 dual
是一个特殊的表,通常只包含一行和一列,并且在没有实际表可用时用作占位符。
语法结构:
SELECT expression
FROM dual;
由于虚拟表 dual
只包含一行一列,因此无论在查询中使用的表达式或函数返回什么结果,都只会得到一行结果。
这种语法特别适用于需要计算一些值或执行简单的查询操作,而无需实际的表存在的情况。
SELECT CURDATE() AS curdate
FROM dual;
'''
+------------+
| curdate |
+------------+
| 2023-09-23 |
+------------+
1 row in set (0.03 sec)
'''
AS 设置别名
为了查询方便,可以使用 AS 关键字来为表和字段指定别名。
语法格式:
SELECT expression AS column_alias;
- AS 关键字可以省略,省略后需要将表名/字段名 用空格隔开
为字段设置别名
-
无法在 WHERE 语句中使用,条件表达式中不能使用字段的别名,否则会出现“
ERROR 1054 (42S22): Unknown column
”这样的错误提示信息。
因为Mysql 会先执行WHERE再执行 SELECT -
设置别名后,可以在[[Sorting data in Tables|ORDER BY]]、 GROUP BY、 HAVING 语句中使用别名来指代字段。
也可以在执行函数后为字段设置别名:
SELECT
CONCAT_WS(', ', lastName, firstname) AS `Full name`
FROM
employees;
为表设置别名
-
表的别名不能与该数据库的其它表同名。字段的别名不能与该表的其它字段同名。
-
表别名只在执行查询时使用,并不在返回结果中显示。而字段定义别名之后,会返回给客户端显示,显示的字段为字段的别名。
-
为表设置别名后,也可以在[[Subqueries 子查询|子查询]]的 INNER JOIN、 LEFT JOIN、
RIGHT JOIN 语句中使用别名
为表设置别名后,可以通过以下方式访问表中字段:
table_name AS alias_name;
table_name.column_name;
'''示例'''
SELECT
e.firstName,
e.lastName
FROM
employees e
ORDER BY e.firstName;
若遇到两个表具有相同字段名的情况下,在子查询时会报错:
Error Code: 1052. Column 'customerNumber' in on clause is ambiguous
为避免这种错误,可以为表设置一个别名来限定相同字段名的列;若不使用这种方法,则需要用 table_name.column_name
的方法来访问目标字段,这大大降低了可读性。
SELECT
customerName,
COUNT(o.orderNumber) total
FROM
customers c
INNER JOIN orders o ON c.customerNumber = o.customerNumber
GROUP BY
customerName
ORDER BY
total DESC;