数据库(四)——关系数据库SQL语言

一、SQL基本概念

1.定义

SQL (Structured Query Language,结构化查询语言):用于管理和操作关系型数据库的标准语言。

2.分类

3.SQL对关系数据库三级模式的支持

基本表

  • 本身独立存在的表

  • 一个关系对应一个基本表

  • 一个或多个基本表对应一个存储文件

  • 一个表可以带若干索引

存储文件

  • 逻辑结构 + 物理结构 = 内模式

  • 物理文件结构由 DBMS 决定

视图

  • 从基本表或其他视图导出

  • 只存定义,不存数据

  • 虚表

  • 可以再定义视图

二、操作

例子:

1.表的创建

sql 复制代码
-- 创建 student 表
CREATE TABLE student (
    id INT PRIMARY KEY,      -- 学号,主键
    name VARCHAR(20),        -- 姓名
    age INT,                 -- 年龄
    class VARCHAR(10),       -- 班级
    score INT                -- 分数
);

2.表的修改

3.数据的修改

插入数据(INSERT)

修改数据(UPDATE)

示例:把小张的年龄改成21,班级改成2班

sql 复制代码
UPDATE student SET 年龄 = 21, 级别 = '2班' WHERE 名称 = '小张';

删除数据(DELETE / TRUNCATE)

示例1:删除2班中成绩低于80的学生

4.查询

普通查询

基础查询语法
sql 复制代码
-- 查询指定列
SELECT 列1, 列2 FROM 表名;

-- 查询所有列(不推荐在生产环境使用)
SELECT * FROM 表名;

-- 去重查询
SELECT DISTINCT 列名 FROM 表名;

-- 别名(AS 可省略)
SELECT 列名 AS 别名 FROM 表名;
  • SELECT * 虽然方便,但会把所有字段都查出来,不仅效率低,还可能泄露敏感信息,生产环境一定要避免。
  • DISTINCT 会对查询的列进行去重,比如 SELECT DISTINCT class FROM student 就能查出所有不重复的班级。
  • 别名 AS 主要是为了让查询结果更易读,比如 SELECT score AS 成绩 FROM student,结果的列名就会变成 "成绩"。

示例:(查询指定列)只看姓名和分数

sql 复制代码
SELECT name, score FROM student;
-- 结果:张三|85, 李四|92, 王五|78...
WHERE 条件筛选

WHERE 用来在查询时加上条件,只返回符合条件的数据。

sql 复制代码
SELECT * FROM 表名 WHERE 条件;

示例(等于)查1班的学生

sql 复制代码
SELECT * FROM student WHERE class = '1班';
-- 结果:张三(1班)、李四(1班)、小明(1班)

常用操作符

排序
sql 复制代码
SELECT * FROM 表名 
ORDER BY 列1 ASC, 列2 DESC;
-- ASC:升序(默认),DESC:降序
  • 多列排序时,会先按第一个列排序,相同的再按第二个列排序。
  • 排序只影响查询结果的展示顺序,不会改变数据库里数据的实际存储顺序。

示例:(多列排序)先按班级,再按分数降序

sql 复制代码
SELECT name, class, score FROM student 
ORDER BY class ASC, score DESC;
-- 结果:
--   1班:小明95, 李四92, 张三85
--   2班:赵六88, 小红82, 王五78

限制结果条数
sql 复制代码
-- MySQL / PostgreSQL
SELECT * FROM 表名 LIMIT 10;

-- 分页查询(跳过前10条,取10条)
SELECT * FROM 表名 LIMIT 10 OFFSET 10;
-- 或简写
SELECT * FROM 表名 LIMIT 10, 10;

示例:只要前3条

sql 复制代码
SELECT * FROM student LIMIT 3;
-- 结果:张三、李四、王五

分组查询

聚合函数

聚合函数会对整列数据进行计算,返回一个单一的结果。

sql 复制代码
-- COUNT:一共有多少个学生
SELECT COUNT(*) FROM student;
-- 结果:6

-- SUM:所有学生的分数总和
SELECT SUM(score) FROM student;
-- 结果:85+92+78+88+95+82 = 520

-- AVG:平均分
SELECT AVG(score) FROM student;
-- 结果:520/6 ≈ 86.67

-- MAX:最高分
SELECT MAX(score) FROM student;
-- 结果:95

-- MIN:最低分
SELECT MIN(score) FROM student;
-- 结果:78
GROUP BY

