一、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; -- 查看当前用户权限
权限级别

常用权限列表





