当前位置: 首页 > article >正文

MySQL的使用

在MySQL中,DDL(数据定义语言)、DML(数据操作语言)和DQL(数据查询语言)是三类常用的SQL语言,每类语言有不同的功能:

1. DDL(Data Definition Language - 数据定义语言)

DDL 用于定义和修改数据库中的结构(如数据库、表、索引等)。常见的DDL命令包括 CREATEALTERDROP

  • 创建数据库

    CREATE DATABASE my_database;
    
  • 创建表

    CREATE TABLE my_table (
        id INT PRIMARY KEY,
        name VARCHAR(50),
        age INT
    );
    
  • 修改表

    ALTER TABLE my_table ADD COLUMN email VARCHAR(100);
    
  • 删除表

    DROP TABLE my_table;
    

2. DML(Data Manipulation Language - 数据操作语言)

DML 用于对表中的数据进行增、删、改的操作。常见的DML命令有 INSERTUPDATEDELETE

  • 插入数据

    INSERT INTO my_table (id, name, age) VALUES (1, 'Alice', 25);
    
  • 更新数据

    UPDATE my_table SET age = 26 WHERE name = 'Alice';
    
  • 删除数据

    DELETE FROM my_table WHERE id = 1;
    

3. DQL(Data Query Language - 数据查询语言)

DQL 用于查询数据,主要是 SELECT 语句。可以通过 WHEREGROUP BYORDER BY 等子句来精确地查询所需的数据。

  • 查询所有数据

    SELECT * FROM my_table;
    
  • 条件查询

    SELECT name, age FROM my_table WHERE age > 20;
    
  • 分组查询

    SELECT age, COUNT(*) FROM my_table GROUP BY age;
    
  • 排序查询

    SELECT * FROM my_table ORDER BY age DESC;
    
  • 分页查询

    SELECT * FROM my_table LIMIT 10 OFFSET 0;
    
  • DDL 主要用于定义和修改表结构。

  • DML 主要用于操作表中的数据(增、改、删)。

  • DQL 主要用于查询数据,并可以结合各种子句精确查询。

MySQL 多表查询

MySQL 多表查询是关系型数据库中一个非常重要的功能,它允许开发者从多个相关表中获取数据。MySQL 提供了多种方式来进行多表查询,常见的有 连接查询(JOIN)子查询(Subquery)。掌握这些技巧是数据库设计与查询优化中的核心技能。

以下是 MySQL 多表查询的总结,涵盖了常用的连接类型、子查询以及实际应用中的查询示例。


一、连接查询(JOIN)

1.1 INNER JOIN(内连接)

内连接是最常见的连接查询,它只返回两个表中匹配条件的数据。如果某一行在其中一个表中不存在对应的匹配行,那么该行将不会出现在结果集中。

语法

SELECT columns
FROM table1
INNER JOIN table2 ON table1.column = table2.column;

示例
假设有两个表:

  • orders 表(存储订单信息)
  • customers 表(存储客户信息)

我们希望查询每个订单对应的客户信息:

SELECT orders.order_id, customers.customer_name, orders.order_date
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;

此查询返回订单和客户的匹配结果,仅显示那些在 orders 表中有订单,并且在 customers 表中有对应客户的记录。


1.2 LEFT JOIN(左连接)

左连接返回左表中的所有行,即使右表中没有匹配的数据,右表中的数据为空(NULL)。

语法

SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;

示例
我们希望查询所有订单,包括那些没有匹配到客户的订单:

SELECT orders.order_id, customers.customer_name, orders.order_date
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id;

此查询会显示所有订单,即使某些订单的客户信息缺失。


1.3 RIGHT JOIN(右连接)

右连接与左连接相反,它返回右表中的所有行,即使左表中没有匹配的数据。

语法

SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;

示例
我们希望查询所有客户,包括那些没有下订单的客户:

SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;

此查询会显示所有客户信息,包含那些没有订单的客户。


1.4 FULL JOIN(全连接)

全连接返回两个表中的所有行,不论是否匹配。MySQL 本身不直接支持 FULL JOIN,但可以通过使用 UNION 结合 LEFT JOINRIGHT JOIN 来实现全连接。

语法

SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column
UNION
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;

示例
返回所有客户和订单,不论是否有匹配关系:

SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
UNION
SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;

1.5 CROSS JOIN(交叉连接)

交叉连接会返回两个表的笛卡尔积,即每一个表中的行都和另一个表中的每一行进行组合,不考虑是否有匹配条件。

语法