聚合函数默认是对整张表 进行统计,如果我们想按某个字段分组统计,就需要用 GROUP BY

sql 复制代码
SELECT 分组列, 聚合函数(列)
FROM 表名
WHERE 筛选条件
GROUP BY 分组列;

示例:统计每个班的人数

sql 复制代码
SELECT class, COUNT(*) AS 人数
FROM student
GROUP BY class;
-- 结果:
--   1班 | 3
--   2班 | 3
HAVING 筛选分组结果

WHERE 只能过滤分组前的原始数据,如果我们想对分组后的结果 再做筛选,就需要用 HAVING

sql 复制代码
SELECT dept, COUNT(*) as 人数
FROM employee
GROUP BY dept
HAVING COUNT(*) > 5;   -- 只显示人数大于5的部门

示例:只显示平均分大于85的班级

sql 复制代码
SELECT class, AVG(score) AS 平均分
FROM student
GROUP BY class
HAVING AVG(score) > 85;
-- 结果:
--   1班 | 90.67
-- (2班平均分82.67被筛掉)

5.权限控制

用来管理用户账号、分配 / 回收权限,防止越权操作。

用户管理

sql 复制代码
-- 创建用户
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';

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

-- 修改密码
ALTER USER '用户名'@'主机' IDENTIFIED BY '新密码';
sql 复制代码
-- 创建用户:用户名zhangsan,只能在本地登录,密码123456
CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY '123456';

-- 创建用户:用户名lisi,可以从任何地方登录
CREATE USER 'lisi'@'%' IDENTIFIED BY 'password';

-- 删除用户
DROP USER 'zhangsan'@'localhost';

权限授权(GRANT)

GRANT 用来给用户分配操作权限,比如查询、插入、修改数据的权限。

sql 复制代码
-- 授予所有权限
GRANT ALL PRIVILEGES ON 数据库.* TO '用户名'@'主机';

-- 授予特定权限
GRANT SELECT, INSERT, UPDATE ON 数据库.表名 TO '用户名'@'主机';

-- 允许授权给他人(WITH GRANT OPTION)
GRANT SELECT ON *.* TO '用户名'@'主机' WITH GRANT OPTION;

-- 刷新权限(MySQL需要)
FLUSH PRIVILEGES;
sql 复制代码
-- 让zhangsan能查询学生表
GRANT SELECT ON school.student TO 'zhangsan'@'localhost';

-- 让lisi能查询和插入学生表
GRANT SELECT, INSERT ON school.student TO 'lisi'@'%';

-- 让admin拥有所有权限,还可以授权给别人
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;

-- 刷新权限(让授权立即生效)
FLUSH PRIVILEGES;

收回权限(REVOKE)

sql 复制代码
REVOKE SELECT, INSERT ON 数据库.表名 FROM '用户名'@'主机';
sql 复制代码
-- 收回zhangsan的查询权限
REVOKE SELECT ON school.student FROM 'zhangsan'@'localhost';

-- 收回lisi的所有权限
REVOKE ALL PRIVILEGES ON school.student FROM 'lisi'@'%';

查看权限

sql 复制代码
SHOW GRANTS FOR '用户名'@'主机';
SHOW GRANTS;  -- 查看当前用户权限

权限级别

常用权限列表

相关推荐
行业研究员1 小时前
腾讯云数据库:团队知识统一检索实践
数据库·云计算·腾讯云·腾讯云数据库·团队知识
朱容zr3331331 小时前
什么是覆盖索引?它的优点是什么?
数据库
一十九的酒1 小时前
Oracle Data Guard 备库归档日志满导致同步中断的解决实战
数据库·oracle·oracle-dg 续传·归档空间满
changjiahong1 小时前
lvs总结
服务器·数据库·lvs
【心态好不摆烂】1 小时前
MySQL——复合查询
数据库·mysql
AC赳赳老秦1 小时前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
瞬间&永恒~2 小时前
【MySQL】 InnoDB 锁等待排查与并发压测实验
运维·数据库·mysql
布鲁飞丝2 小时前
对 .NET线程 异常退出引发程序崩溃的反思
数据库·c#·.net
zcmodeltech2 小时前
智能矿井沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的感知-传输-控制一体化方案
服务器·数据库·分布式·stm32·单片机·嵌入式硬件
江晓鱼未暖3 小时前
十七、Redis 核心原理与架构详解
大数据·数据库·数据仓库·redis·缓存·架构