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语句编写规范
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 数据库操作
-- 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 表结构查询与创建
-- 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 综合案例实践
-- 创建客户信息表
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 表结构修改
-- 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 表删除操作
-- 1. 删除表
DROP TABLE [IF EXISTS] 表名称;
-- 2. 清空表数据(保留表结构)
TRUNCATE TABLE 表名称;
3.3 DML 数据操作语言
3.3.1 数据插入
-- 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 数据更新
-- 更新语法
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 数据删除
-- 删除语法
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 数据查询语言
数据准备
-- 创建销售记录表
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 基本查询语法
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段
HAVING
分组后条件
ORDER BY
排序字段
LIMIT
分页参数;
3.4.2 基础查询操作
-- 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 |
最高 |
|
|
-- 比较运算符
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值 |
-- 统计记录数
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 分组查询
-- 按地区分组统计
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 排序查询
-- 单字段排序
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 分页查询
-- 基本分页语法
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 综合查询案例
-- 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语句的实际执行顺序:
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 用户管理
-- 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 |
中 |
-- 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;