MySQL语句的用法有哪些

发布时间:2021-10-22 13:40:54 作者:iii
来源:亿速云 阅读:173
# MySQL语句的用法有哪些

## 目录
1. [概述](#概述)
2. [数据定义语言(DDL)](#数据定义语言ddl)
   - [数据库操作](#数据库操作)
   - [表操作](#表操作)
   - [索引操作](#索引操作)
3. [数据操作语言(DML)](#数据操作语言dml)
   - [INSERT语句](#insert语句)
   - [UPDATE语句](#update语句)
   - [DELETE语句](#delete语句)
   - [REPLACE语句](#replace语句)
4. [数据查询语言(DQL)](#数据查询语言dql)
   - [基础查询](#基础查询)
   - [条件查询](#条件查询)
   - [排序与分页](#排序与分页)
   - [分组聚合](#分组聚合)
   - [多表连接](#多表连接)
   - [子查询](#子查询)
5. [数据控制语言(DCL)](#数据控制语言dcl)
   - [用户权限管理](#用户权限管理)
   - [事务控制](#事务控制)
6. [高级特性](#高级特性)
   - [存储过程](#存储过程)
   - [触发器](#触发器)
   - [视图](#视图)
   - [临时表](#临时表)
7. [性能优化](#性能优化)
   - [EXPLN分析](#explain分析)
   - [索引优化](#索引优化)
   - [查询优化](#查询优化)
8. [实战案例](#实战案例)
9. [总结](#总结)

## 概述
MySQL作为最流行的开源关系型数据库管理系统,其SQL语句按照功能可分为四大类:数据定义语言(DDL)、数据操作语言(DML)、数据查询语言(DQL)和数据控制语言(DCL)。本文将全面解析这些语句的用法,并通过大量示例演示实际应用场景。

## 数据定义语言(DDL)

### 数据库操作
```sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 查看所有数据库
SHOW DATABASES;

-- 选择数据库
USE shop;

-- 修改数据库字符集
ALTER DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- 删除数据库
DROP DATABASE IF EXISTS shop_backup;

表操作

-- 创建表
CREATE TABLE users (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    password CHAR(60) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 添加列
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;

-- 修改列
ALTER TABLE users MODIFY COLUMN phone VARCHAR(15) NULL;

-- 重命名列
ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(15);

-- 删除列
ALTER TABLE users DROP COLUMN mobile;

-- 重命名表
RENAME TABLE users TO customers;

-- 截断表(清空数据)
TRUNCATE TABLE temp_logs;

-- 删除表
DROP TABLE IF EXISTS old_products;

索引操作

-- 创建普通索引
CREATE INDEX idx_username ON users(username);

-- 创建唯一索引
CREATE UNIQUE INDEX uq_email ON users(email);

-- 创建复合索引
CREATE INDEX idx_name_age ON employees(last_name, age);

-- 删除索引
DROP INDEX idx_username ON users;

-- 查看索引
SHOW INDEX FROM users;

数据操作语言(DML)

INSERT语句

-- 单行插入
INSERT INTO users (username, email, password) 
VALUES ('john_doe', 'john@example.com', '$2y$10$N9qo8uLOickgx2ZMRZoMy...');

-- 多行插入
INSERT INTO products (name, price, stock) VALUES
('Laptop', 999.99, 50),
('Phone', 699.99, 100),
('Tablet', 349.99, 75);

-- 插入查询结果
INSERT INTO user_backups 
SELECT * FROM users WHERE created_at < '2023-01-01';

-- 替换插入(存在则替换)
REPLACE INTO settings (user_id, theme, language) 
VALUES (1, 'dark', 'en');

UPDATE语句

-- 单表更新
UPDATE products 
SET price = price * 0.9, stock = stock - 1 
WHERE id = 1001;

-- 多表关联更新
UPDATE orders o
JOIN order_items i ON o.id = i.order_id
SET o.total_amount = o.total_amount - i.price
WHERE i.id = 5002;

-- 使用子查询更新
UPDATE employees
SET salary = salary * 1.05
WHERE department_id IN (
    SELECT id FROM departments WHERE name = 'Engineering'
);

-- 限制更新数量
UPDATE user_logs 
SET status = 'processed' 
WHERE status = 'pending' 
LIMIT 100;

DELETE语句

-- 条件删除
DELETE FROM sessions 
WHERE last_activity < NOW() - INTERVAL 30 DAY;

-- 多表关联删除
DELETE o, i
FROM orders o
JOIN order_items i ON o.id = i.order_id
WHERE o.status = 'cancelled';

-- 清空表数据
DELETE FROM temp_data;

-- 限制删除数量
DELETE FROM audit_logs 
ORDER BY created_at ASC 
LIMIT 1000;

REPLACE语句

-- 替换整行数据
REPLACE INTO products (id, name, price) 
VALUES (1, 'New Laptop', 1299.99);

-- 相当于以下操作的组合:
-- 1. 如果主键存在则删除原记录
-- 2. 插入新记录

数据查询语言(DQL)

基础查询

-- 查询所有列
SELECT * FROM employees;

-- 查询特定列
SELECT id, first_name, last_name, salary FROM employees;

-- 使用列别名
SELECT 
    id AS employee_id,
    CONCAT(first_name, ' ', last_name) AS full_name,
    salary * 12 AS annual_salary
FROM employees;

-- 使用DISTINCT去重
SELECT DISTINCT department_id FROM employees;

-- 使用LIMIT限制结果
SELECT * FROM products ORDER BY price DESC LIMIT 10;

条件查询

-- 比较运算符
SELECT * FROM products WHERE price > 100 AND stock < 50;

-- BETWEEN范围查询
SELECT * FROM orders 
WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';

-- IN运算符
SELECT * FROM customers 
WHERE country IN ('USA', 'Canada', 'Mexico');

-- LIKE模糊查询
SELECT * FROM products 
WHERE name LIKE '%Pro%' OR description LIKE '%高性能%';

-- NULL值判断
SELECT * FROM contacts WHERE phone IS NOT NULL;

-- 正则表达式查询
SELECT * FROM cities WHERE name REGEXP '^San';

排序与分页

-- 单列排序
SELECT * FROM employees ORDER BY hire_date DESC;

-- 多列排序
SELECT * FROM products 
ORDER BY category_id ASC, price DESC;

-- 分页查询
SELECT * FROM orders 
ORDER BY created_at DESC 
LIMIT 20 OFFSET 40;  -- 等价于 LIMIT 40, 20

-- 使用变量实现分页
SET @page = 2, @size = 10;
SELECT * FROM articles 
ORDER BY publish_date DESC 
LIMIT @page, @size;

分组聚合

-- 基本聚合函数
SELECT 
    COUNT(*) AS total_orders,
    SUM(amount) AS total_sales,
    AVG(amount) AS avg_order,
    MAX(amount) AS max_order,
    MIN(amount) AS min_order
FROM orders;

-- 分组统计
SELECT 
    department_id,
    COUNT(*) AS employee_count,
    AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;

-- HAVING过滤分组
SELECT 
    customer_id,
    COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING order_count > 5;

-- WITH ROLLUP小计功能
SELECT 
    YEAR(order_date) AS year,
    MONTH(order_date) AS month,
    SUM(amount) AS monthly_sales
FROM orders
GROUP BY YEAR(order_date), MONTH(order_date) WITH ROLLUP;

多表连接

-- 内连接
SELECT 
    o.order_id,
    o.order_date,
    c.customer_name,
    SUM(oi.quantity * oi.unit_price) AS total_amount
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
INNER JOIN order_items oi ON o.order_id = oi.order_id
GROUP BY o.order_id;

-- 左外连接
SELECT 
    d.department_name,
    COUNT(e.employee_id) AS employee_count
FROM departments d
LEFT JOIN employees e ON d.department_id = e.department_id
GROUP BY d.department_name;

-- 自连接(查找同一部门员工)
SELECT 
    e1.employee_name,
    e2.employee_name AS colleague
FROM employees e1
JOIN employees e2 ON e1.department_id = e2.department_id 
    AND e1.employee_id != e2.employee_id;

-- 交叉连接
SELECT 
    p.product_name,
    s.size_option
FROM products p
CROSS JOIN size_options s;

子查询

-- WHERE子句中的子查询
SELECT * FROM products 
WHERE price > (SELECT AVG(price) FROM products);

-- FROM子句中的子查询
SELECT 
    dept.name,
    emp_stats.avg_salary
FROM departments dept
JOIN (
    SELECT 
        department_id,
        AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department_id
) emp_stats ON dept.department_id = emp_stats.department_id;

-- EXISTS子查询
SELECT c.customer_name
FROM customers c
WHERE EXISTS (
    SELECT 1 FROM orders o 
    WHERE o.customer_id = c.customer_id
    AND o.order_date > '2023-01-01'
);

-- 行子查询
SELECT * FROM employees
WHERE (department_id, salary) IN (
    SELECT department_id, MAX(salary)
    FROM employees
    GROUP BY department_id
);

数据控制语言(DCL)

用户权限管理

-- 创建用户
CREATE USER 'app_user'@'%' IDENTIFIED BY 'SecurePass123!';

-- 修改密码
ALTER USER 'app_user'@'%' IDENTIFIED BY 'NewSecurePass456!';

-- 授予权限
GRANT SELECT, INSERT, UPDATE ON shop.* TO 'app_user'@'%';

-- 授予所有权限
GRANT ALL PRIVILEGES ON shop.* TO 'admin_user'@'localhost';

-- 撤销权限
REVOKE DELETE ON shop.* FROM 'app_user'@'%';

-- 查看权限
SHOW GRANTS FOR 'app_user'@'%';

-- 删除用户
DROP USER IF EXISTS 'temp_user'@'%';

事务控制

-- 开启事务
START TRANSACTION;

-- 执行多个操作
INSERT INTO orders (customer_id, amount) VALUES (1001, 199.99);
UPDATE inventory SET stock = stock - 1 WHERE product_id = 5003;

-- 根据条件提交或回滚
IF everything_ok THEN
    COMMIT;
ELSE
    ROLLBACK;
END IF;

-- 设置保存点
SAVEPOINT before_update;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 42;
-- 如果需要可以回滚到保存点
ROLLBACK TO before_update;

高级特性

存储过程

DELIMITER //
CREATE PROCEDURE process_monthly_sales(IN month INT, IN year INT)
BEGIN
    DECLARE total DECIMAL(12,2);
    
    -- 计算总销售额
    SELECT SUM(amount) INTO total
    FROM orders
    WHERE MONTH(order_date) = month AND YEAR(order_date) = year;
    
    -- 插入报表
    INSERT INTO sales_reports (report_month, report_year, total_sales)
    VALUES (month, year, total);
    
    -- 返回结果
    SELECT CONCAT('Processed sales for ', month, '/', year) AS result;
END //
DELIMITER ;

-- 调用存储过程
CALL process_monthly_sales(6, 2023);

触发器

-- 审计日志触发器
CREATE TRIGGER after_user_update
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
    IF NEW.email != OLD.email THEN
        INSERT INTO user_audit_logs (
            user_id, 
            changed_field, 
            old_value, 
            new_value, 
            changed_at
        ) VALUES (
            NEW.id, 
            'email', 
            OLD.email, 
            NEW.email, 
            NOW()
        );
    END IF;
END;

-- 库存更新触发器
CREATE TRIGGER after_order_insert
AFTER INSERT ON order_items
FOR EACH ROW
UPDATE products 
SET stock = stock - NEW.quantity
WHERE id = NEW.product_id;

视图

-- 创建视图
CREATE VIEW customer_order_summary AS
SELECT 
    c.id,
    c.name,
    c.email,
    COUNT(o.id) AS order_count,
    SUM(o.total_amount) AS total_spent,
    MAX(o.order_date) AS last_order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id;

-- 使用视图
SELECT * FROM customer_order_summary 
WHERE total_spent > 1000
ORDER BY total_spent DESC;

-- 更新视图定义
CREATE OR REPLACE VIEW product_inventory AS
SELECT 
    p.id,
    p.name,
    p.price,
    i.quantity_in_stock,
    i.last_restocked
FROM products p
JOIN inventory i ON p.id = i.product_id;

-- 删除视图
DROP VIEW IF EXISTS old_report_view;

临时表

-- 创建临时表
CREATE TEMPORARY TABLE temp_top_customers AS
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
ORDER BY total_spent DESC
LIMIT 10;

-- 使用临时表
SELECT c.*, t.total_spent
FROM customers c
JOIN temp_top_customers t ON c.id = t.customer_id;

-- 会话结束自动删除
-- 也可以手动删除
DROP TEMPORARY TABLE IF EXISTS temp_top_customers;

-- 内存临时表
CREATE TEMPORARY TABLE temp_session_data (
    id INT AUTO_INCREMENT PRIMARY KEY,
    key_name VARCHAR(50),
    key_value VARCHAR(255)
) ENGINE=MEMORY;

性能优化

EXPLN分析

-- 基本用法
EXPLN SELECT * FROM orders WHERE customer_id = 1001;

-- 分析连接查询
EXPLN FORMAT=JSON
SELECT p.name, oi.quantity, o.order_date
FROM products p
JOIN order_items oi ON p.id = oi.product_id
JOIN orders o ON oi.order_id = o.id
WHERE o.customer_id = 1001;

-- 分析关键指标
EXPLN ANALYZE
SELECT * FROM users WHERE username LIKE 'john%';

-- 检查索引使用
EXPLN 
SELECT * FROM employees 
WHERE last_name = 'Smith' AND department_id = 5;

索引优化

-- 添加复合索引
ALTER TABLE orders ADD INDEX idx_customer_date (customer_id, order_date);

-- 使用覆盖索引
-- 查询只需要访问索引列,无需回表
SELECT customer_id, order_date FROM orders 
WHERE customer_id = 1001;

-- 索引提示
SELECT * FROM orders USE INDEX (idx_customer_date)
WHERE customer_id = 1001 AND order_date > '2023-01-01';

-- 忽略索引
SELECT * FROM orders IGNORE INDEX (idx_status)
WHERE status = 'shipped';

-- 强制索引
SELECT * FROM orders FORCE INDEX (primary)
WHERE id BETWEEN 1000 AND 2000;

查询优化

-- 避免SELECT *
SELECT id, name, email FROM users;

-- 优化LIKE查询
-- 前导通配符无法使用索引
SELECT * FROM products WHERE name LIKE 'Pro%';  -- 可以使用索引
SELECT * FROM products WHERE name LIKE '%Pro%'; -- 无法使用索引

-- 使用连接代替子查询
-- 优化前
SELECT * FROM customers 
WHERE id IN (SELECT customer_id FROM orders WHERE amount > 100);

-- 优化后
SELECT DISTINCT c.* 
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.amount > 100;

-- 分批处理大数据
-- 使用游标或LIMIT分批次处理
SELECT * FROM large_table WHERE condition LIMIT 1000 OFFSET 0;
-- 处理完后
SELECT * FROM large_table WHERE condition LIMIT 1000 OFFSET 1000;

实战案例

电商系统常用查询

”`sql – 1. 查找热销商品 SELECT p.id, p.name, SUM(oi.quantity) AS total_sold, SUM(oi.quantity * oi.unit_price) AS total_revenue FROM products p JOIN order_items oi ON p.id = oi.product_id JOIN orders o ON oi.order_id = o.id WHERE o.order_date BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW() GROUP BY p.id ORDER BY total_sold DESC LIMIT 10;

– 2. 客户价值分析 SELECT c.id, c.name, c.email, COUNT(o.id) AS order_count, SUM(o.total_amount) AS lifetime_value, DATEDIFF(NOW(), MAX(o.order_date)) AS days_since_last_order FROM customers c LEFT JOIN orders o ON c.id = o.customer_id GROUP BY c.id ORDER BY lifetime_value DESC;

– 3. 库存预警

推荐阅读:
  1. MySQL 存储过程CASE语句用法
  2. MySQL 存储过if语句用法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql

上一篇:Java图解Spring启动时的后置处理器工作流程是什么

下一篇:怎么把数据库变更

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》