MySQL学习之SQL语法与操作

MySQL学习之SQL语法与操作

    • [1. SQL通用语法规范](#1. SQL通用语法规范)
    • [2. SQL语言分类](#2. SQL语言分类)
    • [3. DDL数据定义语言](#3. DDL数据定义语言)
      • [3.1 数据库操作](#3.1 数据库操作)
      • [3.2 表操作](#3.2 表操作)
        • [3.2.1 表结构查询与创建](#3.2.1 表结构查询与创建)
        • [3.2.2 数据类型详解](#3.2.2 数据类型详解)
        • [3.2.3 综合案例实践](#3.2.3 综合案例实践)
        • [3.2.4 表结构修改](#3.2.4 表结构修改)
        • [3.2.5 表删除操作](#3.2.5 表删除操作)
      • [3.3 DML 数据操作语言](#3.3 DML 数据操作语言)
        • [3.3.1 数据插入](#3.3.1 数据插入)
        • [3.3.2 数据更新](#3.3.2 数据更新)
        • [3.3.3 数据删除](#3.3.3 数据删除)
      • [3.4 DQL 数据查询语言](#3.4 DQL 数据查询语言)
        • 数据准备
        • [3.4.1 基本查询语法](#3.4.1 基本查询语法)
        • [3.4.2 基础查询操作](#3.4.2 基础查询操作)
        • [3.4.3 条件查询](#3.4.3 条件查询)
        • [3.4.4 聚合函数](#3.4.4 聚合函数)
        • [3.4.5 分组查询](#3.4.5 分组查询)
        • [3.4.6 排序查询](#3.4.6 排序查询)
        • [3.4.7 分页查询](#3.4.7 分页查询)
        • [3.4.8 综合查询案例](#3.4.8 综合查询案例)
        • [3.4.9 SQL执行顺序](#3.4.9 SQL执行顺序)
      • [3.5 DCL 数据控制语言](#3.5 DCL 数据控制语言)
        • [3.5.1 用户管理](#3.5.1 用户管理)
        • [3.5.2 权限管理](#3.5.2 权限管理)

1. SQL通用语法规范

sql 复制代码
-- SQL语句编写规范
1) SQL语句支持单行或多行书写,必须以分号作为结束符
2) 合理使用空格和缩进提升代码可读性
3) MySQL中SQL语句不区分大小写,但建议关键字使用大写
4) 注释的使用:
   单行注释:-- 注释内容 或 # 注释内容
   多行注释:/* 注释内容 */

2. SQL语言分类

根据功能特点,SQL主要分为四大类:

分类 英文全称 主要功能
DDL Data Definition Language 定义数据库对象(数据库、表、字段)
DML Data Manipulation Language 对数据库表中的数据进行增删改操作
DQL Data Query Language 查询数据库表中的记录
DCL Data Control Language 管理数据库用户和访问权限

3. DDL数据定义语言

3.1 数据库操作

sql 复制代码
-- 1. 查看所有数据库
SHOW DATABASES;

-- 2. 查看当前使用的数据库
SELECT DATABASE();

-- 3. 创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名称 
[DEFAULT CHARSET 字符集] 
[COLLATE 排序规则];

/*
创建示例:
A. 创建market数据库,使用默认字符集
CREATE DATABASE market;

B. 创建shop数据库,指定UTF8字符集
CREATE DATABASE shop DEFAULT CHARSET utf8mb4;

C. 安全创建数据库(不存在才创建)
CREATE DATABASE IF NOT EXISTS shop;
*/

-- 4. 删除数据库
DROP DATABASE [IF EXISTS] 数据库名称;

-- 5. 切换数据库
USE shop;

3.2 表操作

3.2.1 表结构查询与创建
sql 复制代码
-- 1. 查看当前数据库所有表
SHOW TABLES;

-- 2. 查看表结构
DESC 表名称;

-- 3. 查看建表语句
SHOW CREATE TABLE 表名称;

-- 4. 创建表结构
CREATE TABLE 表名称(
    字段1 字段1类型 [COMMENT '字段注释'],
    字段2 字段2类型 [COMMENT '字段注释'],
    字段3 字段3类型 [COMMENT '字段注释'],
    ...
    字段n 字段n类型 [COMMENT '字段注释']
) [COMMENT '表注释'];

-- 创建商品表示例
CREATE TABLE product(
    product_id INT COMMENT '商品编号',
    product_name VARCHAR(100) COMMENT '商品名称',
    price DECIMAL(10,2) COMMENT '商品价格',
    stock INT COMMENT '库存数量',
    category VARCHAR(50) COMMENT '商品分类'
) COMMENT '商品信息表';
3.2.2 数据类型详解

数值类型:

类型 存储空间 有符号范围 无符号范围 描述
TINYINT 1字节 -128~127 0~255 小整数
SMALLINT 2字节 -32768~32767 0~65535 中等整数
INT 4字节 -231~231-1 0~2^32-1 标准整数
BIGINT 8字节 -263~263-1 0~2^64-1 大整数
FLOAT 4字节 ±3.402823466E+38 - 单精度浮点数
DOUBLE 8字节 ±1.7976931348623157E+308 - 双精度浮点数
DECIMAL 变长 精确小数 精确小数 精确小数

字符串类型:

类型 最大长度 特点 适用场景
CHAR 255字符 定长 长度固定的数据(如性别、状态码)
VARCHAR 65535字符 变长 长度不固定的数据(如姓名、地址)
TEXT 65535字符 长文本 文章内容、描述信息

日期时间类型:

类型 格式 范围 描述
DATE YYYY-MM-DD 1000-01-01~9999-12-31 日期值
TIME HH:MM:SS -838:59:59~838:59:59 时间值
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~9999-12-31 23:59:59 日期时间
TIMESTAMP YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01~2038-01-19 03:14:07 时间戳

数据类型选择指南:

数据特征 推荐类型 示例
小范围整数 TINYINT 年龄、状态码
一般整数 INT ID、数量
大整数 BIGINT 时间戳、大ID
精确小数 DECIMAL 金额、百分比
近似小数 FLOAT/DOUBLE 科学计算
固定长度文本 CHAR 性别、代码
变长文本 VARCHAR 姓名、地址
大段文本 TEXT 描述、内容
日期 DATE 生日、事件日
日期时间 DATETIME 创建时间、日志
时间戳 TIMESTAMP 更新时间
3.2.3 综合案例实践
sql 复制代码
-- 创建客户信息表
CREATE TABLE customer(
    cust_id INT COMMENT '客户编号',
    cust_code VARCHAR(15) COMMENT '客户代码',
    cust_name VARCHAR(50) COMMENT '客户姓名',
    gender CHAR(2) COMMENT '性别',
    age TINYINT UNSIGNED COMMENT '年龄',
    id_card CHAR(18) COMMENT '身份证号',
    phone CHAR(11) COMMENT '手机号码',
    email VARCHAR(100) COMMENT '电子邮箱',
    reg_date DATE COMMENT '注册日期',
    address VARCHAR(200) COMMENT '联系地址'
) COMMENT '客户信息表';
3.2.4 表结构修改
sql 复制代码
-- 1. 添加字段
ALTER TABLE 表名称 ADD 字段名 数据类型 [COMMENT '注释'] [约束条件];

-- 示例:为customer表添加会员等级字段
ALTER TABLE customer ADD member_level VARCHAR(10) COMMENT '会员等级';

-- 2. 修改字段数据类型
ALTER TABLE 表名称 MODIFY 字段名 新数据类型;

-- 3. 修改字段名和类型
ALTER TABLE 表名称 CHANGE 旧字段名 新字段名 新数据类型 [COMMENT '注释'];

-- 示例:修改member_level字段为vip_level
ALTER TABLE customer CHANGE member_level vip_level INT COMMENT 'VIP等级';

-- 4. 删除字段
ALTER TABLE 表名称 DROP 字段名;

-- 5. 修改表名
ALTER TABLE 旧表名 RENAME TO 新表名;
3.2.5 表删除操作
sql 复制代码
-- 1. 删除表
DROP TABLE [IF EXISTS] 表名称;

-- 2. 清空表数据(保留表结构)
TRUNCATE TABLE 表名称;

3.3 DML 数据操作语言

3.3.1 数据插入
sql 复制代码
-- 1. 指定字段插入数据
INSERT INTO 表名 (字段1, 字段2, 字段3) VALUES (值1, 值2, 值3);

-- 向customer表插入数据
INSERT INTO customer (cust_id, cust_code, cust_name, gender, age, phone) 
VALUES (1, 'CUST001', '张三', '男', 28, '13800138001');

-- 2. 全字段插入数据
INSERT INTO 表名 VALUES (值1, 值2, 值3, ...);

-- 3. 批量插入数据
INSERT INTO 表名 (字段1, 字段2) VALUES 
(值1, 值2),
(值3, 值4),
(值5, 值6);

-- 批量插入示例
INSERT INTO customer VALUES
(2, 'CUST002', '李四', '女', 25, '123456789012345678', '13900139001', 'lisi@email.com', '2023-01-15', '北京市朝阳区'),
(3, 'CUST003', '王五', '男', 32, '123456789012345679', '13700137001', 'wangwu@email.com', '2023-02-20', '上海市浦东新区');
3.3.2 数据更新
sql 复制代码
-- 更新语法
UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2 [WHERE 条件];

-- 更新单个字段
UPDATE customer SET age = 29 WHERE cust_id = 1;

-- 更新多个字段
UPDATE customer SET age = 26, email = 'new_email@example.com' WHERE cust_id = 2;

-- 条件更新
UPDATE customer SET vip_level = 1 WHERE age >= 30;

-- 注意:没有WHERE条件会更新整张表!
3.3.3 数据删除
sql 复制代码
-- 删除语法
DELETE FROM 表名 [WHERE 条件];

-- 删除指定记录
DELETE FROM customer WHERE cust_id = 3;

-- 条件删除
DELETE FROM customer WHERE age < 20;

-- 清空表数据(危险操作!)
DELETE FROM customer;

/*
注意事项:
1. DELETE语句必须有条件,否则会删除所有数据
2. 删除操作不可逆,执行前务必确认
3. 要删除特定字段值,应使用UPDATE设置为NULL
*/

3.4 DQL 数据查询语言

数据准备
sql 复制代码
-- 创建销售记录表
CREATE TABLE sales(
    sale_id INT COMMENT '销售编号',
    product_id INT COMMENT '商品编号',
    product_name VARCHAR(100) COMMENT '商品名称',
    sale_date DATE COMMENT '销售日期',
    quantity INT COMMENT '销售数量',
    unit_price DECIMAL(10,2) COMMENT '单价',
    total_amount DECIMAL(12,2) COMMENT '总金额',
    customer_id INT COMMENT '客户编号',
    region VARCHAR(50) COMMENT '销售区域'
) COMMENT '销售记录表';

-- 插入测试数据
INSERT INTO sales VALUES
(1, 101, '笔记本电脑', '2024-01-15', 2, 5999.00, 11998.00, 1, '北京'),
(2, 102, '智能手机', '2024-01-16', 5, 3999.00, 19995.00, 2, '上海'),
(3, 103, '平板电脑', '2024-01-17', 3, 3299.00, 9897.00, 3, '广州'),
(4, 101, '笔记本电脑', '2024-01-18', 1, 5999.00, 5999.00, 4, '北京'),
(5, 104, '智能手表', '2024-01-19', 10, 899.00, 8990.00, 5, '深圳'),
(6, 102, '智能手机', '2024-01-20', 3, 3999.00, 11997.00, 1, '北京'),
(7, 105, '蓝牙耳机', '2024-01-21', 8, 299.00, 2392.00, 2, '上海'),
(8, 103, '平板电脑', '2024-01-22', 2, 3299.00, 6598.00, 3, '广州');
3.4.1 基本查询语法
sql 复制代码
SELECT
    字段列表
FROM
    表名列表
WHERE
    条件列表
GROUP BY
    分组字段
HAVING
    分组后条件
ORDER BY
    排序字段
LIMIT
    分页参数;
3.4.2 基础查询操作
sql 复制代码
-- 1. 查询指定字段
SELECT product_name, unit_price, quantity FROM sales;

-- 2. 查询所有字段
SELECT * FROM sales;

-- 3. 字段别名
SELECT 
    product_name AS '商品名称',
    unit_price AS '单价',
    quantity AS '数量'
FROM sales;

-- 简写别名
SELECT 
    product_name '商品名称',
    unit_price '单价'
FROM sales;

-- 4. 去除重复记录
SELECT DISTINCT region FROM sales;
SELECT DISTINCT product_name FROM sales;
3.4.3 条件查询

比较运算符参考表:

运算符 描述 示例 注意事项
= 等于 age = 25 精确匹配
<>!= 不等于 gender <> '男' 两种写法等效
> 大于 salary > 5000 -
>= 大于等于 age >= 18 -
< 小于 score < 60 -
<= 小于等于 price <= 100 -
BETWEEN...AND 范围匹配 age BETWEEN 20 AND 30 包含边界值
IN(...) 多值匹配 region IN ('北京','上海') 相当于多个OR
LIKE 模糊匹配 name LIKE '张%' %匹配任意字符,_匹配单个字符
IS NULL 空值判断 email IS NULL 不能用 = NULL
IS NOT NULL 非空判断 phone IS NOT NULL 不能用 != NULL

逻辑运算符参考表:

运算符 描述 示例 优先级
AND&& 逻辑与 age > 18 AND gender = '男'
OR 或 ` ` 逻辑或 city = '北京' OR city = '上海'
NOT! 逻辑非 NOT deleted = 1 最高
() 括号 (age < 18 OR age > 60) AND vip = 1 最高
sql 复制代码
-- 比较运算符
SELECT * FROM sales WHERE quantity > 5;
SELECT * FROM sales WHERE unit_price <= 3000;
SELECT * FROM sales WHERE total_amount = 11998.00;
SELECT * FROM sales WHERE region != '北京';

-- 范围查询
SELECT * FROM sales WHERE quantity BETWEEN 3 AND 8;
SELECT * FROM sales WHERE unit_price BETWEEN 1000 AND 5000;

-- IN查询
SELECT * FROM sales WHERE region IN ('北京', '上海');
SELECT * FROM sales WHERE product_id IN (101, 103, 105);

-- 模糊查询
SELECT * FROM sales WHERE product_name LIKE '%电脑%';
SELECT * FROM sales WHERE product_name LIKE '智能%';
SELECT * FROM sales WHERE product_name LIKE '_脑%';

-- NULL值判断
SELECT * FROM sales WHERE region IS NOT NULL;

-- 逻辑运算符
SELECT * FROM sales WHERE quantity > 3 AND unit_price < 4000;
SELECT * FROM sales WHERE region = '北京' OR region = '上海';
SELECT * FROM sales WHERE NOT region = '广州';
3.4.4 聚合函数
函数 描述 示例 对NULL值的处理
COUNT() 统计行数 COUNT(*), COUNT(column) COUNT(*)计数所有行,COUNT(column)忽略NULL
SUM() 求和 SUM(salary) 忽略NULL值
AVG() 求平均值 AVG(score) 忽略NULL值
MAX() 求最大值 MAX(age) 忽略NULL值
MIN() 求最小值 MIN(price) 忽略NULL值
GROUP_CONCAT() 连接字符串 GROUP_CONCAT(name) 忽略NULL值
sql 复制代码
-- 统计记录数
SELECT COUNT(*) FROM sales;
SELECT COUNT(DISTINCT region) FROM sales;

-- 最大值最小值
SELECT MAX(total_amount) FROM sales;
SELECT MIN(unit_price) FROM sales;

-- 求和求平均
SELECT SUM(total_amount) FROM sales;
SELECT AVG(unit_price) FROM sales;

-- 综合应用
SELECT 
    COUNT(*) AS '总销售笔数',
    SUM(total_amount) AS '销售总额',
    AVG(unit_price) AS '平均单价',
    MAX(quantity) AS '最大销量'
FROM sales;
3.4.5 分组查询
sql 复制代码
-- 按地区分组统计
SELECT 
    region,
    COUNT(*) AS '销售笔数',
    SUM(total_amount) AS '区域销售额'
FROM sales 
GROUP BY region;

-- 按商品分组统计
SELECT 
    product_name,
    SUM(quantity) AS '总销量',
    AVG(unit_price) AS '平均售价'
FROM sales 
GROUP BY product_name;

-- HAVING筛选分组结果
SELECT 
    region,
    COUNT(*) AS '销售笔数'
FROM sales 
GROUP BY region 
HAVING COUNT(*) >= 2;

-- 多字段分组
SELECT 
    region,
    product_name,
    SUM(quantity) AS '总销量'
FROM sales 
GROUP BY region, product_name;
3.4.6 排序查询
sql 复制代码
-- 单字段排序
SELECT * FROM sales ORDER BY total_amount DESC;
SELECT * FROM sales ORDER BY sale_date ASC;

-- 多字段排序
SELECT * FROM sales 
ORDER BY region ASC, total_amount DESC;

-- 结合聚合函数排序
SELECT 
    product_name,
    SUM(quantity) AS total_sold
FROM sales 
GROUP BY product_name 
ORDER BY total_sold DESC;
3.4.7 分页查询
sql 复制代码
-- 基本分页语法
SELECT * FROM sales LIMIT 起始位置, 每页数量;

-- 查询第一页,每页3条
SELECT * FROM sales LIMIT 0, 3;

-- 查询第二页
SELECT * FROM sales LIMIT 3, 3;

-- 简写方式(第一页)
SELECT * FROM sales LIMIT 3;
3.4.8 综合查询案例
sql 复制代码
-- 1. 查询单价在3000-6000之间的商品销售记录
SELECT * FROM sales 
WHERE unit_price BETWEEN 3000 AND 6000;

-- 2. 查询北京或上海地区,销量超过2件的商品
SELECT * FROM sales 
WHERE region IN ('北京', '上海') AND quantity > 2;

-- 3. 统计各地区的平均销售额
SELECT 
    region,
    AVG(total_amount) AS avg_sales
FROM sales 
GROUP BY region;

-- 4. 查询销售金额最高的前3笔订单
SELECT * FROM sales 
ORDER BY total_amount DESC 
LIMIT 3;

-- 5. 按商品分类统计,只显示总销量超过5件的商品
SELECT 
    product_name,
    SUM(quantity) AS total_quantity
FROM sales 
GROUP BY product_name 
HAVING total_quantity > 5 
ORDER BY total_quantity DESC;
3.4.9 SQL执行顺序
顺序 子句 描述 是否必须
1 FROM 指定数据来源表
2 WHERE 行级过滤条件
3 GROUP BY 分组字段
4 HAVING 组级过滤条件
5 SELECT 选择输出字段
6 ORDER BY 结果排序
7 LIMIT 结果分页
sql 复制代码
-- SQL语句的实际执行顺序:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

-- 验证示例
SELECT 
    region AS sales_region,
    COUNT(*) AS order_count
FROM sales 
WHERE total_amount > 5000
GROUP BY region 
HAVING order_count >= 2
ORDER BY order_count DESC
LIMIT 5;

3.5 DCL 数据控制语言

3.5.1 用户管理
sql 复制代码
-- 1. 查询所有用户
SELECT * FROM mysql.user;

-- 2. 创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

-- 3. 修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';

-- 4. 删除用户
DROP USER '用户名'@'主机名';

-- 实际案例
-- 创建本地访问用户
CREATE USER 'shop_admin'@'localhost' IDENTIFIED BY 'Admin123!';

-- 创建远程访问用户
CREATE USER 'shop_user'@'%' IDENTIFIED BY 'User123!';

-- 修改用户密码
ALTER USER 'shop_user'@'%' IDENTIFIED BY 'NewPassword456!';

-- 删除用户
DROP USER 'shop_user'@'%';
3.5.2 权限管理

常用权限列表:

权限 描述 示例 风险等级
ALL PRIVILEGES 所有权限 GRANT ALL ON database.*
SELECT 查询数据 GRANT SELECT ON table
INSERT 插入数据 GRANT INSERT ON table
UPDATE 更新数据 GRANT UPDATE ON table
DELETE 删除数据 GRANT DELETE ON table
CREATE 创建表/库 GRANT CREATE ON database.*
DROP 删除表/库 GRANT DROP ON database.*
ALTER 修改表结构 GRANT ALTER ON table
INDEX 创建删除索引 GRANT INDEX ON table
sql 复制代码
-- 1. 查询用户权限
SHOW GRANTS FOR '用户名'@'主机名';

-- 2. 授予权限
GRANT 权限列表 ON 数据库.表 TO '用户名'@'主机名';

-- 3. 撤销权限
REVOKE 权限列表 ON 数据库.表 FROM '用户名'@'主机名';

-- 权限管理案例
-- 查询用户权限
SHOW GRANTS FOR 'shop_admin'@'localhost';

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

-- 授予特定权限
GRANT SELECT, INSERT, UPDATE ON shop.customer TO 'shop_user'@'%';

-- 撤销权限
REVOKE DELETE ON shop.customer FROM 'shop_user'@'%';

-- 刷新权限
FLUSH PRIVILEGES;
相关推荐
洲覆3 小时前
MySQL 索引原理
数据库·mysql
zyq99101_13 小时前
树与二叉树的奥秘全解析
c语言·数据结构·学习·1024程序员节
风筝在晴天搁浅3 小时前
代码随想录 617.合并二叉树
数据结构·算法
AICodeThunder4 小时前
【S组篇】C++知识点总结(1):并查集基础
c语言·数据结构·c++·算法·图论
讯捷蓝达4 小时前
龙岗客户 IBM x3650 M5服务器system board fault故障,上门快修分享
经验分享
Code_Shark4 小时前
AtCoder Beginner Contest 424 题解
数据结构·c++·算法·数学建模·青少年编程
努力进修4 小时前
KingbaseES赋能多院区医院信创转型:浙江省人民医院异构多活数据底座实践解析
数据库·kingbase
皮特石马龙4 小时前
github 双因子验证6位动态码免费攻略
经验分享·github
CS创新实验室4 小时前
深入解析快速排序(Quicksort):从原理到实践
数据结构·算法·排序算法·快速排序