DDL
数据库操作
--查询所有数据库
show databases;
--切换数据库
use 【数据库名】
--查询当前数据库
select database();
--创建数据库
create database 【数据库名】
--删除数据库
drop database 【数据库名】
表操作
创建表
CREATE TABLE user(
id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'ID,唯一标识', -- 主键约束 AUTO_INCREMENT自增
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名', -- 非空 唯一
name VARCHAR(10) NOT NULL COMMENT '姓名', -- 非空
age INT COMMENT '年龄',
gender CHAR(1) DEFAULT '男' COMMENT '性别' -- 默认
)COMMENT '用户信息表';
数据类型
1、数值类型
| 类型 | 大小 | 范围 | 描述 |
|---|---|---|---|
| TINYINT | 1字节 | -128~127 | 小整数 |
| SMALLINT | 2字节 | -32768~32767 | 中等整数 |
| INT | 4字节 | ±21亿 | 标准整数 |
| BIGINT | 8字节 | ±922亿亿 | 大整数 |
| FLOAT | 4字节 | 约±3.4E38 | 单精度浮点数 |
| DOUBLE | 8字节 | 约±1.8E308 | 双精度浮点数 |
| DECIMAL(m,d) | 可变 | 精确小数 | 金融计算 |
ps:signed表示有符号(默认),unsigned表示无符号
2、字符串类型
| 类型 | 最大长度 | 描述 |
|---|---|---|
| CHAR(n) | 255字符 | 定长字符串 |
| VARCHAR(n) | 65535字符 | 变长字符串 |
| TEXT | 65535字符 | 长文本 |
| LONGTEXT | 4GB | 超长文本 |
| BLOB | 65535字节 | 二进制数据 |
3、日期时间处理类型
| 类型 | 格式 | 范围 | 描述 |
|---|---|---|---|
| DATE | YYYY-MM-DD | 1000-01-01~9999-12-31 | 日期 |
| TIME | HH:MM:SS | -838:59:59~838:59:59 | 时间 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 日期时间 |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01~2038-01-19 03:14:07 | 时间戳 |
| YEAR | YYYY | 1901~2155 | 年份 |
表结构修改、查询、删除
-- 查询数据库所有表
SHOW TABLES;
-- 查看表结构
DESC emp;
-- 查询建表语句
SHOW CREATE TABLE emp;
-- 字段:添加字段类型
ALTER TABLE emp ADD qq VARCHAR(13) COMMENT 'qq号';
-- 字段:修改字段类型
ALTER TABLE emp MODIFY qq VARCHAR(15) COMMENT 'qq号';
-- 字段:修改字段名
ALTER TABLE emp CHANGE qq qq_num VARCHAR(15) COMMENT 'qq号';
-- 字段:删除字段
ALTER TABLE emp DROP COLUMN qq_num;
-- 修改表名
ALTER TABLE emp RENAME to employee;
-- 删除表
DROP TABLE employee;
DML
insert
--指定字段添加数据
insert into表名(字段名1,字段名2) values (值1,值2);
-全部字段添加数据
insert into 表名 values(值1,值2,...);
-批量添加数据(指定字段)
insert into表名(字段名1,字段名2)values(值1,值2),(值1,值2);
-批量添加数据(全部字段)...),(值1,值2,...);
insert into 表名 values(值1,值2,
update
UPDATE 【表明】 SET 【需要更新的值】 WHERE 【条件】;
delete
DELETE FROM 【表名】 WHERE 【条件】;
DQL
基础查询
--查询多个字段
select字段1,字段2,字段3 from 表名;
查询所有字段(通配符)
select * from 表名;
--为查询字段设置别名,as关键字可以省略
select字段1 [as别名1],
字段2 [as 别名2] from 表名;
--去除重复记录
select distinct字段列表 from表名;
条件查询
1. 比较运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| = | 等于 | WHERE age = 18 |
| <> 或 != | 不等于 | WHERE age <> 18 |
| 大于 | WHERE salary > 5000 | |
| < | 小于 | WHERE age < 30 |
| >= | 大于等于 | WHERE score >= 60 |
| <= | 小于等于 | WHERE price <= 100 |
-- 查询年龄大于25岁的员工
SELECT * FROM employees WHERE age > 25;
-- 查询工资不等于5000的员工
SELECT * FROM employees WHERE salary != 5000;
2. 逻辑运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| AND | 并且 | WHERE age > 20 AND salary > 5000 |
| OR | 或者 | WHERE dept = '销售' OR dept = '技术' |
| NOT | 非 | WHERE NOT age > 30 |
-- 查询年龄在25-35岁之间的员工
SELECT * FROM employees WHERE age >= 25 AND age <= 35;
-- 查询销售部或技术部的员工
SELECT * FROM employees WHERE dept = '销售' OR dept = '技术';
3. 范围查询
| 运算符 | 说明 | 示例 |
|---|---|---|
| BETWEEN...AND | 在某个范围内 | WHERE age BETWEEN 20 AND 30 |
| IN | 在列表中 | WHERE dept IN ('销售', '技术', '人事') |
-- 查询年龄在20-30岁之间的员工
SELECT * FROM employees WHERE age BETWEEN 20 AND 30;
-- 查询指定部门的员工
SELECT * FROM employees WHERE dept IN ('销售部', '技术部', '市场部');
4. 模糊查询
| 运算符 | 说明 | 示例 |
|---|---|---|
| LIKE | 模糊匹配 | WHERE name LIKE '张%' |
| % | 匹配任意多个字符 | WHERE name LIKE '%技术%' |
| _ | 匹配单个字符 | WHERE name LIKE '张_' |
-- 查询姓张的员工
SELECT * FROM employees WHERE name LIKE '张%';
-- 查询姓名中包含"明"字的员工
SELECT * FROM employees WHERE name LIKE '%明%';
-- 查询姓张且名字为两个字的员工
SELECT * FROM employees WHERE name LIKE '张_';
5. 空值判断
| 运算符 | 说明 | 示例 |
|---|---|---|
| IS NULL | 是空值 | WHERE email IS NULL |
| IS NOT NULL | 不是空值 | WHERE phone IS NOT NULL |
-- 查询邮箱为空的员工
SELECT * FROM employees WHERE email IS NULL;
-- 查询手机号不为空的员工
SELECT * FROM employees WHERE phone IS NOT NULL;
分组查询
聚合函数
| 函数名 | 说明 | 语法 |
|---|---|---|
| COUNT() | 统计行数 | COUNT(expr) |
| SUM() | 求和 | SUM(column) |
| AVG() | 求平均值 | AVG(column) |
| MAX() | 求最大值 | MAX(column) |
| MIN() | 求最小值 | MIN(column) |
| GROUP_CONCAT() | 连接字符串 | GROUP_CONCAT(expr) |
-- 1. 统计该企业员工数量
SELECT COUNT(id) FROM emp;
SELECT COUNT(*) FROM emp; -- 推荐
SELECT COUNT(1) FROM emp;
-- 2. 统计该企业员工的平均薪资
SELECT AVG(salary) from emp;
-- 3. 统计该企业员工的最低薪资
SELECT MIN(salary) from emp;
-- 4. 统计该企业员工的最高薪资
SELECT MAX(salary) from emp;
-- 5. 统计该企业每月要给员工发放的薪资总额(薪资之和)
SELECT SUM(salary) from emp;
分组查询
-- 注意:分组之后,select后的字段列表不能随意书写,能写的一般是 分组字段 + 聚合函数;
-- 用法:SELECT 字段列表 FROM 表名 【WHERE 条件】 GROUP BY 分组字段名 【HAVING 条件】
-- 1. 根据性别分组 , 统计男性和女性员工的数量
SELECT gender,COUNT(*) FROM emp GROUP BY gender;
-- 2. 先查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
SELECT job,COUNT(*) FROM emp WHERE entry_date <= '2015-01-01' GROUP BY job HAVING COUNT(*)>=2;
排序查询
-- 1. 根据入职时间, 对员工进行升序排序
SELECT * FROM emp ORDER BY entry_date;
-- 2. 根据入职时间, 对员工进行降序排序
SELECT * FROM emp ORDER BY entry_date DESC;
-- 3. 根据 入职时间 对公司的员工进行 升序排序 , 入职时间相同 , 再按照 更新时间 进行降序排序
SELECT * FROM emp ORDER BY entry_date , update_time DESC;
分页查询
SELECT 列名1, 列名2, ...
FROM 表名
[WHERE 条件]
[ORDER BY 排序字段]
LIMIT 每页记录数 OFFSET 偏移量;
-- 或者
SELECT 列名1, 列名2, ...
FROM 表名
[WHERE 条件]
[ORDER BY 排序字段]
LIMIT 偏移量, 每页记录数;