数据库(四)——关系数据库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 小时前
SQL与数据库开发(二):用 CTE 重构嵌套查询与处理树形结构
sql·数据库开发
问心无愧05131 小时前
ctf show web入门31
前端·笔记
brevity_souls1 小时前
SQL server格式化日期
运维·服务器·数据库
远离UE41 小时前
Forward+ & Deferred+学习笔记
笔记·数码相机·学习
虹科网络安全1 小时前
艾体宝干货|Active-Active/Active-Passive 数据库架构解析:高可用设计中的权衡与选型
数据库·数据库架构
麦聪聊数据1 小时前
SQL与数据库开发(一):用窗口函数替代应用层的嵌套循环
数据库·sql·数据库开发
努力进修1 小时前
连接条件下推原理与实战:解决子查询、CTE大数据量性能问题
数据库·oracle
小贺儿开发1 小时前
Unity3D 年会抽奖工具(附体验链接)
数据库·unity·excel·人机交互·工具·抽奖·互动
Hua-Jay1 小时前
OpenCV联合C++/Qt 学习笔记(十六)----图像细化、轮廓检测、轮廓信息统计及轮廓外接多边形
c++·笔记·qt·opencv·学习·计算机视觉