MySql select介绍|初级使用综合实践
MySQL中的 SELECT
语句是用于从数据库中检索数据的核心命令。它提供了丰富的功能,允许用户以各种方式查询、筛选、排序、聚合和格式化存储在表中的数据。以下是对 SELECT
语句的详细说明,包括其基本语法、关键组成部分、常用选项和高级特性:
基本语法
SELECT
select_list
FROM
table_name
[WHERE conditions]
[GROUP BY column_list]
[HAVING conditions]
[ORDER BY column_list [ASC | DESC]]
[LIMIT offset, row_count]
[OFFSET row_count]
[WITH ROLLUP]
[JOIN ... ON ...]
[UNION | UNION ALL ...]
[EXCEPT | INTERSECT ...]
关键组成部分
1. SELECT
列表 (select_list
)
指定了要从表中检索的列或表达式。可以包括以下几种形式:
- 单个列:
SELECT column_name
- 多个列:
SELECT column1, column2, ...
- 所有列:
SELECT *
(星号表示选取表中的所有列) - 计算表达式或函数应用:
SELECT column1 + column2 AS sum_column, COUNT(*) AS count_all
- 别名: 使用
AS
关键字为列或表达式指定别名,如SELECT column1 AS alias_name
2. FROM
子句 (table_name
)
指定了要从中检索数据的表或视图。可以是一个单独的表名,也可以是多个表通过连接操作(如 JOIN
)组合而成的表集合。
3. WHERE
子句 (conditions
)
用于设置查询的筛选条件。只有满足条件的行才会被包含在结果集中。例如:
WHERE column_name = value OR column2 > 10 AND column3 IS NOT NULL
4. GROUP BY
子句 (column_list
)
对结果集按照一个或多个列进行分组,通常用于配合聚合函数(如 COUNT()
, SUM()
, AVG()
, MAX()
, MIN()
等)计算每个组的统计值。
5. HAVING
子句 (conditions
)
类似于 WHERE
子句,但用于对已经分组后的结果集施加条件。HAVING
常与 GROUP BY
一起使用,用于过滤满足特定条件的组。
6. ORDER BY
子句 (column_list [ASC | DESC]
)
指定结果集的排序方式。可以按一列或多列排序,每个列后可以指定排序方向(升序 ASC
或降序 DESC
)。
7. LIMIT
子句 (offset, row_count
或 row_count
)
限制返回的结果行数。可以指定偏移量(offset
)和要返回的行数(row_count
),或者仅指定要返回的行数。
8. 其他高级特性
WITH ROLLUP
:在GROUP BY
后添加,用于生成分组汇总行。JOIN
操作:包括INNER JOIN
,LEFT JOIN
,RIGHT JOIN
,FULL JOIN
,CROSS JOIN
等,用于从多个表中合并数据。- 集操作:如
UNION
,UNION ALL
,EXCEPT
,INTERSECT
,用于合并或比较多个SELECT
语句的结果集。 - 子查询:嵌套在主查询内部的
SELECT
语句,作为另一个查询的条件或表达式的一部分。
示例
-- 示例1:基本查询,选取所有列
SELECT * FROM customers;
-- 示例2:选取特定列并排序
SELECT customer_name, email_address FROM customers ORDER BY customer_name DESC;
-- 示例3:带条件查询
SELECT * FROM orders WHERE order_date >= '2023-01-01' AND status = 'Completed';
-- 示例4:分组与聚合
SELECT product_category, COUNT(*) AS total_orders FROM orders GROUP BY product_category HAVING COUNT(*) > 100;
-- 示例5:使用JOIN查询
SELECT c.customer_name, o.order_id, o.order_date
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE o.order_total > 500;
-- 示例6:使用LIMIT分页
SELECT * FROM products LIMIT 10 OFFSET 20; -- 获取第21到第30条记录
注意事项
-
SELECT
语句的执行顺序并非按照书写顺序,而是大致遵循以下逻辑:FROM
子句(确定数据源)WHERE
子句(数据筛选)GROUP BY
子句(数据分组)HAVING
子句(对分组结果筛选)SELECT
子句(计算列值、表达式、聚合函数等)ORDER BY
子句(结果排序)LIMIT
子句(结果限制)
-
在编写复杂查询时,应关注查询性能,合理使用索引、避免全表扫描、减少不必要的数据处理。
-
遵循SQL语法规则和数据库特定的约束,如数据类型兼容性、保留关键字的使用等。
综上所述,MySQL的 SELECT
语句是一个强大且灵活的数据检索工具,通过组合不同的子句和选项,可以满足各种复杂的数据查询需求。理解和熟练运用 SELECT
语句是掌握MySQL数据库操作的基础。
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.44-log MySQL Community Server (GPL)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bms |
| db_com |
| db_test1 |
| lb_db |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
9 rows in set (0.00 sec)
mysql> create schema if not exists lb_db1;
Query OK, 1 row affected (0.00 sec)
mysql> alter database lb_db1 default character set utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql> use lb_db1;
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| lb_db1 |
+------------+
1 row in set (0.00 sec)
mysql> create table user (id int primary key auto_increment,username varchar(30)
unique not null,password varchar(30) unique not null,status int(30) not null def
ault 0);
Query OK, 0 rows affected (0.12 sec)
mysql> desc user;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(30) | NO | UNI | NULL | |
| password | varchar(30) | NO | UNI | NULL | |
| status | int(30) | NO | | 0 | |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
mysql> alter table user change password password varchar(30) not null;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc user;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(30) | NO | UNI | NULL | |
| password | varchar(30) | NO | UNI | NULL | |
| status | int(30) | NO | | 0 | |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> alter table user drop index password;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc user;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(30) | NO | UNI | NULL | |
| password | varchar(30) | NO | | NULL | |
| status | int(30) | NO | | 0 | |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> insert into user (username,password,status) values
-> ('小明','123456',1),
-> ('小红','123456',0),
-> ('小zhang','123456',1),
-> ('小2','123456',1),
-> ('小4','123456',1),
-> ('小3','123456',1),
-> ('6','123456',1),
-> ('888','123456',1);
Query OK, 8 rows affected (0.11 sec)
Records: 8 Duplicates: 0 Warnings: 0
mysql> select * from user;
+----+----------+----------+--------+
| id | username | password | status |
+----+----------+----------+--------+
| 1 | 小明 | 123456 | 1 |
| 2 | 小红 | 123456 | 0 |
| 3 | 小zhang | 123456 | 1 |
| 4 | 小2 | 123456 | 1 |
| 5 | 小4 | 123456 | 1 |
| 6 | 小3 | 123456 | 1 |
| 7 | 6 | 123456 | 1 |
| 8 | 888 | 123456 | 1 |
+----+----------+----------+--------+
8 rows in set (0.01 sec)
mysql> select password,id,username,status from user;
+----------+----+----------+--------+
| password | id | username | status |
+----------+----+----------+--------+
| 123456 | 1 | 小明 | 1 |
| 123456 | 2 | 小红 | 0 |
| 123456 | 3 | 小zhang | 1 |
| 123456 | 4 | 小2 | 1 |
| 123456 | 5 | 小4 | 1 |
| 123456 | 6 | 小3 | 1 |
| 123456 | 7 | 6 | 1 |
| 123456 | 8 | 888 | 1 |
+----------+----+----------+--------+
8 rows in set (0.00 sec)