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

MySQL学习之SQL语法与操作

MySQL学习之SQL语法与操作

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

1. SQL通用语法规范

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

2. SQL语言分类

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

分类英文全称主要功能
DDLData Definition Language定义数据库对象(数据库、表、字段)
DMLData Manipulation Language对数据库表中的数据进行增删改操作
DQLData Query Language查询数据库表中的记录
DCLData 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 数据类型详解

数值类型:

类型存储空间有符号范围无符号范围描述
TINYINT1字节-128~1270~255小整数
SMALLINT2字节-32768~327670~65535中等整数
INT4字节-231~231-10~2^32-1标准整数
BIGINT8字节-263~263-10~2^64-1大整数
FLOAT4字节±3.402823466E+38-单精度浮点数
DOUBLE8字节±1.7976931348623157E+308-双精度浮点数
DECIMAL变长精确小数精确小数精确小数

字符串类型:

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

日期时间类型:

类型格式范围描述
DATEYYYY-MM-DD1000-01-01~9999-12-31日期值
TIMEHH:MM:SS-838:59:59~838:59:59时间值
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00~9999-12-31 23:59:59日期时间
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 00:00:01~2038-01-19 03:14:07时间戳

数据类型选择指南:

数据特征推荐类型示例
小范围整数TINYINT年龄、状态码
一般整数INTID、数量
大整数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执行顺序
顺序子句描述是否必须
1FROM指定数据来源表
2WHERE行级过滤条件
3GROUP BY分组字段
4HAVING组级过滤条件
5SELECT选择输出字段
6ORDER BY结果排序
7LIMIT结果分页
-- SQL语句的实际执行顺序:
FROMWHEREGROUP BYHAVINGSELECTORDER BYLIMIT-- 验证示例
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;
http://www.dtcms.com/a/520388.html

相关文章:

  • “麻烦您了”英语怎么说?
  • 临时上线没有回滚方案会怎样
  • 哪个网站做高仿衣服中小学网站建设建议
  • Linux 中的 DNS 工作原理(二):各级 DNS 缓存
  • vip影视网站如何做app建设电子商务网站的预期收益
  • 从 DeepWalk 到 Node2Vec:如何让图学习“更聪明”?
  • leetcode合并有序链表
  • 知识图谱遇上大语言模型:天作之合还是理想泡影?
  • Kafka入门:基础架构讲解,安装与使用
  • 深圳seo网站推广报价wordpress导航栏的文件在哪
  • 电手术刀VS神经调音师:解密电刺激技术差异
  • lance + duckdb 替代 parquet + pandas
  • CHIA考试报告手册
  • Linux操作系统学习之---线程互斥(互斥锁)
  • 【物联网控制体系项目实战】—— 整体架构流程与 WS 实现
  • dedecms网站后台模板做汽车网站费用
  • 做网站就上房山华网天下大型网站如何开发
  • 从「能用」到「可靠」:深入探讨C++异常安全
  • 如何让AI更好地理解中文PDF中的复杂格式?
  • Mount Image Pro,在取证安全的环境中挂载和访问镜像文件内容
  • 四元数(Quaternion)之Eigen::Quaternion使用详解(5)
  • 太平洋建设集团有限公司网站wordpress标签扩展
  • 二级域名解析网站天津效果图制作公司
  • Linux iptables:四表五链 + 实用配置
  • Ceph 简介
  • idea开启远程调试
  • UE5 蓝图-6:汽车蓝图项目的文件夹组织与运行效果图,
  • 编程竞赛小技巧
  • CrewAI 核心概念 团队(Crews)篇
  • 小九源码-springboot100-基于springboot的房屋租赁管理系统