一、基础概念
- DB、DBMS、SQL 区分
- DB:数据库,用来存放真实业务数据。类比:一个 Excel 文件。
- DBMS:数据库管理系统,管理数据库软件,MySQL 就是 DBMS。类比 WPS/Excel 软件。
- SQL:结构化查询语言,专门操作关系型数据库,不属于编程语言。
关系型数据库:数据存储为二维表格,表和表之间可以建立关联。
2.MySQL 基础配置
- 默认端口:3306,修改端口后防火墙需要同步放行。
- 安装注意:安装路径、电脑主机名禁止中文,否则极易出现编码乱码。
- 字符集差异:
- MySQL5.7:默认
latin1,不支持中文,配置文件 my.ini 要手动改成utf8mb4。 - MySQL8.0:默认
utf8mb4,完整支持中文与 emoji 表情。
- MySQL5.7:默认
二、客户端连接 & 常用基础命令
2.1 命令行连接语法
mysql -h主机地址 -P端口号 -u用户名 -p参数说明:
-h:服务地址,本机填127.0.0.1或者localhost-P:端口,大写 P,默认 3306;多实例场景填写自定义端口-u:用户名,最高权限账号 root-p:密码,小写 p,建议回车后再输入密码,不要直接写在命令行,防止泄露到历史记录。
示例:
#连接本机默认实例 mysql -h localhost -P 3306 -u root -p2.2 终端内高频指令
| 命令 | 功能 |
|---|---|
show databases; | 查看全部数据库 |
use 库名; | 切换指定数据库,操作表前必须执行,否则报错未选择数据库 |
show tables; | 查看当前库下面所有数据表 |
desc 表名; | 查看表结构(字段、类型、是否允许 NULL、主键、默认值),完整写法describe,不能简写 des |
select version(); | 查看 MySQL 版本 |
source 绝对路径 | 导入本地 sql 脚本文件 |
exit / quit | 退出 mysql 客户端 |
注意:SQL 语句末尾必须加分号
;作为结束标记,忘记分号命令行会一直等待输入。
2.3 可视化工具 Navicat / DBeaver
连接要素:连接别名、主机、端口、账号密码。
坑点:MySQL8.0 用户密码加密插件是
caching_sha2_password,旧版 DBeaver 驱动会报密码异常。两种处理:①修改用户加密方式为旧版;②升级驱动包。 工作环境很多老项目依旧使用 MySQL5.7,排错优先确认数据库版本。
三、SQL 四大语言分类
| 类型 | 全称 | 作用 | 代表关键字 |
|---|---|---|---|
| DDL | 数据定义语言 | 操作库、表结构,建 / 改 / 删对象 | CREATE、ALTER、DROP、TRUNCATE |
| DML | 数据操作语言 | 表内部数据增删改 | INSERT、UPDATE、DELETE |
| DQL | 数据查询语言 | 专门做数据查询,开发写的最多 | SELECT |
| DCL | 数据控制语言 | 账号权限分配回收 | GRANT、REVOKE |
四、通用 SQL 语法规则
- 语句结束:英文分号
;;\G可以把查询结果竖排展示,阅读长记录很方便。 - 换行缩进:一条 SQL 可以拆多行写,缩进提升可读性。
- 符号区分(高频踩坑)
- 反引号
`:包裹库名、表名、字段名。如果名字刚好是 SQL 关键字,必须加反引号,例select * from `order`; - 单引号
' ':包裹字符串常量,跨数据库(Oracle 等)通用,写字符串优先单引号。 - 双引号
" ":MySQL 可以用来写列别名,别名带空格中文时使用。
4.注释写法
#单行注释 -- 单行注释(--后面必须有空格) /* 多行注释,可以写多行文本 */5.大小写:SQL 关键字大小写不敏感;Linux 服务器上表名区分大小写,Windows 不区分。
五、SELECT 基础查询 DQL
5.1 查询基础写法
-- 查询常量表达式 SELECT 10, 20, 3+5; -- 查询指定字段 SELECT id,name FROM user; -- 查询全部字段,生产环境不推荐*,会读取全部列,性能差,表结构变更容易出问题 SELECT * FROM user;5.2 列别名、表别名 AS
AS关键字可以省略;别名仅改变输出结果,原表字段名不变。
-- 标准别名 SELECT id AS user_id, name AS username FROM user AS u; -- 省略AS简写 SELECT id user_id, name username FROM user u; -- 别名含中文空格,双引号包裹 SELECT salary AS "员工薪资" FROM user;表别名作用:多表关联的时候限定字段,避免字段重名冲突,
u.id。
5.3 DISTINCT 去重
DISTINCT紧跟 SELECT 之后,对后面全部字段组合去重,不是只作用第一个字段。
--单列去重 SELECT DISTINCT department FROM emp; --多字段组合去重 SELECT DISTINCT department,job FROM emp;NULL 值会被合并,多条 NULL 只会保留一行。
六、WHERE 条件过滤 & NULL 重点
NULL 含义:未知,不等于 0,不等于空字符串 ''。任何运算只要包含 NULL,结果直接返回 NULL。
6.1 NULL 判断易错
错误写法:where col = NULL,永远查不到数据。
正确:IS NULL、IS NOT NULL;安全等于<=>可以识别 NULL。
--查询绩效为空的员工 SELECT name FROM emp WHERE commission IS NULL; --绩效不为空 SELECT name FROM emp WHERE commission IS NOT NULL;IFNULL(字段,默认值)函数,当字段是 NULL 的时候,使用传入的默认值代替。
-- 如果commission为null,按0计算薪资 SELECT salary * (1 + IFNULL(commission,0)) FROM emp;6.2 各类运算符
- 算术运算符
+ - * / DIV % MOD
隐式转换:字符串参与运算会尝试转数字;无法转数字的字符串当作 0 参与计算。
SELECT 1+'2'; --结果 3 SELECT 1+'abc'; --结果12.比较运算符=、<>/!=、><>=<=;<=>安全等于,支持 NULL 比较。
只要条件里出现 NULL,比较结果返回 NULL,不是 true/false。
3.区间、列表、模糊匹配
BETWEEN A AND B:闭区间,等价>=A AND <=B,包含两端值。IN(值1,值2)判断字段是否在列表中;NOT IN不在列表。LIKE模糊匹配:%匹配任意数量字符,_匹配单个字符。
--名字带a SELECT name FROM emp WHERE name LIKE '%a%'; --S开头,一共5个字符 SELECT name FROM emp WHERE name LIKE 'S____';如果要匹配字符
_、%本身,使用ESCAPE指定转义符号。
REGEXP正则匹配,直接写正则表达式完成匹配。
4.逻辑运算符NOT>AND>OR,优先级 NOT 最高,复杂条件建议手动加括号,不要依赖默认优先级。
七、排序 ORDER BY 与分页 LIMIT
7.1 ORDER BY 排序
执行顺序:WHERE之后,LIMIT之前。
ASC升序,默认;DESC降序。- 多字段排序:只有前面字段值相等,才会使用后面字段排序;每个字段可以单独指定升降序。
--部门升序,部门相同工资降序 SELECT name,dept,salary FROM emp ORDER BY dept ASC, salary DESC;坑点:
WHERE不能使用列别名;ORDER BY可以使用别名。中文别名要使用反引号,不要用双引号,双引号会识别成字符串常量。- NULL 排序:ASC 时 NULL 排在最前面;DESC 时 NULL 排在最后。
- 如果排序字段存在重复值,排序结果是不稳定的,分页会出现重复 / 丢失数据,建议最后追加主键 id 排序保证确定性。
7.2 LIMIT 分页(MySQL 特有)
语法两种等价写法:
LIMIT 偏移量,行数; LIMIT 行数 OFFSET 偏移量;偏移量从0 开始计数,整条 SQL 语句写在最后面。
分页公式:第 n 页,每页 m 条:LIMIT (n-1)*m , m
--第一页,10条 SELECT * FROM emp LIMIT 0,10; --第二页,10条 SELECT * FROM emp LIMIT 10,10;分页必须搭配 ORDER BY,否则数据顺序随机,分页错乱。Oracle 使用 ROWNUM,SQL Server 使用 OFFSET FETCH,没有 LIMIT 语法。