mysql

32 阅读6分钟

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、数值类型
类型大小范围描述
TINYINT1字节-128~127小整数
SMALLINT2字节-32768~32767中等整数
INT4字节±21亿标准整数
BIGINT8字节±922亿亿大整数
FLOAT4字节约±3.4E38单精度浮点数
DOUBLE8字节约±1.8E308双精度浮点数
DECIMAL(m,d)可变精确小数金融计算

ps:signed表示有符号(默认),unsigned表示无符号

2、字符串类型
类型最大长度描述
CHAR(n)255字符定长字符串
VARCHAR(n)65535字符变长字符串
TEXT65535字符长文本
LONGTEXT4GB超长文本
BLOB65535字节二进制数据
3、日期时间处理类型
类型格式范围描述
DATEYYYY-MM-DD1000-01-01~9999-12-31日期
TIMEHH:MM:SS-838:59:59~838:59:59时间
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00~9999-12-31 23:59:59日期时间
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 00:00:01~2038-01-19 03:14:07时间戳
YEARYYYY1901~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 = '技术'
NOTWHERE 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 偏移量, 每页记录数;