数据库MySQL零基础-上【详细】

目录​​​​​​​

一、MySQL数据库基础知识

1、mysql介绍

2、mysql各版本

(1)官网

(2)各版本

3、mysql服务管理

(1)mysql安装

[# 安装mysql](# 安装mysql)

[# 卸载重装mysql](# 卸载重装mysql)

(2)mysql服务

4、mysql的可视化图形界面与命令行操作

(1)命令行模式登录

(2)图形化模式

5、mysql库表深入理解

(1)库的理解

(2)表的理解

6、sql各类语句讲解

二、DDL数据定义语言

1、创建、查看以及使用/切换库

(1)创建数据库

(2)查看当前在哪个库

(3)查看库

(4)进入库的操作

(5)判断是否存在,如果不存在则创建数据库

(6)创建数据库并指定字符集

(7)查看某个库是什么字符集

(8)查看当前mysql使用的字符集

2、常用数据类型

(1)数据类型的定义

(2)mysql常见数据类型

[# 整数型](# 整数型)

[# 浮点型](# 浮点型)

[# 定点型](# 定点型)

[# 字符串型](# 字符串型)

[# 时间型](# 时间型)

3、创建表

(1)语法

(2)约束条件

(3)创建sql

4、查看数据表信息

5、表结构维护与删除

(1)修改表名

(2)添加列

(3)修改列类型

(4)修改列名

(5)删除列

(6)修改字符集

(7)删除表

三、DML数据操纵语言

1、表数据新增

(1)普通插入表数据

[# 命令](# 命令)

[# 示例](# 示例)

(2)蠕虫复制

[# 命令](# 命令)

[# 示例](# 示例)

(3)建表复制

[# 命令](# 命令)

[# 示例](# 示例)

(4)一次性插入多个数据

[# 命令](# 命令)

[# 示例](# 示例)

2、表数据的修改以及删除

(1)修改

[# 命令](# 命令)

#示例

(2)删除

[# 命令](# 命令)

[# 示例](# 示例)

(3)注意事项

3、中文乱码问题

(1)查看当前字符集

(2)临时修改字符集

(3)永久修改字符集

(4)修改字符集编码语句

[# 修改库的字符集编码](# 修改库的字符集编码)

[# 修改表的字符集编码](# 修改表的字符集编码)

四、DQL数据查询语言

1、where条件查询

(1)简单查询

(2)精确条件查询

(3)模糊条件查询

(4)范围查询

(5)离散查询

(6)清除重复值

(7)统计查询

[2、group by分组查询(分组)](#2、group by分组查询(分组))

(1)作用

(2)语法

(3)适用场合

(4)示例

3、having条件查询(筛选)

(1)作用

(2)语法

(3)适用场合

(4)示例

[4、order by排序查询(排序)](#4、order by排序查询(排序))

(1)作用

(2)语法

(3)适用场合

(4)示例

5、limit限制查询(限制)

(1)作用

(2)语法

(3)适用场合

(4)示例

6、exists型子查询

(1)理解

(2)语法

(3)示例

7、左连接查询与右连接查询

(1)理解

(2)语法

(3)示例

8、内连接查询与联合查询

(1)内连接查询

[# 理解](# 理解)

[# 语法](# 语法)

[# 示例](# 示例)

(2)联合查询

[# 理解](# 理解)

[# 语法](# 语法)

[# 示例](# 示例)

[# 注意事项](# 注意事项)

9、项目高级查询实战

五、DCL数据控制语言

1、mysql限制root用户指定ip登录

(1)查看root用户可以在哪台机器登录

(2)修改mysql库里边的user表

(3)刷新权限

2、用户密码

(1)修改用户密码

[# 方法1](# 方法1)

[# 方法2](# 方法2)

(2)忘记密码

3、创建新用户并限制ip网段登录

(1)创建用户

[# 语法](# 语法)

[# 示例](# 示例)

[# 查看权限](# 查看权限)

(2)删除用户

[# 语法](# 语法)

[# 示例](# 示例)

4、库表权限授权与回收

(1)授权

[# 语法](# 语法)

[# 示例](# 示例)

(2)回收

[# 语法](# 语法)

[# 示例](# 示例)


一、MySQL数据库基础知识

1、mysql介绍

mysql是一个开源的关系型数据库管理系统,现在是oracle公司旗下的一款产品,由C和C++语言编写,可移植性高;支持在多种操作系统上安装,最常见有AIX,linux,window;mysql因为开源免费,所以受到了目前互联网行业的欢迎

以mysql作为数据库,linux系统作为操作系统,apache或者nginx作为web服务器,perl/php/python作为服务端的脚本解释器,就可以搭建起一个免费的网站---被业界称为LNMP或者LAMP

2、mysql各版本

(1)官网

官网:MySQL :: MySQL Community Downloads

(2)各版本

  • MySQL Community Server 社区版本:开源免费,但不提供官方技术支持
  • MySQL Enterprise Edition 企业版本:需付费,购买了之后可以电话支持
  • MySQL Cluster 集群版:开源免费,可将几个MySQL Server封装成一个Server

3、mysql服务管理

(1)mysql安装

# 安装mysql

我这里是在docker容器下直接安装mysql,可做参考

具体步骤:

|----|-----------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 步骤 | 方式 | |
| 1 | 创建目录 | mkdir -p /home/data/mysql/ |
| 2 | 创建配置文件 | touch /home/data/mysql/my.cnf |
| 3 | 部署mysql | docker run \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=root123 \ -v /home/data/mysql/conf:/etc/mysql/conf.d \ -v /home/data/mysql/data:/var/lib/mysql:rw \ -v /home/data/mysql/my.cnf:/etc/mysql/my.cnf \ --name YYL_mysql \ --restart=always \ -d mysql:8.0 |
| 4 | 重启mysql服务 --------------------------------- 启动mysql服务 停止mysql服务 | docker restart YYL_mysql -------------------------------------------------------------------------- docker start YYL_mysql docker stop YYL_mysql |
| 5 | 查看mysql日志 | docker logs YYL_mysql |

到第三步就已经实现自启动,直接登录即可,无需重启mysql服务

注意:

安装mysql时,需要拉取镜像,可能会出现拉取超时的情况

解决办法:执行下面命令

sql 复制代码
([ -f /etc/docker/daemon.json ] || mkdir -p /etc/docker) && echo '{ "registry-mirrors" : [ "https://docker.1panel.live","https://docker.m.daocloud.io","https://hub.rat.dev"] }' > /etc/docker/daemon.json && sudo systemctl restart docker && sleep 1 && docker info | grep -A 3 "Registry Mirrors"
# 卸载重装mysql

后续若因为版本差异问题,需要重装低版本mysql,则需要先删除高版本mysql容器,再根据上面的步骤重装mysql

步骤:

  • 查看正在运行的容器和已停止的容器,命令:docker ps -a
  • 停止MySQL容器的运行,命令:docker stop <容器ID或名称> ,我这边是:docker stop YYL_mysql
  • 删除MySQL容器,命令:docker rm <容器ID或名称> ,我这边是:docker rm YYL_mysql
  • 查看已经安装的镜像,命令:docker images
  • 删除MySQL镜像,命令:docker rmi <镜像ID或名称> ,我这边是:docker rmi mysql:8.0
  • 最后一步,之前创建的目录【mysql】需要删除,整个目录都需要删除,我这边是:rm -rf mysql(重要,若无这一步,则重装的低版本mysql会无法启动)

注意:删除高版本数据库时创建的数据,不是仅仅删除创建的一些数据库,而是把整个mysql的数据目录全部删除

(2)mysql服务

通过docker安装的mysql,也必须先进入docker后,才能登录mysql,具体操作如下:

|--------|------------------------|------------------------------------------------------|
| 序号 | 操作 | 命令 |
| 1 | 进入docker并设置mysql字符编码格式 | docker exec -it YYL_mysql env LANG=C.UTF-8 /bin/bash |
| 2 | 进入mysql数据库 | mysql -u root -p |
| 3 | 退出mysql | quit 或者 exit |
| 4 | 退出docker | exit |

4、mysql的可视化图形界面与命令行操作

(1)命令行模式登录

sql 复制代码
# 进入docker并设置mysql字符编码格式
docker exec -it YYL_mysql env LANG=C.UTF-8 /bin/bash
# 进入mysql数据库
mysql -u root -p
# 退出mysql
quit 或者 exit
# 退出docker
exit

(2)图形化模式

根据自己的ip地址或者主机进行连接使用

5、mysql库表深入理解

(1)库的理解

顾名思义就是数据仓库的意思,存储着一定数据结构的数据,一个数据库中可能包含着若干个表,我们可以通过数据库提供的多种方法来管理数据库里边的数据;本质上mysql数据库是一个关系型数据服务管理系

(2)表的理解

我们所说的表就是数据表,每一张表是由行和列组成,每记录一条数据,数据表就增加一行。列是由字段名与字段数据属性组成,我们称之列为字段,每一个字段有着多个属性:例如是否允许为空、长度、类型等等

注意:

数据库:database

数据表:table

字段(列):column

行:row

6、sql各类语句讲解

操作语句分为四类:

  • DDL 数据定义语言 (Data Definition Language) 例如:建库,建表
  • DML 数据操纵语言(Data Manipulation Language) 例如:对表中的数据进行增删改操作
  • DQL 数据查询语言(Data Query Language) 例如:对数据进行查询
  • DCL 数据控制语言(Data Control Language) 例如:对用户的权限进行设置

二、DDL数据定义语言

1、创建、查看以及使用/切换库

(1)创建数据库

sql 复制代码
create database db1;

(2)查看当前在哪个库

sql 复制代码
select database();

(3)查看库

sql 复制代码
show databases;

(4)进入库的操作

sql 复制代码
use 库名;

(5)判断是否存在,如果不存在则创建数据库

sql 复制代码
create database if not exists db2;

(6)创建数据库并指定字符集

sql 复制代码
create database db3 default character set gbk;

(7)查看某个库是什么字符集

sql 复制代码
show create database db1;

(8)查看当前mysql使用的字符集

sql 复制代码
show variables like 'character%';

2、常用数据类型

(1)数据类型的定义

数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型;有一些数据是要存储为数字的,数字当中有些是要存储为整数、小数、日期型等...

(2)mysql常见数据类型

# 整数型

|-----------|--------|--------------------------|----------------|--------|
| 类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
| TINYINT | 1字节 | (-128,127) | (0,255) | 小整数值 |
| SMALLINT | 2字节 | (-32768,32767) | (0,65535) | 大整数值 |
| MEDIUMINT | 3字节 | (-8388608,8388607) | (0,16777215) | 大整数值 |
| INT | 4字节 | (-2147483648,2147483647) | (0,4294967295) | 大整数值 |
| BIGINT | 8字节 | () | (0,2的64次方减1) | 极大整数值 |

# 浮点型

|-------------|--------|--------|-----------------|
| 类型 | 大小 | 命名 | 备注 |
| FLOAT(m,d) | 4字节 | 单精度浮点型 | m代表总个数,d代表小数位个数 |
| DOUBLE(m,d) | 8字节 | 双精度浮点型 | m代表总个数,d代表小数位个数 |

# 定点型

|--------------|----------|-----------------|
| 类型 | 大小 | 备注 |
| DECIMAL(m,d) | 依赖于m和d的值 | m代表总个数,d代表小数位个数 |

# 字符串型

|------------|----------------|-----------|
| 类型 | 大小 | 用途 |
| CHAR | 0-255字节 | 定长字符串 |
| VARCHAR | 0-65535字节 | 变长字符串 |
| TINYTEXT | 0-255字节 | 短文本字符串 |
| TEXT | 0-65535字节 | 长文本字符串 |
| MEDIUMTEXT | 0-16777215字节 | 中等长度文本字符串 |
| LONGTEXT | 0-4294967295字节 | 极大文本数据 |

CHAR与VARCHAR的优缺点:

  • char的优缺点:存取速度比 varchar 更快,但是比 varchar 更占用空间
  • varchar的优缺点:比 char 省空间,但是存取速度没有 char 快
# 时间型

|-----------|---------|---------------------|---------------|
| 数据类型 | 字节数 | 格式 | 备注 |
| date | 3 | yyyy-MM-dd | 存储日期值 |
| time | 3 | HH:mm:ss | 存储时分秒 |
| year | 1 | yyyy | 存储年 |
| datetime | 8 | yyyy-MM-dd HH:mm:ss | 存储日期+时间 |
| timestamp | 4 | yyyy-MM-dd HH:mm:ss | 存储日期+时间,可做时间戳 |

示例:

sql 复制代码
create table test_time (
	date_value date,
	time_value time,
	year_value year,
	datetime_value datetime,
	timestamp_value timestamp
) engine=innodb charset=utf8;



insert into test_time values(now(), now(), now(), now(), now());

3、创建表

(1)语法

sql 复制代码
CREATE TABLE 表名 (
	字段名1 字段类型1 约束条件1 说明1,
	字段名2 字段类型2 约束条件2 说明2,
	字段名3 字段类型3 约束条件3 说明3
);
sql 复制代码
create table 新表名 as select * from 旧表名 where 1=2;

# 注意:建议这种创建表的方式用于日常测试(临时表),因为可能索引什么的会复制不过来
sql 复制代码
create table 新表名 like 旧表名;

(2)约束条件

|----------------|-----------------------------------------------|
| 字段 | 说明 |
| comment | 说明解释,为表的各个字段添加备注 |
| not null | 不为空 |
| default | 默认值 -----一般都是:default null (1)与not null不能同时使用 |
| unsigned | 无符号(即正数) |
| auto_increment | 自增 (1)必须和unique key同时使用 |
| zerofill | 自动填充---比如【id tinyint(5)】,表中id字段会默认填充到5位 |
| unique key | 唯一值 |

(3)创建sql

这里新建一个 student 表,示例:

  • id字段:约束条件有zerofill、auto_increment、not null,即该字段不为空、自增且自动填充位数
  • name字段:约束条件有default null,即该字段为空
  • age字段:约束条件有default null,即该字段为空
  • class字段:约束条件有default null,即该字段不为空
  • sex字段:约束条件有not null,即该字段不为空
sql 复制代码
CREATE TABLE student (
	id tinyint(5) zerofill auto_increment not null comment '学生学号',
	name varchar(20) default null comment '学生姓名',
	age tinyint default null comment '学生年龄',
	class varchar(20) default null comment '学生班级',
	sex char(5) not null comment '学生性别',
	unique key (id)
);

4、查看数据表信息

查看表的基本结构信息:

  • 查看数据库中的所有表:show tables;
  • 查看表结构:desc 表名;
  • 查看创建表的sql语句:show create table 表名;
  • \G :有结束sql语句的作用,还有把显示的数据纵向旋转90度
  • \g :有结束sql语句的作用

5、表结构维护与删除

前提:创建一个表【student2】,用于测试

sql 复制代码
CREATE TABLE student2 (
	id tinyint auto_increment not null comment '学生学号',
	name varchar(20) default null comment '学生姓名',
	age tinyint default null comment '学生年龄',
	sex char(5) comment '学生性别',
	unique key (id)
);

(1)修改表名

sql 复制代码
rename table 旧表名 to 新表名;
--- 示例:
rename table student2 to user;

(2)添加列

sql 复制代码
---1、给表添加一列:
alter table 表名 add 列名 类型;
---# 示例:
alter table user add addr varchar(50);

---2、给表添加一列(带说明):
alter table 表名 add 列名 类型 comment '说明';
---# 示例:
alter table user add famliy varchar(50) comment '学生父母';

---3、给表最前面添加一列:
alter table 表名 add 列名 类型 first;
---# 示例:
alter table user add job varchar(10) first;

---4、给表某个字段后添加一列:
alter table 表名 add 列名 类型 after 字段名;
---# 示例:
alter table user add servnumber int(11) comment '手机号码' after id;

注意:没有给表某个字段前添加一列的说法

(3)修改列类型

sql 复制代码
alter table 表名 modify 列名 新类型;
--- 示例:
alter table user modify servnumber varchar(20);

(4)修改列名

sql 复制代码
alter table 表名 change 旧列名 新列名 类型;
--- 示例:
alter table user change servnumber telephone varchar(20);

(5)删除列

sql 复制代码
alter table 表名 drop 列名;
--- 示例:
alter table user drop famliy;

(6)修改字符集

sql 复制代码
alter table 表名 character set 字符集;
--- 示例:
alter table user character set GBK;

(7)删除表

sql 复制代码
--- 直接删除表
drop table 表名;
--- 示例:
drop table user;
sql 复制代码
--- 看表是否存在,若存在则删除表
drop table if exists 表名;
--- 示例:
drop table if exists teacher;

三、DML数据操纵语言

1、表数据新增

创建sql:

sql 复制代码
--- 某个公司的员工表
CREATE TABLE employee(
	empno INT PRIMARY KEY comment '雇员编号',
	ename VARCHAR(20) comment '雇员姓名',
	job VARCHAR(20) comment '雇员职位',
	mgr INT comment '雇员上级编号',
	hiredate DATE comment '雇佣日期',
	sal DECIMAL(7,2) comment '薪资',
	deptnu INT comment '部门编号'
	);

(1)普通插入表数据

# 命令
sql 复制代码
insert into 表名(字段名) values(字段对应值);

insert into 表名 values(所有字段对应值);
# 示例
sql 复制代码
insert into employee (empno,ename,job,mgr,hiredate,sal,deptnu) values ('1000','小明','专员','00001','2024-08-22','12345.23','10');

insert into employee values ('1001','小红','专员','00001','2024-08-22','10000.23','10');

(2)蠕虫复制

将一张表的数据复制到另一张表中

# 命令
sql 复制代码
--- 数据全量复制
insert into 表名1 select * from 表名2;


--- 可选择性复制某列的数据
insert into 表名1(字段名1,字段名2) select 字段名1,字段名2 from 表名2;
# 示例
sql 复制代码
insert into emp (empno,ename) select empno,ename from employee;
sql 复制代码
insert into emp1 select * from employee;

(3)建表复制

# 命令
sql 复制代码
--- 建表时只将表2的某几列复制过来(带数据复制)
create table 表名1 as select 字段名1,字段名2 from 表名2;

--- 建表时将表2进行完全复制(带数据复制)
create table 表名1 as select * from 表名2;
create table 表名1 as select * from 表名2 where 1=1;

--- 建表时只将表2的结构复制过来(不带数据)---> 只用于日常测试
create table 表名1 as select * from 表名2 where 1=2;

--- 建表时完全复制表2的结构(不带数据)
create table 表名1 like 表名2;
# 示例
sql 复制代码
--- 建表时只将employee表的empno ,ename列复制过来(带数据复制)
create table emp2 as select empno ,ename from employee;
sql 复制代码
--- 建表时将employee表进行完全复制(带数据复制)
create table emp3 as select * from employee;
sql 复制代码
--- 建表时只将employee表的结构复制过来(不带数据)---> 只能用于日常测试
create table emp4 as select * from employee where 1=2;
sql 复制代码
--- 建表时完全复制employee表的结构(不带数据)--->常用
create table emp5 like employee;

(4)一次性插入多个数据

# 命令
sql 复制代码
insert into 表名 (字段名) values (对应值1),(对应值2),(对应值3);
# 示例
sql 复制代码
insert into emp5 (empno,ename,job,mgr,hiredate,sal,deptnu) values ('1001','小南','主管','102','2021-08-22','22345.87','10'),
	('1002','小北','主管','102','2021-07-22','25000.65','10'),
	('1003','小华','专员','102','2024-08-22','12345.23','10'),
	('1004','小西','主管','103','2020-06-22','32345.23','10'),
	('1005','小菜','主管','103','2020-07-22','31345.23','10'),
	('1006','明明','专员','103','2024-08-22','15345.23','10'),
	('1007','cendy','专员','103','2024-08-15','16345.23','10');

2、表数据的修改以及删除

创建sql:

sql 复制代码
CREATE TABLE employee(
	empno INT(5) unsigned zerofill auto_increment PRIMARY KEY comment '雇员编号',
	ename VARCHAR(20) comment '雇员姓名',
	job VARCHAR(20) comment '雇员职位',
	mgr INT comment '雇员上级编号',
	hiredate DATE comment '雇佣日期',
	sal DECIMAL(7,2) comment '薪资',
	deptnu INT comment '部门编号'
	);

在新建的表里插入4条数据:

sql 复制代码
insert into employee (ename,job) values('小明','委员'),('小明','委员'),('小红','委员'),('小西','委员');

(1)修改

# 命令
sql 复制代码
---修改表中某条数据的某个字段值(可修改多个字段值)
update 表名 set 字段名1=值1 where 字段名=值;
update 表名 set 字段名1=值1,字段名2=值2 where 字段名=值;
#示例
sql 复制代码
update employee set sal = '9999.99'  where empno = '00002';
update employee set sal = '10000.88',mgr='1000',hiredate='2024-08-24'  where empno = '00001';

(2)删除

# 命令
sql 复制代码
---删除表中某一条数据
delete from 表名 where 字段名=值;

---删除整张表的数据
truncate table 表名;
delete from 表名;

---删除整张表
drop table 表名;
# 示例
sql 复制代码
delete from employee where empno='00003';

delete from employee;

truncate table employee;

删除速度:drop > truncate > delete

(3)注意事项

在删改数据之前的操作:

  • 对数据进行备份操作,以防万一,可以进行数据回退

delete、truncate、drop 三种删除数据的不同点:

  • delele 会把删除的操作记录给记录起来,以便数据回退,不会释放空间,而且不会删除定义
  • truncate不会记录删除操作,会把表占用的空间恢复到最初,不会删除定义
  • drop会删除整张表,释放表占用的空间

3、中文乱码问题

(1)查看当前字符集

查看当前mysql使用的字符集语句如下:

sql 复制代码
show variables like 'character%';

其中,Variable_name具体字符集分类含义理解:

  • character_set_client:客户端请求数据的字符集
  • character_set_connection:客户端与服务器连接的字符集
  • character_set_database:数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将默认使用配置 上的字符集
  • character_set_results:返回给客户端的字符集(从数据库读取到的数据是什么编码的)
  • character_set_server:为服务器安装时指定的默认字符集设定
  • character_set_system:系统字符集(修改不了,默认就是utf8)
  • character_sets_dir:mysql字符集文件的保存路径

(2)临时修改字符集

sql 复制代码
set names gbk;

(3)永久修改字符集

需要修改配置文件my.cnf里边的内容

sql 复制代码
[client]
default-character-set=gbk
作用于外部的显示
[mysqld]
character_set_server=gbk
作用于内部,会作用于创建库表时默认字符集

(4)修改字符集编码语句

# 修改库的字符集编码
sql 复制代码
alter database db1 default character set gbk;
# 修改表的字符集编码
sql 复制代码
alter table employee default character set utf8;

四、DQL数据查询语言

前提条件(新建表->插入数据):

sql 复制代码
/*创建部门表*/
CREATE TABLE dept(
	deptnu INT PRIMARY KEY comment '部门编号',
	dname VARCHAR(50) comment '部门名称',
	addr VARCHAR(50) comment '部门地址'
);
/*某个公司的员工表*/
CREATE TABLE employee(
	empno INT PRIMARY KEY comment '雇员编号',
	ename VARCHAR(50) comment '雇员姓名',
	job VARCHAR(50) comment '雇员职位',
	mgr INT comment '雇员上级编号',
	hiredate DATE comment '雇佣日期',
	sal DECIMAL(7,2) comment '薪资',
	deptnu INT comment '部门编号'
);


/*创建工资等级表*/
CREATE TABLE salgrade(
	grade INT PRIMARY KEY comment '等级',
	lowsal INT comment '最低薪资',
	higsal INT comment '最高薪资'
);
sql 复制代码
/*插入dept表数据*/
INSERT INTO dept VALUES (10, '研发部', '北京');
INSERT INTO dept VALUES (20, '工程部', '上海');
INSERT INTO dept VALUES (30, '销售部', '广州');
INSERT INTO dept VALUES (40, '财务部', '深圳');
/*插入employee表数据*/
INSERT INTO employee VALUES (1009, '唐僧', '董事长', NULL, '2010-11-17', 50000, 10);
INSERT INTO employee VALUES (1004, '猪八戒', '经理', 1009, '2001-04-02', 29750, 20);
INSERT INTO employee VALUES (1006, '猴子', '经理', 1009, '2011-05-01', 28500, 30);
INSERT INTO employee VALUES (1007, '张飞', '经理', 1009, '2011-09-01', 24500,10);
INSERT INTO employee VALUES (1008, '诸葛亮', '分析师', 1004, '2017-04-19', 30000, 20);
INSERT INTO employee VALUES (1013, '林俊杰', '分析师', 1004, '2011-12-03', 30000, 20);
INSERT INTO employee VALUES (1002, '牛魔王', '销售员', 1006, '2018-02-20', 16000, 30);
INSERT INTO employee VALUES (1003, '程咬金', '销售员', 1006, '2017-02-22', 12500, 30);
INSERT INTO employee VALUES (1005, '后裔', '销售员', 1006, '2011-09-28', 12500, 30);
INSERT INTO employee VALUES (1010, '韩信', '销售员', 1006, '2018-09-08', 15000,30);
INSERT INTO employee VALUES (1012, '安琪拉', '文员', 1006, '2011-12-03', 9500, 30);
INSERT INTO employee VALUES (1014, '甄姬', '文员', 1007, '2019-01-23', 7500, 10);
INSERT INTO employee VALUES (1011, '妲己', '文员', 1008, '2018-05-23', 11000, 20);
INSERT INTO employee VALUES (1001, '小乔', '文员', 1013, '2018-12-17', 8000, 20);
/*插入salgrade表数据*/
INSERT INTO salgrade VALUES (1, 7000, 12000);
INSERT INTO salgrade VALUES (2, 12010, 14000);
INSERT INTO salgrade VALUES (3, 14010, 20000);
INSERT INTO salgrade VALUES (4, 20010, 30000);
INSERT INTO salgrade VALUES (5, 30010, 99990);

1、where条件查询

(1)简单查询

sql 复制代码
select * from employee;
select empno,ename,job as ename_job from employee;

(2)精确条件查询

sql 复制代码
/*查询表中名字为后裔的数据*/
select * from employee where ename='后裔';

/*查询表中工资不等于50000的数据*/
select * from employee where sal != 50000;
select * from employee where sal <> 50000;

/*查询表中工资大于10000的数据*/
select * from employee where sal > 10000;

(3)模糊条件查询

sql 复制代码
/*查询表中名字以林开头的数据*/
select * from employee where ename like '林%';

(4)范围查询

sql 复制代码
/*查询表中工资在10000到30000的数据*/
select * from employee where sal between 10000 and 30000;

/*查询表中雇佣日期在2011-01-01到2017-12-1之间的数据*/
select * from employee where hiredate between '2011-01-01' and '2017-12-01';

(5)离散查询

sql 复制代码
/*查询表中名字是下面四个的数据*/
select * from employee where ename in ('猴子','林俊杰','小红','小胡');

(6)清除重复值

sql 复制代码
/*查询表中去重工作后的单工作字段数据*/
select distinct(job) from employee;

(7)统计查询

sql 复制代码
/*统计表中数据*/
count(code)或者count(*)
/*示例*/
select count(*) from employee;
select count(ename) from employee;

/*计算总和*/
sum()
/*示例*/
select sum(sal) from employee;

/*计算最大值*/
max()
/*示例*/
select * from employee where sal= (select max(sal) from employee);

/*计算平均值*/
avg()
/*示例*/
select avg(sal) from employee;

/*计算最低值*/
min()
/*示例*/
select * from employee where sal= (select min(sal) from employee);

/*主要起连接作用*/
concat()
/*示例*/
select concat(ename,' 是 ',job) as ename_job from employee;

2、group by分组查询(分组)

(1)作用

将我们查询出来的结果按照字段进行分组

(2)语法

sql 复制代码
group by 列1,列2......列N

(3)适用场合

常用于统计场合,一般会和聚合函数一起使用

(4)示例

sql 复制代码
/*以部门编号来统计各部门下的员工数量*/
select deptnu,count(*) from employee group by deptnu;

/*以部门编号和职位来统计对应的员工数量*/
select deptnu,job,count(*) from employee group by deptnu,job;

/*以职位来统计各职位下的员工数量*/
select job,count(*) from employee group by job;

3、having条件查询(筛选)

(1)作用

对查询的结果进行筛选操作

(2)语法

sql 复制代码
having 条件

having 聚合函数 条件

(3)适用场合

一般跟在 group by 之后

(4)示例

sql 复制代码
/*统计出职位是文员的员工数量*/
select job,count(*) from employee group by job having job ='文员';

/*统计出各部门对应职位中员工数量大于等于2的数据*/
select deptnu,job,count(*) from employee group by deptnu,job having count(*)>=2;
select deptnu,job,count(*) as 总数 from employee group by deptnu,job having 总数>=2;

4、order by排序查询(排序)

(1)作用

对查询的结果进行排序操作

(2)语法

sql 复制代码
order by 字段1,字段2......

(3)适用场合

一般用在查询结果的排序

(4)示例

sql 复制代码
/*按工资升序排列*/
select * from employee order by sal;

/*按雇佣日期升序排列*/
select * from employee order by hiredate;

/*统计出各部门对应职位中员工数量大于等于2的数据-按降序排序*/
select deptnu,job,count(*) as 总数 from employee group by deptnu,job having 总数>=2 order by deptnu desc;

/*统计出各部门对应职位中员工数量大于等于2的数据-按升序排序*/
select deptnu,job,count(*) as 总数 from employee group by deptnu,job having 总数>=2 order by deptnu asc;

/*统计出各部门对应职位中员工数量大于等于2的数据-默认排序(升序)*/
select deptnu,job,count(*) as 总数 from employee group by deptnu,job having 总数>=2 order by deptnu;

书写顺序:where ---- group by ----- having ------ order by

5、limit限制查询(限制)

(1)作用

对查询结果起到限制条数的作用

(2)语法

sql 复制代码
limit n,m
  • n:代表起始条数值,不写默认为0
  • m:代表取出的条数

(3)适用场合

数据量过多时,可以起到限制作用

(4)示例

sql 复制代码
/*查询表数据-从第5行开始查询5条数据(包含第5行)*/
select * from employee limit 4,5;

6、exists型子查询

(1)理解

exists型子查询后面是一个受限的select查询语句

exists型子查询,如果 exists后的内层查询能查出数据,则返回 TRUE 表示存在;如果查询为空则返回 FALSE 表示不存在

(2)语法

sql 复制代码
select  * from 表名 a where exists (select 1 from 表名2 where 条件);

子查询分为两种:exists 、not exists

(3)示例

sql 复制代码
/*查询出公司有员工的部门的详细信息*/
select * from dept a where exists (select 1 from employee b where a.deptnu=b.deptnu);
/*查询出公司没有员工的部门的详细信息*/
select * from dept a where not exists (select 1 from employee b where a.deptnu=b.deptnu);

7、左连接查询与右连接查询

(1)理解

左连接称之为左外连接,右连接称之为右外连接,这俩个连接都是属于外连接

(2)语法

sql 复制代码
左连接关键字:left join 表名 on 条件 / left outer 表名 join on 条件
右连接关键字:right join 表名 on 条件 / right outer 表名 join on 条件
  • 左连接说明:left join 是left outer join的简写,左(外)连接,左表(a_table)的记录将会全部表示出来, 而右表(b_table)只会显示符合搜索条件的记录,右表记录不足的地方均为NULL
  • 右连接说明:right join是right outer join的简写,与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来,左表记录不足的地方均为NULL

(3)示例

sql 复制代码
/*列出部门名称和这些部门的员工信息,同时列出没有员工的部门*/
select a.dname,b.* from dept a left join employee b on a.deptnu=b.deptnu;
select b.dname,a.* from employee a right join dept b on b.deptnu=a.deptnu;

8、内连接查询与联合查询

(1)内连接查询

# 理解

获取两个表中字段匹配关系的记录

# 语法
sql 复制代码
INNER JOIN 表名 ON 条件;
# 示例
sql 复制代码
/*查出员工张飞的所在部门的地址*/
select a.addr from dept a inner join employee b on a.deptnu=b.deptnu and b.ename='张飞';
select a.addr from dept a,employee b where a.deptnu=b.deptnu and b.ename='张飞';

(2)联合查询

# 理解

就是把多个查询语句的查询结果结合在一起

# 语法
sql 复制代码
语法1(查询结果去重拼接):

...UNION...

语法2(查询结果不去重拼接):

...UNION ALL...
# 示例
sql 复制代码
/*对销售员的工资从低到高排序,而文员的工资从高到低排序*/
(select * from employee a where a.job = '销售员' order by a.sal limit 999999 ) union (select * from employee b where b.job = '文员' order by b.sal desc limit 999999);
# 注意事项

union 查询的注意事项:

  • 两个select语句的查询结果的"字段数"必须一致
  • 通常应该让两个查询语句的字段类型具有一致性
  • 可以联合更多的查询结果
  • 用到order by排序时,需要加上limit(加上最大条数就行),需要对子句用括号括起来

9、项目高级查询实战

查出至少有一个员工的部门,显示部门编号、部门名称、部门位置、部门人数

涉及表:employee dept

sql 复制代码
select a.deptnu,a.dname,a.addr,b.人数 from dept a,(select deptnu,count(*) as 人数 from employee group by deptnu) b where a.deptnu = b.deptnu;

​​​​​​​

列出薪资比安琪拉高的所有员工

涉及表:employee

sql 复制代码
select * from  employee where sal > (select sal from employee where ename='安琪拉');

列出所有员工的姓名及直接上级的姓名

涉及表:employee

sql 复制代码
select a.ename,ifnull(b.ename,'BOSS') as leader from employee a left join employee b on a.mgr=b.empno;

列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称

涉及表:employee dept

sql 复制代码
条件:a.hiredate < b.hiredate
语句:select a.empno,a.ename,c.dname from employee a left join employee b on a.mgr=b.empno left join dept c on a.deptnu=c.deptnu where a.hiredate < b.hiredate;

列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

涉及表:employee dept

sql 复制代码
select a.dname,b.* from dept a left join employee b on a.deptnu=b.deptnu;

列出所有文员的姓名及其部门名称,所在部门的总人数

涉及表:employee dept

sql 复制代码
条件:job='文员'
语句:select deptnu,count(*) as zongshu from employee group by deptnu;
语句:select b.ename,a.dname,b.job,c.zongshu from dept a ,employee b ,(select deptnu,count(*) as zongshu from employee group by deptnu) c where a.deptnu=b.deptnu and b.job='文员' and b.deptnu=c.deptnu;

列出最低薪资大于15000的各种工作及从事此工作的员工人数

涉及表:employee

sql 复制代码
条件:min(sal) > 15000 
语句:select job,count(*) from employee group by job having   min(sal) > 15000;

列出在销售部工作的员工的姓名,假定不知道销售部的部门编号

涉及表:employee dept

sql 复制代码
 select  ename  from employee where deptnu=(select deptnu from dept where dname='销售部');

列出与诸葛亮从事相同工作的所有员工及部门名称

涉及表:employee dept

sql 复制代码
语句:select a.ename,b.dname from employee a,dept b where a.deptnu=b.deptnu and a.job=(select job from employee where ename='诸葛亮');
语句:select a.ename,b.dname from employee a left join dept b on a.deptnu=b.deptnu where a.job=(select job from employee where ename='诸葛亮');

列出薪金比在部门30工作的员工的薪金 还高的员工姓名和薪金、部门名称

涉及表:employee dept

sql 复制代码
select a.ename,a.sal,b.dname from employee a ,dept b where a.deptnu=b.deptnu and sal > (select max(sal) from employee where deptnu=30);

列出每个部门的员工数量、平均工资

涉及表:employee

sql 复制代码
select deptnu , count(*) ,avg (sal) from employee  group by deptnu;

列出薪金高于公司平均薪金的所有员工信息,所在部门名称,上级领导,工资等级

涉及表:employee dept salgrade

sql 复制代码
select a.*,c.dname,b.ename,d.grade from employee a,employee b,dept c ,salgrade d where a.mgr=b.empno and a.deptnu =c.deptnu and a.sal > (select avg(sal) from employee)  and a.sal  between d.lowsal and d.higsal;

五、DCL数据控制语言

数据控制语言(DCL:Data Control Language)是用来设置或者更改数据库用户或角色权限的语句,这些语句 包括GRANT、DENY、REVOKE等语句

1、mysql限制root用户指定ip登录

(1)查看root用户可以在哪台机器登录

sql 复制代码
select user,host from mysql.user where user='root';

(2)修改mysql库里边的user表

sql 复制代码
update mysql.user set host='localhost' where user='root';

(3)刷新权限

sql 复制代码
flush privileges;

注意:修改完权限后,需要再次刷新一下

2、用户密码

(1)修改用户密码

# 方法1
sql 复制代码
/*语法*/
set password for 用户@ip = password('密码');

/*示例*/
set password for root@localhost = password('root');

不足:修改的密码会直接暴露在界面

# 方法2
sql 复制代码
/*语法*/
update mysql.user set authentication_string=password('密码') where user='用户' and host='ip';

/*示例*/
update mysql.user set authentication_string=password('root') where user='root' and host='localhost';

注意:修改密码时要注意加上host的条件,表明修改哪台机器的密码

(2)忘记密码

  • 第一步:修改配置文件my.cnf (我的在路径/home/data/mysql/my.cnf),配置文件中在[mysqld]下面加上 skip-grant-tables (跳过权限)
  • 第二步:重启mysql服务
  • 第三步:mysql -uroot -p 无需密码登录进入
  • 第四步:修改密码

3、创建新用户并限制ip网段登录

(1)创建用户

# 语法
sql 复制代码
create user 'username'@'host' identified by 'password';
  • username:你将创建的用户名
  • host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%
  • password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
# 示例

创建一个pig用户,并指定登录密码:123456,可以在任何一台远程主机都可以登录

sql 复制代码
create user 'pig'@'%' identified by '123456';

创建一个pig用户,并指定登录密码:为空,指定在120网段的机器登录

sql 复制代码
create user 'pig'@'120.%.%.%' identified by '';
# 查看权限
sql 复制代码
select * from mysql.user where user='pig'\G
show grants for 'pig'@'%';

其中,查询出来的结果的特殊字段:

  • USAGE:无权限的意思
  • WITH GRANT OPTION:表示这个用户拥有grant权限,即可以对其他用户授权

(2)删除用户

# 语法
sql 复制代码
drop user 'username'@'host';
# 示例
sql 复制代码
drop user 'pig'@'%';
delete from mysql.user where user='pig';

4、库表权限授权与回收

(1)授权

# 语法
sql 复制代码
grant 权限1,权限2..... on 数据库对象 to '用户';
grant 权限1,权限2..... on 数据库对象 to '用户'@'host' identified by 'password';
  • all privileges:代表所有权限
  • . :代表所有库所有表
# 示例

对现有用户进行授权:对现有用户pig授予所有库所有表所有权限

sql 复制代码
grant all privileges on *.* to 'pig';

对没有的用户进行授权:创建一个新用户dog授予db库的所有权限,登录密码123456,任何一台主机登录

sql 复制代码
grant all privileges on db.* to 'dog'@'%' identified by '123456';

对没有的用户进行授权:创建一个新用户cat授予db库的employee表查与修改权限,登录密码123456,任何一台主机登录

sql 复制代码
grant select,update on db.employee to 'cat'@'%' identified by '123456';

对没有的用户进行授权:对用户cat授予db库的employee表 insert 权限,登录密码123456,任何一台主机登录

sql 复制代码
grant insert on db.employee to 'cat'@'%' identified by '123456';

(2)回收

# 语法
sql 复制代码
revoke 权限1,权限2..... on 数据库对象 from '用户'@'host';
# 示例

回收pig用户的所有权限(注意:并没有回收它的登录权限)

sql 复制代码
revoke all privileges on *.* from 'pig'@'%';
flush privileges;

回收pig用户的所有权限(并回收它的登录权限)

sql 复制代码
delete from mysql.user where user='pig';
flush privileges;

回收cat用户对db库的employee的查与修改权限

sql 复制代码
revoke select,update on db.employee from 'cat'@'%';
flush privileges;
相关推荐
Hello.Reader1 小时前
Redis热点数据管理全解析:从MySQL同步到高效缓存的完整解决方案
redis·mysql·缓存
是程序喵呀2 小时前
MySQL备份
android·mysql·adb
指尖上跳动的旋律2 小时前
shell脚本定义特殊字符导致执行mysql文件错误的问题
数据库·mysql
一勺菠萝丶2 小时前
MongoDB 常用操作指南(Docker 环境下)
数据库·mongodb·docker
m0_748244833 小时前
StarRocks 排查单副本表
大数据·数据库·python
C++忠实粉丝3 小时前
Redis 介绍和安装
数据库·redis·缓存
wmd131643067123 小时前
将微信配置信息存到数据库并进行调用
数据库·微信
是阿建吖!3 小时前
【Linux】基础IO(磁盘文件)
linux·服务器·数据库
凡人的AI工具箱4 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
ClouGence4 小时前
Redis 到 Redis 数据迁移同步
数据库·redis·缓存