数据库(四)——关系数据库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;  -- 查看当前用户权限

权限级别

常用权限列表

相关推荐
倔强的石头_9 小时前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横10 小时前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
冬奇Lab1 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence1 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神1 天前
三、用户与权限管理
数据库·mysql
麦聪聊数据2 天前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
闪闪发亮的小星星2 天前
高斯光以及高斯光公式解释
笔记
DARLING Zero two♡2 天前
【MySQL数据库】数据类型与表约束
数据库·mysql
cqbzcsq2 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息