MySQL基础
1. SQL语言的分类
2. SQL规范
2.1 大小写
- Windows环境下大小写不敏感
- Linux环境下大小写敏感
书写规范: - 小写:数据库名、表名、表别名、字段名、字段别名等
- 大写:SQL关键字、函数名、绑定变量等
2.2 注释
- 单行注释:
- 井号:# 单行注释 (MySQL特有)
- -- 单行注释 (--后必须有空格)
- 多行注释:
/*
多行注释
*/
2.3 列的别名
列的别名:重命名列
- 建议:别名简洁,见名知意
- 在原有名字后面直接写,用 双引号 包住(双引号可省)
- 使用AS关键字,as(alias,别名)可省
SELECT employee_id emp_id, department_id "部门id", last_name AS lname, salary * 12 AS "annual sal"
FROM employees
2.4 字符串
- mysql中字符串的下标从1开始
- 字符串匹配
_
可以替代一个字符%
可以替代任意多个字符(包括0个)ESCAPE
后面的表示转义字符
-- 查询以DB_开头,倒数第3个字符为i的字符串
SELECT *
FROM table_name
WHERE Cname LIKE 'DB\_%i__'
ESCAPE '\';
- 用正则表达式匹配字符串
2.5 导入已有的数据
- source 文件的全路径名(命令行)
source d:/mysqldb.sql
- 图形化界面工具中的按钮选项导入数据
例如SQLyog中:工具 - 执行sql脚本 - 选中xxx.sql
3. 查询
3.1 标准的 SELECT 语句
SELECT ....,....,....(存在聚合函数)
FROM ... (LEFT / RIGHT) JOIN ....ON 多表的连接条件
(LEFT / RIGHT)JOIN ... ON ....
WHERE 不包含聚合函数的过滤条件
GROUP BY ...,....
HAVING 包含聚合函数的过滤条件
ORDER BY ....,...(ASC / DESC )
LIMIT ...,....
3.2 聚合查询(GROUP BY)
- SELECT中出现的非聚合函数字段必须放在GROUP BY 后,作为分组的依据
- 常见的聚合函数有
AVG()
,MIN()
,MAX()
,COUNT()
WHERE
声明在GROUP BY
前面,过滤条件中不包含聚合函数HAVING
声明在GROUP BY
后面,过滤条件中有聚合函数,则使用HAVING
,
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000;
-- 查询选修了2门以上课程的学生的学号和选课数
SELECT Sno, count(Cno)
FROM SC
GROUP BY Sno
HAVING count(Cno) >= 2;
3.3 嵌套查询
- 子查询的位置
在SELECT中,除了GROUP BY 和 LIMIT,其他位置都可以使用子查询。 - MySQL中聚合函数是不能嵌套的,Oracle中是支持的。
解决方法:- 将聚合函数得到的结果取别名,作为一张新表。对新表可以使用聚合函数。作用相当于聚合函数的嵌套。
SELECT MIN(avg_sal)
FROM(
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY department_id
) t_dept_avg_sal
# t_dept_avg_sal是表的别名
- 空值问题
# 错误写法
SELECT last_name
FROM employees
WHERE employee_id NOT IN (
SELECT manager_id
FROM employees
);
出错原因:内层查询的manager_id中有null。
# 正确写法
SELECT last_name
FROM employees
WHERE employee_id NOT IN (
SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL
);
3.4 集合运算
- 交:
INTERSECT
- 并:
UNION
- 差:
EXCEPT
或MINUS
- 关键字
DISTINCT
能够去重
3.5 EXISTS
的用法
-- 查询选修了全部课程的学生的学号、姓名
SELECT Sno, Sname FROM Student WHERE NOT EXISTS(
SELECT * FROM Course WHERE NOT EXISTS(
SELECT * FROM SC
WHERE Student.Sno = SC.Sno
AND Course.Cno = SC.Cno
)
);
4. 增、删、改
4.1 插入数据
- 插入单条数据
INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept)
VALUES ('1001', 'mike', 'male', 20, 'CS');
- 将子查询结果插入关系
INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept)
子查询语句
4.2 删除数据
DELETE FROM Student
WHERE ...
4.3 修改数据
UPDATE Student
Set Sage = 21, Sdept = 'AI', ..., Attribute = Values
WHERE ...
5. DCL 数据控制语言
5.1 授权
GRANT <privilege list> ON <relation> TO <user list>
- privilege list包括各种操作,如 select, update, insert, delete
5.2 收回权限
REVOKE <privilege list> ON <relation> FROM <user list>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)