1、DDL(数据库操作)
查询
- 查询所有数据库:show databases;
- 当前数据库:select database();
创建
- 创建数据库:create database [ if not exists] 数据库名 ;
使用
- 使用数据库:use 数据库名 ;
删除
- 删除数据库:drop database [ if exists ] 数据库名 ;
2、DDL(表操作)
MySQL数据类型
查询
- 查询当前数据库所有表:show tables;
- 查询表结构:desc 表名;
- 查询建表语句:show create table 表名;
修改
- 添加字段:alter table 表名 add 字段名 类型(长度) [comment 注释] [约束];
- 修改字段类型:alter table 表名 modify 字段名 新数据类型(长度);
- 修改字段名和字段类型:alter table 表名 change 旧字段名 新字段名 类型 (长度) [comment 注释] [约束];
- 删除字段:alter table 表名 drop column 字段名;
- 修改表名: rename table 表名 to 新表名;
删除
- 删除表:drop table [ if exists ] 表名;
(注:在删除表时,先把建表语句给备份一下,不然表中的全部数据也会被删除。)
3、DML(INSERT:插入)(重点)
insert语法
- 指定字段添加数据:insert into 表名 (字段名1, 字段名2) values (值1, 值2);
- 全部字段添加数据:insert into 表名 values (值1, 值2, …);
- 批量添加数据(指定字段):insert into 表名 (字段名1, 字段名2) values (值1, 值2), (值1, 值2);
- 批量添加数据(全部字段):insert into 表名 values (值1, 值2, …), (值1, 值2, …);
注意事项
- 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
- 字符串和日期型数据应该包含在引号中。
- 插入的数据大小,应该在字段的规定范围内。
4、DML(UPDATE:修改)(重点)
update语法
- 修改数据:update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , …. [ where 条件 ] ;
注意事项
- 修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
5、DML(DELETE:删除)(重要)
delete语法
- 删除数据:delete from 表名 [ where 条件 ];
注意事项
- DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
- DELETE 语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL)。
6、数据库操作-DQL
DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。
基本查询
语法
- 查询多个字段:select 字段1, 字段2, 字段3 from 表名;
- 查询所有字段(通配符):*select from** 表名;(不常用)
- 设置别名:select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ] from 表名; (as可省略)
- 去除重复记录:select distinct 字段列表 from 表名;
- (注意事项:* 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。)
-- =================== 基本查询 ======================
-- 1. 查询指定字段 name,entrydate 并返回
select name,entrydate from emp ;
-- 2. 查询返回所有字段
-- 方式一: 推荐 , 效率高 . 更直观
select id, username, password, name, gender, image, job, entrydate, create_time, update_time from emp;
-- 方式二:
select * from emp;
-- 3. 查询所有员工的 name,entrydate, 并起别名(姓名、入职日期) --- as 关键字可以省略
select name as '姓名' ,entrydate as '入职日期' from emp ;
select name '姓名' ,entrydate '入职日期' from emp ;
-- 4. 查询员工有哪几种职位(不要重复) -- distinct
select distinct job from emp;
条件查询(where)
语法
条件查询:select 字段列表 from 表名 where 条件列表 ;
-- =================== 条件查询 ======================
-- 1. 查询 姓名 为 杨逍 的员工
select * from emp where name = '杨逍';
-- 2. 查询在 id小于等于5 的员工信息
select * from emp where id <= 5;
-- 3. 查询 没有分配职位 的员工信息 -- 判断 null , 用 is null
select * from emp where job is null;
-- 4. 查询 有职位 的员工信息 -- 判断 不是null , 用 is not null
select * from emp where job is not null ;
-- 5. 查询 密码不等于 '123456' 的员工信息
select * from emp where password <> '123456';
select * from emp where password != '123456';
-- 6. 查询入职日期 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间的员工信息
select * from emp where entrydate between '2000-01-01' and '2010-01-01' ;
-- 7. 查询 入职时间 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间 且 性别为女 的员工信息
select * from emp where (entrydate between '2000-01-01' and '2010-01-01') and gender = 2;
-- 8. 查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息
select * from emp where job = 2 or job = 3 or job = 4;
select * from emp where job in (2,3,4);
-- 9. 查询姓名为两个字的员工信息
select * from emp where name like '__';
-- 10. 查询姓 '张' 的员工信息 ---------> 张%
select * from emp where name like '张%';
-- 11. 查询姓名中包含 '三' 的员工信息
select * from emp where name like '%三%';
分组查询(group by)
聚合函数
- 介绍:将一列数据作为一个整体,进行纵向计算。
- 语法:select 聚合函数(字段列表) from 表名 ;
- 注意事项
1. null值不参与所有聚合函数运算。
2. 统计数量可以使用:count(*) count(字段) count(常量),推荐使用count(*)。
-- 聚合函数
-- 1. 统计该企业员工数量 -- count
-- A. count(字段)
select count(id) from emp;
select count(job) from emp; -- null值不参与聚合函数运算
-- B. count(*)
select count(*) from emp;
-- C. count(值)
select count(1) from emp;
-- 2. 统计该企业员工 ID 的平均值
select avg(id) from emp;
-- 3. 统计该企业最早入职的员工的入职日期
select min(entrydate) from emp;
-- 4. 统计该企业最近入职的员工的入职日期
select max(entrydate) from emp;
-- 5. 统计该企业员工的 ID 之和
select sum(id) from emp;
语法
- 分组查询:select 字段列表 from 表名 [ where 条件 ] group by 分组字段名 [ having 分组后过滤条件 ];
- where与having区别(面试问题)
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
注意事项
1. 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
2. 执行顺序: where > 聚合函数 > having 。(where 之后不能使用聚合函数)
-- 分组查询
-- 1. 根据性别分组 , 统计男性和女性员工的数量 -- count
select gender , count(*) from emp group by gender;
-- 2. 先查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位 -- count
select job ,count(*) from emp where entrydate <= '2015-01-01' group by job having count(*) >= 2;
排序查询(order by)
语法
- 条件查询:select 字段列表 from 表名 [ where 条件列表 ] [ group by 分组字段 ] order by 字段1 排序方式1 , 字段2 排序方式2
排序方式
- ASC:升序(默认值)
- DESC:降序
注意事项
1. 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
-- =================== 排序查询 ======================
-- 1. 根据入职时间, 对员工进行升序排序 -- 排序条件
select * from emp order by entrydate asc ; -- 默认升序, asc可以省略的
select * from emp order by entrydate ;
-- 2. 根据入职时间, 对员工进行降序排序
select * from emp order by entrydate desc;
-- 3. 根据 入职时间 对公司的员工进行 升序排序 , 入职时间相同 , 再按照 ID 进行降序排序
select * from emp order by entrydate asc , id desc ;
分页查询(limit)
语法
分页查询:select 字段列表 from 表名 limit 起始索引, 查询记录数 ;
注意事项
- 起始索引从0开始,起始索引 = (查询页码 – 1)* 每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
-- =================== 分页查询 ======================
-- 1. 查询第1页员工数据, 每页展示10条记录
select * from emp limit 0,10;
select * from emp limit 10;
-- 2. 查询第2页员工数据, 每页展示10条记录
select * from emp limit 10,10;
-- 公式 : 页码 ---> 起始索引 -------> 起始索引 = (页码 - 1) * 每页记录数
7、案例
根据需求完成员工管理的条件分页查询
-- 根据输入条件查询第1页数据(每页展示10条记录)
-- 输入条件:
-- 姓名:张 (模糊查询)
-- 性别:男
-- 入职时间:2000-01-01 ~ 2015-12-31
-- 分页: 0 , 10
-- 排序: 修改时间 DESC
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
where name like '张%' and gender = 1 and entrydate between '2000-01-01' and '2015-12-31'
order by update_time desc
limit 0 , 10;
根据需求完成员工信息的统计
员工性别统计:
-- if(条件表达式, true取值 , false取值)
select if(gender=1,'男性员工','女性员工') AS 性别, count(*) AS 人数
from tb_emp
group by gender;
员工职位统计:
-- case 表达式 when 值1 then 结果1 when 值2 then 结果2 ... else result end
select (case job
when 1 then '班主任'
when 2 then '讲师'
when 3 then '学工主管'
when 4 then '教研主管'
else '未分配职位'
end) AS 职位 ,
count(*) AS 人数
from tb_emp
group by job;
来自上海