作定期复习和查询用,打开这篇博客提高效率,避免回视频或者百度上找
👂 无论你多怪异我还是会喜欢你(《刺客伍六七》动画推广版片尾曲) - 周子琰 - 单曲 - 网易云音乐
内容来自B站黑马Mysql,检索使用
附上链接05. 基础-SQL-通用语法及分类_哔哩哔哩_bilibili
目录
🍈通用语法
🍉DDL
🌳DDL -- 数据库操作
🌳DDL -- 表操作 -- 创建&查询
🌳DDL -- 数据类型及案例
🌳DDL -- 表操作 -- 修改&删除
🍈图形化界面工具DataGrip
🍉DML
🌳DML -- 插入
🌳DML -- 更新和删除
🍉DQL
🌳DQL -- 基础查询
🌳DQL -- 条件查询
🌳DQL -- 聚合函数
🌳DQL -- 分组查询
🌳DQL -- 排序查询
🌳DQL -- 分页查询
🌳DQL -- 案例练习
🌳DQL -- 执行顺序
🌳DQL小结
🍉DCL
🌳DCL -- 用户管理
🌳DCL -- 权限控制
🌳DCL小结
🥔总结
🍈通用语法
SQL分类
sql不区分大小写
🍉DDL
🌳DDL -- 数据库操作
[]内容可省略
🌳DDL -- 表操作 -- 创建&查询
查询👇 创建👇
下面通过DDL -- 表操作 -- 创建下面列表
!!注意,不要在系统库里执行任意操作,在创建表之前,一定要先切回自定义数据库👇
mysql> use itcast;
Database changed
🌳DDL -- 数据类型及案例
MySQL数据类型分为:
数值类型,字符串类型,日期时间类型
数值类型
精度是整个数值的长度,标度是小数位数,比如123.45,精度5,标度2
字符串类型
例子:char(10), varchar(10), 超过长度会报错
定长字符串char:不超过的部分,会用空格补位,即使存储1个字符,也会占用10个字符的空间
👆char性能好
变长字符串varchar:存储1个字符,就只占用1个字符的空间
👆varchar性能较差
日期类型
任务
create table emp(
id int comment '编号',
workno varchar(10) comment '工号',
name varchar(10) comment '姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号',
entrydate date comment '入职时间'
) comment '员工表';
🌳DDL -- 表操作 -- 修改&删除
增
改
删
truncate table 表名,这种方式,表中数据也会全部删除,只是另外创建了个空表
查上面有讲
DDL总结
🍈图形化界面工具DataGrip
B站教程11. 基础-SQL-图形化界面工具DataGrip_哔哩哔哩_bilibili
博客教程 DataGrip下载安装及使用教程(详细版)_datagrip安装教程_m0_70536638的博客-CSDN博客
🍉DML
🌳DML -- 插入
DataGrip里console的代码
insert into employee(id, workno, name, gender, age, idcard, entrydate) value(1, '1', 'itheima', '男', 10, '123456789012345678', '2026-01-01');
#指定字段添加数据, 一一对应
select * from employee; #查询
insert into employee values(2,'2','张无忌','男',18,'123456789012345677','2028-12-31');
#全部字段
insert into employee values(3,'3','韦一笑','男',38,'123456789012345677','2028-12-31'),(4,'4','赵敏','女',38,'123456789012345677','2001-12-31');
#批量添加全部字段
🌳DML -- 更新和删除
update的话,可以设置为null,来删除某一字段的值
use itheima;
select * from employee;
show tables;
desc employee;
#修改id为1的数据,将name修改为itheima
update employee set name = 'itheima' where id = 1;
#修改id为1的数据,将name修改为小昭,gender修改为女
update employee set name = '小昭', gender = '女' where id = 1;
#所有员工入职信息修改为 2008-01-01
update employee set entrydate = '2008-01-01'; #不带where更新整张表
#删除gender为女的员工
delete from employee where gender = '女';
#删除所有员工
delete from employee;
双击employee表,在里面刷新可以直接看到修改后的结果,不需要
select * from employee来查询
DML总结
DML语句是数据库操作语言,主要控制数据库中,表的增删改
为了巩固,我重新敲了一遍所有操作,并观察了表中的结果👇
insert into employee(id, workno, name, gender, age, idcard, entrydate) value(3,'66','八嘎','雄',18,'123456789012345678','2022-10-01');
insert into employee values(2,'2','张无忌','男',18,'123456789012345677','2028-12-31');
insert into employee values(7,'23','Jhon','男',13,'123456789012345677','2028-12-31'),
(9,'55','Mike','男',34,'123456789012345677','2024-12-31');
update employee set name = '麦可', entrydate = '1998-9-9' where age = 34;
delete from employee where gender = '雄';
delete from employee;
🍉DQL
👆表格中是编写顺序,而不是执行顺序
🌳DQL -- 基础查询
初始准备
use itheima;
drop table employee;
create table emp(
id int comment '编号',
workno varchar(10) comment '工号',
name varchar(10) comment '姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号',
workaddress varchar(50) comment '工作地址',
entrydate date comment '入职时间'
) comment '员工表';
show tables;
insert into emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
values (1, '1', '柳岩', '女', 7, '123456789012345678', '西安', '2009-01-01'),
(2, '2', '张无忌', '男', 20, '123456745612345678', '北京', '2003-01-01'),
(3, '3', '韦一笑', '男', 23, '123456712312345678', '上海', '2000-05-01'),
(4, '4', '赵敏', '女', 16, '123456789012345678', '江苏', '2000-04-01'),
(5, '5', '小昭', '女', 37, '123456789012345678', '北京', '2011-01-01'),
(6, '6', '杨逍', '男', 20, '123456789012345678', '西安', '2003-01-01'),
(7, '7', '范瑶', '男', 17, '123456789012345678', '江苏', '2007-01-01'),
(8, '8', '黛绮丝', '女', 20, '123456789012345678', '上海', '2009-01-01'),
(9, '9', '范凉凉', '女', 20, '123456789012345678', '北京', '2000-03-01'),
(10, '10', '陈友谅', '男', 20, '123456789012345678', '北京', '2000-02-01'),
(11, '11', '张士诚', '男', 33, '123456745612345678', '北京', '2000-07-01'),
(12, '12', '常遇春', '男', 20, '123456789012345678', '江苏', '2000-05-01'),
(13, '13', '张三丰', '男', 12, '123456789012365478', '北京', '2000-01-01'),
(14, '14', '灭绝', '女', 20, '123456789012345678', '天津', '2017-01-01'),
(15, '15', '胡青牛', '男', 55, '123456712312345678', '上海', '2022-01-01'),
(16, '16', '周芷若', '女', 49, '123456789012345678', '北京', '2000-01-01');
update emp set idcard = null where id = 16;
开始操作
-- 基本查询
-- 1.查询指定字段 nmae, workno, age 返回
select name,workno,age from emp; #只返回了这三个字段的数据
-- 2.查询所有字段返回
select id,workno,name,gender,age,idcard,workaddress,entrydate from emp;
select * from emp; #不建议使用,效率低 且 不直观
-- 3.查询所有员工的工作地址,起别名
select workaddress as '工作地址' from emp;
select workaddress '工作地址' from emp; #as可省略
-- 4.查询公司员工的上班地址(不要重复)
select distinct workaddress '工作地址' from emp;
🌳DQL -- 条件查询
注意LIKE 占位符,模糊匹配中,_匹配单个字符,%匹配任意个字符
-- 这里用 * 代替整个字段列表,为了方便,实际开发不建议使用
-- 条件查询
-- 1.查询年龄等于 20 的员工
select * from emp where age = 20;
-- 2.年龄小于 20
select * from emp where age < 20;
-- 3.年龄小于等于 20
select * from emp where age <= 20;
-- 4.没有身份证号
select * from emp where idcard is null;
-- 5.有身份证号
select * from emp where idcard is not null;
-- 6.年龄不等于 20
select * from emp where age <> 20;
select * from emp where age != 20;
-- 7.年龄 15(包含)到20(包含)之间的
select * from emp where age >= 15 && age <= 20;
select * from emp where age >= 15 and age <= 20;
select * from emp where age between 15 and 20;
#select * from emp where age between 15 and 20; #错误--between跟最小值, and跟最大值
-- 8.性别 女 且年龄小于 25
select * from emp where age < 25 and gender = '女';
-- 9.年龄等于 33 或 49 或 55
select * from emp where age = 33 or age = 49 or age = 55;
select * from emp where age in(33, 49, 55);
-- 10.姓名为两个字的员工信息 _ %
select * from emp where name like '__'; #两个下划线表示2个字符
select * from emp where name like '___'; #3个下划线表示3个字符
-- 先修改,改1个身份证后是X结尾的出来
update emp set idcard = '12345678901234567X' where id = 5;
-- 11.查询身份证号最后一位是X
select * from emp where idcard like '%X'; #表示X之前任意, 最后为X
select * from emp where idcard like '_________________X'; #同上
-- 再弄个综合的,验证一下想法
update emp set idcard = '123456X890123456X8' where age < 25 and gender = '男';
select * from emp where idcard like '%X%X_'; #没毛病
🌳DQL -- 聚合函数
注意,null不参与聚合函数的运算
-- 聚合函数
-- 1.统计该企业员工数量
select count(*) from emp; #16
select count(id) from emp; #16
select count(idcard) from emp; #15
-- 2.统计该企业员工平均年龄
select avg(age) from emp; #24.3125
-- 3.最大年龄
select max(age) from emp; #55
-- 4.最小年龄
select min(age) from emp; #7
-- 5.西安地区 员工 年龄之和
select * from emp where workaddress = '西安'; #查询西安地区员工信息
select sum(age) from emp where workaddress = '西安'; #西安的年龄之和7+20=27
🌳DQL -- 分组查询
执行顺序 != 代码顺序
-- 1.根据性别分组,统计男性员工 和 女性员工的数量
select count(*) from emp group by gender;
select gender, count(*) from emp group by gender;
-- 2.根据性别分组,统计 ... 的平均年龄
select gender, avg(age) from emp group by gender;
-- 3.查询年龄雄安与45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
select workaddress, count(*) from emp where age < 45 group by workaddress;
select workaddress, count(*) from emp where age < 45 group by workaddress having count(*) >= 3;
select workaddress, count(*) address_count from emp where age < 45 group by workaddress having address_count >= 3;
🌳DQL -- 排序查询
-- 排序查询
-- 1.根据年龄对公司员工升序(降序)排序
select * from emp order by age asc;
-- select * from emp order by age; -- 默认升序
select * from emp order by age desc;
-- 2.根据入职时间,对员工降序排序
select * from emp order by entrydate desc;
-- 3.根据年龄对公司员工升序排序,年龄相同,按入职时间降序排序
select * from emp order by age asc, entrydate desc;
-- 年龄升序,时间也升序
select * from emp order by age asc, entrydate asc;
🌳DQL -- 分页查询
先回顾DQL语法
👆是编写顺序,而不是执行顺序
-- 分页查询
-- 1.查询第一页员工数据,每页展示10条记录
select * from emp limit 0, 10;
select * from emp limit 10; -- 等价
-- 2.查询第2页员工数据,每页展示10条记录
-- 起始索引 (页码 - 1) * 页展示记录数
select * from emp limit 10, 10;
🌳DQL -- 案例练习
注意!limit分页放语句最后!
-- ------------------- DQL 语句练习 -------------------
-- 1.查询年龄20,21,22,23岁女性职工信息
select * from emp where gender = '女' and age in(20,21,22,2);
-- 2.查询性别 男 年龄20-40(含)以内的姓名 3个字 的员工
select * from emp where age between 20 and 40 and name like '___' and gender = '男';
select * from emp where (age between 20 and 40) and (name like '___') and (gender = '男');
-- 3.统计员工表中,年龄小于60岁的,男性和女性员工的人数
select gender, count(*) from emp where age < 60 group by gender;
-- 4.查询所有年龄小于等于35的员工的姓名和年龄,并对查询结果按年龄升序排序,年龄相同则按入职时间降序
select name, age from emp where age <= 35 order by age asc, entrydate desc;
-- 5.查询性别 男,且年龄在20-40(含)以内的前5个员工信息,对查询结果按年龄升序,年龄相同按入职时间升序
-- 关键:前5个员工,也就是查询第1页,每页展示5条记录
-- 注意:limit分页要放最后
select * from emp where gender = '男' and (age between 20 and 40) order by age asc, entrydate desc limit 5 ;
🌳DQL -- 执行顺序
-- 查询年龄>15的员工的姓名,年龄,并根据年龄进行升序排序
select name, age from emp where age > 15 order by age asc;
-- select name, age from emp where age > 15 order by age;
-- 执行顺序 1.from2.where3.group by4.select5.order by6.limit
-- 先执行from再执行where, 所以别名e在e.age处生效了
-- 先执行select再执行order by,所以别名eage在order by后生效了
-- 起别名的方式来验证执行顺序
select e.name ename, e.age eage from emp e where e.age > 15 order by eage asc;
🌳DQL小结
🍉DCL
🌳DCL -- 用户管理
-- 创建用户 itcast, 只能在当前主机localhost访问,密码123456
create user 'itcast'@'localhost' identified by '123456';
-- 创建用户 heima, 可以在任意主机访问该数据库,密码123456
create user 'heima'@'%' identified by '123456';
-- 修改用户 heima 的访问密码为1234
alter user 'heima'@'%' identified with mysql_native_password by '1234';
-- 删除 itcast@localhost 用户
drop user 'itcast'@'localhost';
在命令行中输入
mysql -u itcast -p
或者mysql -u heima -p
表示使用MySQL命令行工具连接到MySQL数据库,并使用指定的用户名进行身份验证。
mysql
是MySQL命令行工具的可执行文件-u
是选项,用于指定要使用的用户名。在这两个命令中,分别指定了itcast
和heima
作为用户名-p
也是选项,用于提示输入密码。在命令中加上-p
后,系统会提示你输入密码,然后连接到MySQL数据库
🌳DCL -- 权限控制
-- 查询权限
show grants for 'heima'@'%';
-- 授予权限
grant all on itcast.* to 'heima'@'%';
-- 撤销权限
revoke all on itcast.* from 'heima'@'%';
-- *.*表示所有数据库所有表的所有权限,类似于超级管理员
🌳DCL小结
🥔总结
SQL语句是Mysql基础中最为重要的一部分,务必多敲多练,在项目中融会贯通
暂时打算是,速刷黑马Mysql同时重要知识点记录成4~8篇博客(供后续检索),然后再将《Mysql必知必会》过一遍,并将书本中所有案例实现一遍
至此,mysql入门完毕,为后续项目的搭建添了一块砖