小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2024-04-16 / 10 阅读
0
0

MySQL select介绍|初级使用综合实践

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_countrow_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语句的执行顺序并非按照书写顺序,而是大致遵循以下逻辑:

    1. FROM子句(确定数据源)
    2. WHERE子句(数据筛选)
    3. GROUP BY子句(数据分组)
    4. HAVING子句(对分组结果筛选)
    5. SELECT子句(计算列值、表达式、聚合函数等)
    6. ORDER BY子句(结果排序)
    7. 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)


评论