目录
1. MySQL前置
1.1. SQL简介
SQL
:结构化查询语言(Structured Query Language),操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 。DBMS
:数据库管理系统(DataBase Management System),操纵和管理数据库的大型软件。DB
:数据库(DataBase),存储数据的仓库,数据是有组织的进行存储。
1.2.下载安装
下载地址:https://downloads.mysql.com/archives/installer/
1.2.MySQL启动和关闭
-
window图形化启动和关闭:
- window + R打开运行框
- 输入
services.msc
,回车 - 找到MySQL服务,手动启动或停止
-
命令行启动和关闭
4. 以管理员身份运行powershell2. 启动命令:
net start mysql80
关闭命令:net stop mysql80
客户端连接
- MySQL客户端命令行连接
- 找到客户端
- 输入密码
- 找到客户端
2. MySQL命令
2.1. 命令分类
2.2. 数据类型
- 数值类型
- 类型后面可以加unsigned修饰,表示无符号类型
- double(4,1):4表示最大保存4位,1表示小数部分为1位,例如:100.0
- 字符串类型
-
char 和 varchar
- char(10)表示,无论你输入多少个(小于等于10的)字符,都会占10个字符的存储空间
- varchar(10)表示,你输入多少个(小于等于10的)字符,就会占多少个字符的空间
- 但是,由于varchar所占用的空间是计算的,所以比较耗性能,但char可能会有些空间用不满,比较耗空间
推荐使用:
- 性别 => char
- 用户名 => varchar
- 日期时间类型
- 创建实例
代码:
操作:create table worker( id int comment '编号', workernum varchar(10) comment '工号', name varchar(10) comment '姓名', gender char(1) comment '性别', age tinyint unsigned comment '年龄', idcard char(18) comment '身份证号码', startdate date comment '入职时间' ) comment '员工表';
2.3. DDL(定义)
2.3.1. DDL数据库操作
- 查询数据库:
show databases;
- 创建数据库:
creat database[if not exists] 数据库名 [default charset utf8];
- 备注
[]
内为可选配置语句
- 删除数据库:
drop database [if exists] 数据库名;
- 使用数据库:
use 数据库名 ;
- 查询当前所在数据库:
select database();
2.3.2. DDL表-创建和查询
- 查询当前数据库所有表:
show tables;
- 创建表结构
- 输入
use 数据库名
先切换到自己创建的数据库
- 输入建表语句为:
create table user( id int comment '编号', name varchar(50) comment '姓名', age int comment '年龄', gender varchar(1) comment '性别' )comment '用户表';
注意:如果上一条命令写错,可以输入\p→右键鼠标选择“标记” → 选择要复制的内容 → 按Enter键 → 输入\c → 右键鼠标选择“粘贴”,然后修改即可
- 数据表创建成功
- 查询表结构:
desc 表名;
- 查询指定表的建表语句:
show create table 表名;
2.3.3. DDL表-字段的添加、修改和删除
- 添加字段:
alter table 表名 add 字段名 类型(长度) [ comment '注释'] [约束];
- 修改字段:
alter table 表名 change 旧字段名 新字段名 类型(长度) [ comment '注释'] [约束];
- 删除字段:
alter table 表名 drop 字段名;
- 修改表名:
alter table 表名 rename to 新表名;
- 删除表:
drop table [if exists] 表名;
- 初始化表(清空表内数据):
truncate table 表名;
2.3.DataGrip使用
2.3.1. 下载
DataGrip官网:https://www.jetbrains.com/datagrip/
2.3.2. 使用
2.4. DML(操作)
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。
- 添加数据(insert)
- 修改数据(update)
- 删除数据(delete)
2.4.1. 添加数据
- 添加指定字段数据:
insert into 表名 (字段名1, 字段名2, ...) values (值1, 值2, ...);
- 利用DataGrip查看添加的信息
- 利用SQL语句查看添加的信息:
select * from 表名;
- 添加全部字段数据:
insert into 表名 values (值1, 值2, ...);
- 批量添加数据:
insert into 表名 values(值1, 值2, ...),(值1, 值2, ...);
2.4.2. 修改数据
修改某字段信息:update 表名 set 字段名1 = '值1', 字段名2 = '值2' where 条件;
- 修改的字段决定于where后面的条件(可以把where看作一个条件过滤器)
- 同理,如果我们没有添加where,则会选中该表内的所有字段,并修改
2.4.3. 删除数据
- 删除数据:
delete from 表名 [ where 条件 ] ;
(where的用法与insert相同)
- 删除表内所有数据:
delete from 表名;
2.5. DQL(查询)
- 建立一个测试表
-- 建立一个测试表 drop table if exists employee; create table worker( id int comment '编号', worknum 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 '员工表'; -- 为表填充数据 insert into worker (id, worknum, name, gender, age, idcard, workaddress, entrydate) values (1, '00001', '柳岩666', '女', 20, '123456789012345678', '北京', '2000-01-01'); insert into worker (id, worknum, name, gender, age, idcard, workaddress, entrydate) values (2, '00002', '张无忌', '男', 18, '123456789012345670', '成都', '2005-09-01'); insert into worker (id, worknum, name, gender, age, idcard, workaddress, entrydate) values (3, '00003', '韦一笑', '男', 38, '123456789712345670', '上海', '2005-08-01'); insert into worker (id, worknum, name, gender, age, idcard, workaddress, entrydate) values (4, '00004', '赵敏', '女', 18, '123456757123845670', '北京', '2009-12-01'); insert into worker (id, worknum, name, gender, age, idcard, workaddress, entrydate) values (5, '00005', '小昭', '女', 16, '123456769012345678', '成都', '2007-07-01'); insert into worker (id, worknum, name, gender, age, idcard, workaddress, entrydate) values (6, '00006', '杨逍', '男', 28, '12345678931234567X', '北京', '2006-01-01');
2.5.1. 基本查询
-
查询返回多个字段:
select 字段1 字段2... as '别名' from 表名;
-
示例代码:
# 1.查询name、age字段 select name, age from worker; # 2.查询返回所有字段 select id, worknum, name, gender, age, idcard, workaddress, entrydate from worker; # 等于select * from worker; # 3.查询所有员工工作地址,起别名 select workaddress as '地址' from worker;
-
示例:
2.5.2. 条件查询
-
常见运算符
比较运算符 功能 >、>=、<、<=、=
基础比较运算符 <> 或 !=
不等于 between ... and ...
在某个范围之内(含最小、最大值) in (..)
在in之后的列表中的值,多选一 like 占位符
模糊匹配(_匹配单个字符, %匹配任意个字符) is null
是null 逻辑运算符 功能 and 或 &&
并 or 或 ||
或 not 或 !
或 -
示例代码:
# 1.查询年龄为18或者大于30的员工 select * from worker where age=18 || worker.age>30; # 2.查询没有身份证号的员工(我已经设置了一个员工身份证号为空) select * from worker where idcard is null; # 3.查询年龄10~20的员工 select * from worker where age between 10 and 20; # 4.查询姓名为两个字的员工 select * from worker where name like '__'; # 5.查询身份证最后一位为X的员工 select * from worker where idcard like '%X'
-
示例:
-
2.5.3. 聚合函数
-
常见聚合函数
函数 功能 count 统计数量 max 最大值 min 最小值 avg 平均值 sum 求和 注意
: null值不参与聚合函数运算 -
语法:
select 聚合函数(字段列表) from 表名
; -
示例代码:
# 1.统计员工数量 select count(*) from worker; # 2. 统计的是idcard不为空的员工数量 select count(idcard) from worker; # 3. 统计员工平均年龄 select avg(age) '平均年龄' from worker;
-
示例:略
2.5.4. 分组查询
-
语法:
select 字段列表 from 表名 [ where 条件 ] group by 分组字段名 [ having 分组后过滤条件 ]
where与having区别:
- 执行时机不同:where是分组之前进行过滤,having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,having可以
-
示例代码
# 1.根据性别分组,统计男女员工数量 select gender,count(*) from worker group by gender; # 2.根据性别分组,统计男女平均年龄 select gender, avg(age) from worker group by gender; # 3.查询年龄小于等于20的员工 , 并根据工作地址分组 , 获取员工数量大于等于2的工作地址 select workaddress, count(*) address_num from worker where age<=20 group by workaddress having address_num>=2; # 4.统计各个工作地址上班的男性及女性员工的数量 select workaddress, gender, count(*) '员工数量' from worker group by workaddress, gender;
-
示例
2.5.5. 排序查询
-
语法:
select 字段列表 from 表名 order by 字段1 排序方式1 , 字段2 排序方式2 ;
- asc: 升序(默认值)
- decs: 降序
-
示例代码
# 1. 根据年龄升序排序 select * from worker order by age; # 2. 根据入职时间降序排序 select * from worker order by entrydate desc; # 3.根据年龄升序排序,年龄相同 , 根据入职时间进行降序排序 select * from worker order by age, entrydate desc; ```
2.5.6. 分页查询
- 语法:
select 字段列表 from 表名 limit 起始索引, 查询记录数 ;
注意事项:
- 起始索引从0开始
- 分页查询是数据库的方言,不同的数据库有不同,MySQL中是LIMIT。
- 如果查询的是第一页,起始索引可省略,直接简写为 limit 10。
- 示例代码:
# 1.查询第1页员工数据, 每页展示5条记录 select * from worker limit 5; # 2.查询第2页员工数据, 每页展示5条记录 select * from worker limit 5,5;
2.5.7. 综合案例
- 示例代码:
# 1.查询年龄为16,18,20岁的女员工 select * from worker where gender = '女' and age in(16,18,20); # 2.查询性别为 男 ,并且年龄在 10-30 岁以内的姓名为三个字的员工。 select * from worker where gender = '男' and ( age between 10 and 30 ) and name like '___'; # 3.统计年龄小于60岁的 , 男员工和女员工人数。 select gender, count(*) '人数' from worker where age < 60 group by gender; # 4.查询年龄小于等于30员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。 select name, age from worker where age<=30 order by age, entrydate desc; # 5. 查询年龄在10~40岁以内的前2男员工信息,对结果按年龄升序排序,年龄相同按入职时间降序排序。 select * from worker where gender='男' and age between 10 and 40 order by age,entrydate desc limit 2;
2.5.8. 编写顺序和执行顺序
-
编写顺序
-
执行顺序
2.6. DCL(控制)
2.6.1. 管理用户
-
语法:
操作 语法 查询用户 select * from mysql.user;
创建用户 create user '用户名'@'主机名' identified by '密码';
修改密码 create user '用户名'@'主机名' identified with mysql_native_password by '新密码' ;
删除用户 drop '用户名'@'主机名'
;Host代表 当前用户访问的主机 , 如果为localhost, 仅代表只能够在当前本机访问,不可以远程访问的。 User代表的是 访问该数据库的用户名 。在MySQL中需要通过Host和User来唯一标识一个用户。
-
示例代码:
# 1.查询用户 select * from mysql.user; # 2.创建用户,只能在该主机访问该数据库 create user 'jia'@'localhost' identified by '12345'; # 3.创建用户,在任意主机都能访问该数据库(利用通配符%) create user 'jhq'@'%' identified by '123456'; # 4.修改用户密码 alter user 'jia'@'localhost' identified with mysql_native_password by '123456' # 5.删除用户 drop user 'jhq'@'%' ;
2.6.2. 权限控制
-
常用权限
关键字 权限 all 所有权限 select 查询数据 insert 插入数据 update 修改数据 delete 删除数据 alter 修改表 drop 删除数据库/表/视图 create 创建数据库/表 -
语法:
操作 语法 查询权限 show grants for '用户名'@'主机名' ;
授予权限 grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
撤销权限 revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'
-
示例代码
# 1.查询权限 show grants for 'jia'@'localhost'; # 2.授予用户jia数据库test的所有操作权限 grant all on test.* to 'jia'@'localhost'; # 3. 撤销予用户jia数据库test的所有操作权限 revoke all on test.* from 'jia'@'localhost';