LiuJinTao: 2024年4月14日
MySQL数据库操作语言 SQL语句涵盖(DQL、 DDL、 DML、 DCL)需求及源码分享
- 无论是对数据库还是数据表的操作,这片文章都涉及到了。增删改查、到用户创建以及权限分配。直接可以上手项目基本需求。
需求及源码如下:
-- 创建数据表 emp
CREATE TABLE emp (
id int comment '编号',
workno varchar(10) comment '工号',
name varchar(50) comment '姓名',
gender char comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号码',
workaddress varchar(50) comment '地区',
entrydate date comment '入职时间'
) comment '员工表';
-- -------------------------------表 - 插入数据----------------------------------------
-- 1. 对 emp 表 指定字段 插入数据
insert into emp(id, workno, name, gender, age, idcard, workaddress, entrydate) values(1, '1', '张三', '男', 23, 123456987456321023, '江西', '2024-04-13');
-- 2. 对 emp 表 所有字段 插入数据
insert into emp values(2, '2', '李四', '男', 24, 123456987456323023, '广东', '2024-04-13');
-- 3. 对 emp 表 所有字段 批量插入数据
insert into emp values(3, '3', '王五', '男', 25, 123456987456323023, '上海', '2024-04-13'), (4, '4', '赵六', '男', 26, 123456987456323023, '北京', '2024-04-13');
-- asdfas
-- -------------------------------表 - 修改数据----------------------------------------
-- 1. 修改 id 为 1 的数据, 将 name 修改为 zhangsan
update emp set name = 'zhangsan' where id = 1;
-- 2. 修改 id 为 1 的数据,将 name 修改为 小三毛, gender 修改为 女
update emp set name = '小三毛', gender = '女' where id = 1;
-- 3. 将所有员工入职日期修改为 2024-01-01 (不添加 where 表示更新表所有字段)
update emp set entrydate = '2024-01-01';
-- -------------------------------表 - 删除数据----------------------------------------
-- 1. 删除 gender 为女 的员工
delete from emp where gender = '女';
-- 2. 删除所有员工
delete from emp;
-- -------------------------------表 - emp2 数据准备----------------------------------------
CREATE TABLE emp2 (
id int comment '编号',
workno varchar(10) comment '工号',
name varchar(50) comment '姓名',
gender char comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号码',
workaddress varchar(50) comment '地区',
entrydate date comment '入职时间'
) comment '员工表2';
-- -------------------------------表 - 给 emp2 表 指定插入 二十条数据 ----------------------------------------
INSERT INTO emp2 (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES
(1, '001', '张三', '男', 25, '320102198001012345', '北京', '2022-01-01'),
(2, '002', '李四', '女', 30, '320102198101012345', '上海', '2021-12-15'),
(3, '003', '王五', '男', 28, '320102198201012345', '广州', '2022-02-28'),
(4, '004', '赵六', '女', 35, '320102198301012345', '深圳', '2022-03-10'),
(5, '005', '钱七', '男', 22, '320102198401012345', '成都', '2021-11-20'),
(6, '006', '孙八', '女', 27, '320102198501012345', '重庆', '2022-01-05'),
(7, '007', '周九', '男', 33, '320102198601012345', '南京', '2021-12-30'),
(8, '008', '吴十', '女', 29, '320102198701012345', '杭州', '2022-02-14'),
(9, '009', '郑十一', '男', 31, '320102198801012345', '武汉', '2022-03-01'),
(10, '010', '王十二', '女', 26, '320102198901012345', '西安', '2021-11-10'),
(11, '011', '李十三', '男', 29, '320102199001012345', '苏州', '2022-01-25'),
(12, '012', '张十四', '女', 34, '320102199101012345', '天津', '2022-02-08'),
(13, '013', '王十五', '男', 27, '320102199201012345', '青岛', '2021-12-20'),
(14, '014', '赵十六', '女', 32, '320102199301012345', '沈阳', '2022-03-05'),
(15, '015', '孙十七', '男', 23, '320102199401012345', '长沙', '2021-11-15'),
(16, '016', '周十八', '女', 28, '320102199501012345', '太原', '2022-01-10'),
(17, '017', '吴十九', '男', 30, '320102199601012345', '郑州', '2022-02-15'),
(18, '018', '郑二十', '女', 25, '320102199701012345', '昆明', '2021-12-25'),
(19, '019', '刘二十一', '男', 34, '320102199801012345', '济南', '2022-01-05'),
(20, '020', '黄二十二', '女', 31, '320102199901012345', '南昌', '2022-03-20');
-- -------------------------------表 - 基本查询----------------------------------------
-- 1. 查询指定字段 name, workno, age 返回
select name, workno, age from emp2;
-- 2. 查询所有字段返回(开发规范 不建议写 * )
select * from emp2;
select id, workno, name, gender, age, idcard, workaddress, entrydate from emp2;
-- 3. 查询所有员工工作地址,起别名
select workaddress as '工作地址' from emp2;
-- 4.查询员工上班地址(去重)
select distinct workaddress as '工作地址' from emp2;
-- -------------------------------表 - 条件查询----------------------------------------
-- 1. 查询年龄等于 88 的员工
select * from emp2 where age = 88;
-- 2. 查询年龄小于 20 的 员工信息
select * from emp2 where age < 20;
-- 3. 查询年龄小于等于 20 的员工信息
select * from emp2 where age <= 20;
-- 4. 查询没有身份证号码的员工信息
select * from emp2 where idcard is null;
-- 5. 查询有身份证号码的员工信息
select * from emp2 where idcard is not null;
-- 6. 查询年龄小于等于 88 的 员工信息
select * from emp2 where age <= 88;
-- 7. 查询年龄在 15 岁 (包含), 到 20 岁(包含)之间的员工信息
select * from emp2 where age between 15 and 20; -- 不能写反了
-- 8. 查询性别为 女 且 年龄小于 25 岁的 员工信息
select * from emp2 where gender = '女' and age < 25;
-- 9. 查询年龄 等于 18 或者 20 或者 40 的员工信息
select * from emp2 where age = 18 or age = 20 or age = 40;
select * from emp2 where age in (18, 20, 40);
-- 10. 查询姓名为两个字的员工信息
select * from emp2 where name like '__';
-- 11,查询身份证最后一位是 X 的员工信息
select * from emp2 where idcard like '%X';
-- -------------------------------表 - 聚合函数----------------------------------------
-- 1. 统计该企业员工数量
select count(id) from emp2;
select count(*) from emp2;
-- 2. 统计该企业员工的平均年龄
select avg(age) from emp2;
-- 3. 统计该企业员工的最大年龄
select max(age) from emp2;
-- 4. 统计该企业员工的最小年龄
select min(age) from emp2;
-- 5. 统计北京地区员工的年龄之和
select sum(age) from emp2 where workaddress = '北京';
-- -------------------------------表 - 分组查询 ----------------------------------------
-- 1. 根据性别分组, 统计 男性 和 女性 员工的数量
select gender, count(id) from emp2 group by gender;
-- 2. 根据性别分组, 统计男性员工 和 女性员工 的平均年龄
select gender, avg(age) from emp2 group by age;
-- 3. 查询年龄小于 45 岁的员工, 并根据工作地址分组, 获取员工数量大于等于 3 的工作地址
select workaddress, count(*) address_count from emp2 where age < 45 group by workaddress having address_count >= 3;
-- -------------------------------表 - 排序查询 ----------------------------------------
-- 1. 根据年龄对公司的员工进行升序排序
select * from emp2 order by age asc;
-- 2. 根据入职时间,对员工进行降序排序
select * from emp2 order by entrydate desc;
-- 3. 根据年龄对公司的员工进行升序排序,年龄相同, 在按照入职时间进行降序排序
select * from emp2 order by age asc, entrydate desc;
-- -------------------------------表 - 分页查询 ----------------------------------------
-- 1. 查询第一页员工数据, 每页展示 10 条记录
select * from emp2 limit 0, 10;
-- 2. 查询第二页的员工数据, 每页展示 10 条记录
select * from emp2 limit 10, 10;
-- -------------------------------表 - DQL综合 ----------------------------------------
-- 1. 查询年龄为 20、 21、 22、 23 岁的女性员工信息
select * from emp2 where age in (20, 21, 22, 23);
-- 2. 查询性别为 男, 并且年龄在 20 - 40岁 (含)以内的姓名为三个字的员工信息
select * from emp2 where gender = '男' and age between 20 and 40 and name like'___';
-- 3. 统计员工表中,年龄小于60 岁的, 男性员工和女性员工的人数
select gender, count(age) from emp2 where age < 60 group by gender;
-- 4. 查询所有年龄小于等于 35 岁员工姓名和年龄, 并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序
select name, age from emp2 where age <= 35 order by age asc, entrydate desc;
-- 5. 查询性别为男,且年龄在 20-40 岁(含) 以内的前 5 个员工信息,对查询的结果按年龄进行升序排序,年龄相同按入职时间排序。
select gender, age from emp2 where gender = '男' and age between 20 and 40 order by age asc, entrydate desc limit 0, 5;
-- -------------------------------用户 - DCL 创建用户 ----------------------------------------
-- 创建用户 data_test1, 只能够在当前主机 localhost 访问, 密码 123456
create user 'data_test1'@'localhost' identified by '123456';
-- 创建用户 dats_test2, 可以在任意主机访问该数据库, 密码 123456
create user 'dats_test2'@'%' identified by '123456';
-- 修改用户名 dats_test2 的访问密码为 1234
alter user 'dats_test2'@'%' identified with mysql_native_password by '1234';
-- 删除 data_test1@localhost用户
drop user 'data_test1'@'localhost';
-- -------------------------------用户 - DCL 权限控制 ----------------------------------------
-- 1. 查询权限
show grants for 'test'@'localhost';
-- 2. 授予权限
grant all on jintao.* to 'test'@'localhost';
-- 3. 撤销权限
revoke all on jintao.* from 'test'@'localhost';