SELECT columns
FROM table1
CROSS JOIN table2;

示例
查询所有产品与所有订单的组合:

SELECT products.product_name, orders.order_id
FROM products
CROSS JOIN orders;

此查询返回所有产品和订单的每一种组合。


二、子查询(Subquery)

2.1 单行子查询

单行子查询返回一行数据,常用于条件判断。

语法

SELECT columns
FROM table
WHERE column = (SELECT value FROM other_table WHERE condition);

示例
查询下单次数最多的客户信息:

SELECT * 
FROM customers 
WHERE customer_id = (SELECT customer_id 
                     FROM orders 
                     GROUP BY customer_id 
                     ORDER BY COUNT(*) DESC LIMIT 1);

2.2 多行子查询

多行子查询返回多行数据,常与 INANYALL 等关键字一起使用。

语法

SELECT columns
FROM table
WHERE column IN (SELECT column FROM other_table WHERE condition);

示例
查询下过订单的所有客户信息:

SELECT * 
FROM customers 
WHERE customer_id IN (SELECT customer_id FROM orders);

2.3 相关子查询

相关子查询是指子查询依赖于外部查询的值。与普通子查询不同,它在外部查询的每一行执行一次。

语法

SELECT columns
FROM table1 AS t1
WHERE column = (SELECT value FROM table2 AS t2 WHERE t1.column = t2.column);

示例
查询订单金额大于所有该客户历史订单平均金额的订单:

SELECT order_id, order_total
FROM orders AS o1
WHERE order_total > (SELECT AVG(order_total)
                     FROM orders AS o2
                     WHERE o1.customer_id = o2.customer_id);

三、联合查询(UNION)

UNION 用于合并两个或多个 SELECT 查询的结果。每个查询的列数和数据类型必须匹配。

语法

SELECT columns FROM table1
UNION
SELECT columns FROM table2;

示例
查询所有客户和供应商的名称(假设有 customerssuppliers 表):

SELECT customer_name AS name FROM customers
UNION
SELECT supplier_name AS name FROM suppliers;

注意

  • UNION 默认去重,可以使用 UNION ALL 显示所有结果,包括重复项。

  1. 内连接(INNER JOIN) 是最常用的多表查询方式,只返回两个表之间匹配的数据。用于查找共有信息。
  2. 左连接(LEFT JOIN)右连接(RIGHT JOIN) 用于在查询中保留一方表的所有数据,即使另一方没有匹配数据。
  3. 全连接(FULL JOIN) 可以通过 UNION 来模拟,它返回两个表中的所有数据,不论是否有匹配项。
  4. 交叉连接(CROSS JOIN) 用于生成笛卡尔积,慎用。
  5. 子查询(Subquery) 用于嵌套查询,单行子查询和多行子查询在复杂查询中非常有用。
  6. 联合查询(UNION) 合并多个查询的结果集,但需要保证各查询的列数和类型相同。

通过理解这些查询方式,开发者能够轻松地处理多表数据操作,实现复杂业务逻辑。


http://www.kler.cn/a/374019.html

相关文章:

  • 快速排序简单实现
  • 19 Docker容器集群网络架构:二、etcd 集群部署
  • Pr 视频效果:闪光灯
  • 分布式事务Seata-AT模式
  • 华为配置 之 GVRP协议
  • Oracle视频基础1.1.4练习
  • Chromium HTML Input 类型radio 对应c++
  • 大厂面试真题-简单说说中台的架构设计
  • 如何统一管理枚举类?
  • ASPICE 4.0引领自动驾驶未来:机器学习模型的特点与实践
  • JS面试八股文(三)
  • 四足机器人实战篇之三:四足机器人嵌入式硬件设计
  • 013:无人机航线规划的概念
  • 华为OD机试真题---获得完美走位
  • 细说 ThreadPool(线程池)使用与优势以及实现方式
  • 微软官方 .NET 混淆软件 Dotfuscator
  • Nginx 网关解决 Geoserver 图层访问控制
  • idm扩展自动更新,导致不能正常使用处理方法
  • 企业应该采用和支持网络安全的几个实践
  • 高考相关 APP 案例分享
  • 【安全性分析】正式安全分析与非正式安全分析
  • 使用API有效率地管理Dynadot域名,将域名移动至某一文件夹中
  • 【瑞吉外卖】-day03
  • Qt 实战(10)模型视图 | 10.5、代理
  • 音视频入门基础:FLV专题(21)——FFmpeg源码中,获取FLV文件音频信息的实现(上)
  • 组件封装思路