MySQL概述
MySQL启动
net start mysql80
net stopmysql80
MySQL客户端连接
需配置环境变量
增加路径 C:\Program Files\MySQL\MySQL Server 8.0\bin
mysql [-h 127.0.0.1] [-p 3306] -u root -p
mysql -u root -p
图形界面操作
创建数据库
右键‘@localhost’-->new-->scheam
创建表结构
右键表-->new-->table
修改表
右键表-->new-->modify table
用sql语句操作
右键表/数据库-->new-->query console
SQL
DDL语法
数据库操作
# 查询所有数据库
show databases;
# 创建数据库
create database itcsat;
# 创建数据库并指定类型
create database itheima default charset utf8mb4;
# 添加if not exists避免报错(如果已有相同名称数据库会报错)
create database if not exists test;
# 删除数据库
drop database if exists test
# 添加if exists避免报错(如果没有该名称数据库会报错)
drop database if exists test
# 使用itcast数据库
use itcast;
# 查看当前的数据库
select database();
表操作
# 创建新表tb_user
create table tb_user(
id int comment '编号',
name varchar(50) comment '姓名',
age int comment '年龄',
gender varchar(1) comment '性别'
) comment '用户表';
# 创建新表emp
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 '员工表';
# 查看表信息(简略)
desc tb_user;
# 查看表信息(详细)
show create table tb_user;
# 删除表
drop table [ if exists ] 表名;
# 删除指定表并重新创建该表(原来的数据都没了,表结构还在)
truncate table 表名;
表字段操作
# 添加字段nickname
alter table emp add nickname varchar(20) comment '昵称';
# 修改字段的数据类型
alter table 表名 modify 字段名 新数据类型 (长度);
# 修改字段名和其数据类型(旧:nickname,新username)
alter table emp change nickname username varchar(30) comment '昵称';
# 删除字段(删除emp表的username字段)
alter table emp username;
# 修改表名
alter table emp rename to employee;
DML语法
对数据库中表中的数据操作
添加数据
# 给指定字段添加数据
insert into 表名 (字段名1, 字段名2, ...) values (值1, 值2, ...);
# 查看表
select * from employee;
# 给全部字段添加数据
insert into 表名 (值1, 值2, ...)
# 批量添加数据,用逗号连接多个值
insert into employee values(3,'3','韦一笑','男',38,'123456789012345670','2005-01-01'),(4,'4','赵敏','女',18,'123456789012345670','2005-01-01');
修改数据
update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [ where 条件 ] ;
# 修改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';
删除数据
delete from 表名 [ where 条件 ] ;
# 删除gender为女的员工
delete from employee where gender = '女';
# 删除所有员工
delete from employee;
DQL语法
查询数据库中表的记录
# 查询多个字段
select 字段1, 字段2, 字段3 ... from 表名 ;
# 查询所有字段()不推荐
select * from 表名 ;
# 查询字段时可以给字段设置别名(省去as也行)
select 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... from 表名;
select 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... from 表名;
# 去除重复元素
select distinct 字段列表 from 表名;
# 例子
select name,workno,age from emp;
select workaddress as '工作地址' from emp;
select workaddress '工作地址' from emp;
select distinct workaddress '工作地址' from emp;
条件查询
比较运算符
- between ... and ... 在某个范围之内(含最小、最大值)
- in(...) 在in之后的列表中的值,多选一
- like 占位符 模糊匹配(_匹配单个字符, %匹配任意个字符)
逻辑运算符
- AND 或 && 且
- OR 或 || 或
- NOT 或 ! 非
# 查询年龄小于等于 20 的员工信息
select * from emp where age <= 20;
# 查询没有身份证号的员工信息(null的)
select * from emp where idcard is null;
# 查询有身份证号的员工信息(非null的)
select * from emp where idcard is not null;
# 查询年龄不等于 88 的员工信息
select * from emp where age != 88;
select * from emp where age <> 88;
# 查询年龄在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;
# 查询性别为 女 且年龄小于 25岁的员工信息
select * from emp where gender = '女' and age < 25;
# 查询年龄等于18 或 20 或 40 的员工信息
select * from emp where age = 18 or age = 20 or age =40;
select * from emp where age in(18,20,40);
# 查询姓名为两个字的员工信息(两个下划线)
select * from emp where name like '__';
# 查询身份证号最后一位是X的员工信息
select * from emp where idcard like '%X';
select * from emp where idcard like '_________________X';
聚合函数
- count 统计数量
- max
- min
- avg 平均值
- sum
# 统计该企业员工数量
select count(*) from emp;
select count(idcard) from emp; -- 统计的是idcard字段不为null的记录数
# 统计该企业员工的最大年龄
select max(age) from emp;
# 统计西安地区员工的年龄之和
select sum(age) from emp where workaddress = '西安';
分组查询
where与having区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
执行顺序: where > 聚合函数 > having 。
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组 后过滤条件 ];
# 根据性别分组 , 统计男性员工 和 女性员工的数量
select count(*) from emp group by gender; -- 只要count结果,没有对应男女
# 加上性别字段,能对应上count结果 (count(*) from emp group by gender类似于一个字段)
select gender, count(*) from emp group by gender;
# 根据性别分组 , 统计男性员工 和 女性员工的平均年龄
select gender, avg(age) from emp group by gender;
# 查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于3的工作地址
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;
# 统计各个工作地址上班的男性及女性员工的数量
select workaddress, gender, count(*) people_count from emp group by workaddress, gender;
排序查询
排序方式
- ASC : 升序(默认值)
- DESC: 降序
select 字段列表 from 表名 order by 字段1 排序方式1 , 字段2 排序方式2 ;
# 根据年龄对公司的员工进行升序排序
select * from emp order by age asc;
# 根据入职时间, 对员工进行降序排序
select * from emp order by entrydate desc;
# 根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序
select * from emp order by age asc, entrydate desc;
分页查询
- 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
select 字段列表 from 表名 limit 起始索引, 查询记录数 ;
# 查询第1页员工数据, 每页展示10条记录
select * from emp limit 0,10;
select * from emp limit 10;
# 查询第2页员工数据, 每页展示10条记录 --------> (页码-1)*页展示记录数
select * from emp limit 10,10;
执行顺序
编写顺序:
select-->from-->where-->group by-->having-->order by-->limit
执行顺序:
from-->where-->group by-->having-->select-->order by-->limit
DCL语法
管理数据库用户、控制数据库的访问权限
用户管理操作
查询用户
use mysql;
select * from mysql.user;
-- Host代表当前用户访问的主机,如果为localhost,仅代表只能够在当前本机访问,是不可以远程访问的。User代表的是访问该数据库的用户名。在MySQL中需要通过Host和User来唯一标识一个用户.
创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
-- 创建用户itcast, 只能够在当前主机localhost访问, 密码123456;
create user 'itcast'@'localhost' identified by '123456';
-- 创建用户heima, 可以在任意主机访问该数据库, 密码123456;
create user 'heima'@'%' identified by '123456';
修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;
-- 修改用户heima的访问密码为1234;
alter user 'heima'@'%' identified with mysql_native_password by '1234';
删除用户
DROP USER '用户名'@'主机名' ;
-- 删除itcast@localhost用户
drop user 'itcast'@'localhost' ;
权限控制
常用权限
- ALL, ALL PRIVILEGES(所有权限)
- SELECT(查询数据)
- INSERT(插入数据)
- UPDATE(修改数据)
- DELETE(删除数据)
- ALTER(修改表)
- DROP(删除数据库/表/视图)
- CREATE(创建数据库/表)
多个权限之间,使用逗号分隔;授权时,数据库名和表名可以使用 * 进行通配,代表所有。
查询权限
SHOW GRANTS FOR '用户名'@'主机名' ;
# 查询 'heima'@'%' 用户的权限
show grants for 'heima'@'%';
授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
# 授予 'heima'@'%' 用户itcast数据库所有表的所有操作权限
grant all on itcast.* to 'heima'@'%';
撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
# 撤销 'heima'@'%' 用户的itcast数据库的所有权限
revoke all on itcast.* from 'heima'@'%';