MySQL数据库操作 - 教程

前言

课件旨在协助学习者全面掌握MySQL数据库的核心操作技能,包括 MySQL,库的管理、表的结构设计与操作、记录的增删改查以及用户权限的细致管理。通过本课件的学习,你将能够熟练运用 MySQL,进行数据库的日常维护与管理,为深入的数据分析与应用开发打下坚实基础。。

一. MySQL数据库介绍

数据库目前标准的指令集是 SQL。SQL 是 Structured Query Language 的缩写,即结构化查询语言。它是1974年由 Boyce 和 Chamberlin 提出来的,1975~1979 年 IBM 公司研制的关系数据库管理系统原型 System R实现了这种语言。经过多年的发展,SQL语言得到了广泛的应用。

SQL 语言首要由以下几部分组成:

数据库作用
DDL(Data Definition Language,数据定义语言)用来建立数据库、数据库对象和定义字段,如CREATE、ALTER、DROP
DML(Data Manipulation Language,数据操纵语言)用来插入、删除和修改数据库中的数据,如 INSERT、UPDATE、DELETE
DQL(Data Query Language,数据查询语言)用来查询数据库中的数据如 SELECT
DCL(Data Control Language,数据控制语言)用来控制数据库组件的存取许可、存取权限等,如COMMIT、ROLLBACK、GRANT、 REVOKE

二. MySQL库操作

1.系统数据库

经初始化后的 MySQL 服务器 ,默认建立了四个数据库:sys、mysql、information schema performance schema

默认数据库含义
information schema虚拟库,不占用磁盘空间,存储的是数据库启动后的一information schema:些参数,如用户表信息、列信息、权限信息、字符信息等
performance schemaMySQL 5.5开始新增一个数据库:关键用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象
mysql授权库,关键存储系统用户的权限信息
sys主要用于存储系统性能信息和监控资料,对数据库的性能优化和故障排除sys :具有关键作用

2. 数据库操控

(1)创建数据库

语法:

mysql>create datebase 数据库名;

创建数据库,取名aaa

在这里插入图片描述

(2)数据库命名规则
  • 可以由字母、数字、下划线、@、#、$
  • 区分大小写
  • 唯一性
  • 不能利用关键字如 create select
  • 不能单独使用数字
  • 最长 128 位
(3)选择数据库

语法:

mysql>use 数据库名;

切换到aaa库

在这里插入图片描述

(4)查看数据库

语法:

mysql>show databases;

查看当前数据库有哪些库

在这里插入图片描述

查看创建名为aaa的数据库所使用的SQL语句

在这里插入图片描述

返回当前选中的数据库的名称

在这里插入图片描述

(5)删除数据库

语法:

mysql>drop datebase 数据库名;

删除已创建的数据库aaa,并查看已被删除

在这里插入图片描述

三. MySQL表操作

1. 表介绍

库相当于文件夹。而表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段

IDnameagesex
1张三18male
2李四68female
3王五30male

id,name,age,sex称为字段,其余的,一行内容称为一条数据记录

2. 查看表

使用 SHOW TABLES 查看当前所在的数据库中包含的表。在操作之前,要求先运用 USE语句切换到所使用的数据库,就像要査看一个文件夹里面有多少文件,要先进入这个文件夹

语法:

mysql>show tables;

在这里插入图片描述

3. 创建表

(1)语法

mysql>create table表名(

字段名1 类型[(宽度)约束条件],

字段名 2 类型[(宽度)约束条件],

字段名3类型[(宽度)约束条件]

#注意:

  1. 在同一张表中,字段名是不能相同
  2. 宽度和约束条件可选
  3. 字段名和类型是必须的,字段的类型宽度和约束条件是可选项
  4. 表中最后一个字段不要加逗号
(2)类型介绍

表内存放的资料有不同的类型,类似于运用excel存储素材时也应该设置的数据类型,每种数据类型都有自己的宽度,但宽度是可选的,不设置宽度时,会使用字段的默认宽度。

通过MySQL 支持多种类型,大致能够分为三类:数值、日期/时间和字符串(字符)类型。

数值类型

类型大小范围(有符号)范围(无符号)用途
INT4 字节(-2 147 483 648,2 147483 647)(0,4 294 967 295)大整数值
DOUBLE8 字节(-1.797E+308,-2.22E-308)(0,2.22E-308,1.797E+308)双精度浮点数值
DOUBLE(M,D)8个字节,M表示长度,D表示小数位数同上,受M和D的约束DOUBLE(5,2)-999.99-999.99同上,受M和D的约束同上,受M和D的约束
DECIMAL(M,D)DECIMAL(M,D)依赖于M和D的值,M最大值为65依赖于M和D的值,M最大值为65小数值

日期类型

类型大小范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3-838:59:59’/838:59:59HH:MM:SSHH:MM:SS
YEAR11901/2155YYYY年份值
DATETIME81000-01-0100:00:00/9999-12-31 23:59:59YYYY-MM-DDHH:MM:SS混合日期和时间值
TIMESTAMP41970-01-0100:00:00/2038结束时间是第 2147483647 秒北京时间2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨03:14:07YYYYMMDDHHMMSS混合日期和时间值,时间戳

字符串类型

类型大小用途
CHAR0-255字符定长字符串 char(10) 10个字符
VARCHAR0-65535 字节变长字符串 varchar(10) 10个字符
BLOB (binary large object)0-65535字节二进制形式的长文本数据
TEXT0-65535字节长文本数据
(3)约束条件

约束条件与数据类型的宽度一样,都是可选参数,类似于采用excel存储数据时,可以利用 excel 的公式限制员工 ID列:禁止重复值,且不能为空

约束条件作用:用于保证数据的完整性和一致性,主要分为:

约束条件说明
PRIMARY KEY(PK)标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK)标识该字段为该表的外键
NOTNULL标识该字段不能为空
UNIQUE KEY (UK)唯一的就是标识该字段的值
AUTO_INCREMENT标识该字段的值自动增长(整数类型而且为主键)
DEFAULT为该字段设置默认值
UNS IGNED无符号
ZEROFILL使用0填充
ENMU()限制字段能够存储的值集合
(4)创建表 示例
mysql> create database aaa; ##创建数据库aaa Query OK, 1 row affected (0.01 sec) mysql> use aaa; ##切换数据库aaa Database changed mysql> create table mybiao1(id int,name varchar(50),age int(3),sex enum('male','female')); Query OK, 0 rows affected, 1 warning (0.02 sec) ##为数据库aaa创建表名为mybiao1 mysql> show tables; ##查看表 +---------------+ | Tables_in_aaa | +---------------+ | mybiao1 | +---------------+ 1 row in set (0.00 sec

4. 查看表结构

DESCRIBE 语句:用于表现表的结构,即组成表的各字段(列)的信息。需要指定“数据库名.表名”作为参数;若只指定表名参数,则需先通过 USE 语句切换到目标数据库

在这里插入图片描述

查看详细表结构或者创建表所使用的语句允许执行 show create table aaa\G;#查看表详细结构,可加\G。\G表示以长格式展示结果

在这里插入图片描述

5. 修改表

(1)修改表名

语法:

mysql>alter table 旧表名 rename 新表名;

更改表名mybiao1为mybiao2,并检查

在这里插入图片描述

(2)增加字段

语法:

mysql>ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…],ADD 字段名数据类型 [完整性约束条件…];
mysql>ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST;]
mysql>ALTER TABLE 表名 ADD 字段名、数据类型[完整性约束条件…]AFTER 字段名;];

增加字段名:class

在这里插入图片描述

(3)删除字段

语法:

mysql>alter table 表名 drop 字段名;

删除字段名class,并查看

在这里插入图片描述

(4)修改字段

语法:

mysql>ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]
mysql>ALTER TABLE 表名 CHANGE 旧字段名新字段名 旧数据类型 [完整性约束条件…]
mysql>ALTER TABLE 表名 CHANGE 旧字名 新字段名 新数据类型 [完整性约束件…]

修改mybiao2表中字段name的varchar(50)改为char(50),并查看

在这里插入图片描述

修改mybiao2表中字段name的char(50)改为 字段user_name的varchar(50),并查看

在这里插入图片描述

(6)复制表

只复制表结构,不复制表中材料

在这里插入图片描述

复制表结构+记录(key 不会复制:主键、外键和索引)

在这里插入图片描述
注 :select*from mybiao2 是查询语句

(7)删除表

删除数据库中的表,需要指定“数据库名.表名”作为参数;若只指定表名参数,则需先通过执行“USE”语句切换到目标数据库

直接删除表

在这里插入图片描述

删除数据库中包含的表

在这里插入图片描述

四. MySQL数据操作

1. 介绍

在 MySQL 管理软件中,可以通过 SQL, 语句中的 DML 语言来实现材料的操控,包括使用 INSERT 实现数据的插入、使用 UPDATE 建立数据的更新、使用 DELETE建立数据的删除、使用 SELECT 查询数据。

2.插入数据INSERT

INSERT INTO 语句:用于向表中插入新的数据记录,语句格式如下所示插入数据后可使用 mysql>select *from tl;验证

顺序插入

语法:

INSERT INTO 表名 VALUES(值 1,值 2,值 3…值 n);

插入id=1,user_name=zhangsan,age=18,sex=male 的数据

在这里插入图片描述

验证

在这里插入图片描述

指定字段插入内容

语法:

INSERT INTO 表名(字段 1,字段 2,字段 3…字段 n)VALUES (值 1,值 2,值 3…值

插入id=2,user_name=lisi,age=20,sex=female 的数据

在这里插入图片描述

验证

在这里插入图片描述

插入多条记录

语法:

INSERT INTO 表名 VALUES (值 1,值 2,值 3…值 n),(值 1,值 2,值 3…值 n),(值 1,值 2,值 3…值 n);

插入id=3,user_name=wangwu,age=22,sex=male 和 id=4,user_name=zhaowu,age=22,sex=female 的数据 的资料

在这里插入图片描述

验证

在这里插入图片描述

3.更新数据INSERT

UPDATE 语句:用于修改、更新表中的内容记录。语句格式如下所示更新数据后可使用 mysql>select * from mybiao2;验证

语法:

UPDATE表名 SET字段名 1字段值 1[,字段名 2=字段值 2]WHERE 条件表达式

在这里插入图片描述

需要注意的是,在执行 UPDATE、DELETE 语句时,通常都带 WHERE 条件,不带条件的 UPDATE 语句和 DELETE 语句会修改或删除所有的记录,是非常危险的操控

4.删除资料INSERT

DELETE语句:用于删除表中指定数据记录,语句格式如下所示删除数据后可使用 mysql>select*from mybiao2;验证

语法:

DELETE FROM 表名 WHERE 条件表达式

在这里插入图片描述

删除mybiao2中id=4的数据

5.查询素材INSERT

SELECT 语句:用于从指定的表中查找符合条件的内容记录。MySQL数据库支持标准的 SQL 查询语句,语句格式如下所示

(1)单表查询
单表查询语法

语法:

SELECT 字段1,字段 2...FROM 表名 WHERE 条件 GROUP BY 字段 HAVING 筛选 ORDER BY 字段 LIMIT 限制条数
关键字执行的优先级

优先级:

from where group by having select order by limit

说明:

1.找到表:from 2.拿着 where 指定的约束条件,去文件/表中取出一条条记录 3.将取出的一条条记录进行分组 group by,假设没有 group by,则整体作为组 4.将分组的结果进行 having 过滤 5.执行 select 6.将结果按条件排序:order by 7.限制结果的显示条数:limit

查看库中表的数据:

在这里插入图片描述

准备数据

创建数据库:

mysql> create database test; Query OK, 1 row affected (0.00 sec)

创建人员信息表:

mysql> use test; Database changed mysql> create table renyuan( -> id int not null unique auto_increment, #员工id -> name varchar(20) not null, #姓名 男的就是 -> sex enum('male','female') not null default 'male', #性别,大部分 -> age int(3) unsigned not null default 28, #年龄 -> hire_date date not null, #入职时 间 -> post varchar(50), #岗位 -> post_comment varchar(100), #职位描 述 -> salary double(15,2), #薪资 -> office int, #办公室,一个部门一个屋 子 -> depart_id int #部门编号 -> ); Query OK, 0 rows affected, 2 warnings (0.01 sec)

插入数据:

三个部分:教学,销售,运营

mysql> insert into renyuan(name,sex,age,hire_date,post,salary,office,depart_id) values -> ('zhangsan','male',18,'20170301','teacher',7300.33,401,1), #教学部 -> ('lisi','male',78,'20150302','teacher',1000000.31,401,1), -> ('wangwu','male',81,'20130305','teacher',8300,401,1), -> ('zhaoliu','male',73,'20140701','teacher',3500,401,1), -> ('suqi','male',28,'20121101','teacher',2100,401,1), -> ('zhuba','female',18,'20110211','teacher',9000,401,1), -> ('洪金宝','male',18,'19000301','teacher',30000,401,1), -> ('成龙','male',48,'20101111','teacher',10000,401,1), -> -> ('歪歪','female',48,'20150311','sale',3000.13,402,2),#销售部门 -> ('丫丫','female',38,'20101101','sale',2000.35,402,2), -> ('丁丁','female',18,'20110312','sale',1000.37,402,2), -> ('星星','female',18,'20160513','sale',3000.29,402,2), -> ('格格','female',28,'20170127','sale',4000.33,402,2), -> -> ('张野','male',28,'20160311','operation',10000.13,403,3), #运营部门 -> ('程咬金','male',18,'19970312','operation',20000,403,3), -> ('程咬银','female',18,'20130311','operation',19000,403,3), -> ('程咬铜','male',18,'20150411','operation',18000,403,3), -> ('程咬铁','female',18,'20140512','operation',17000,403,3) -> ; Query OK, 18 rows affected (0.01 sec) Records: 18 Duplicates: 0 Warnings: 0
简单查询

语法:把表中需要的列的数据查询出来

SELECT 字段1,字段 2…FROM 表名
mysql> select id,name,office FROM renyuan; +----+-----------+--------+ | id | name | office | +----+-----------+--------+ | 1 | zhangsan | 401 | | 2 | lisi | 401 | | 3 | wangwu | 401 | | 4 | zhaoliu | 401 | | 5 | suqi | 401 | | 6 | zhuba | 401 | | 7 | 洪金宝 | 401 | | 8 | 成龙 | 401 | | 9 | 歪歪 | 402 | | 10 | 丫丫 | 402 | | 11 | 丁丁 | 402 | | 12 | 星星 | 402 | | 13 | 格格 | 402 | | 14 | 张野 | 403 | | 15 | 程咬金 | 403 | | 16 | 程咬银 | 403 | | 17 | 程咬铜 | 403 | | 18 | 程咬铁 | 403 | +----+-----------+--------+ 18 rows in set (0.01 sec)

表示所有字段时,可以使用通配符“*”显示所有的材料记录

mysql> select * from renyuan; +----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+ | 1 | zhangsan | male | 18 | 2017-03-01 | teacher | NULL | 7300.33 | 401 | 1 | | 2 | lisi | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 | | 3 | wangwu | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 | | 4 | zhaoliu | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 | | 5 | suqi | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 | | 6 | zhuba | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 | | 7 | 洪金宝 | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 | | 8 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 | | 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 | | 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 | | 11 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 | | 12 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 | | 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 | | 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 | | 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 | | 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 | | 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 | | 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 | +----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+ 18 rows in set (0.00 sec)
where条件

WHERE 是 SQL, 中用于筛选数据的核心子句,其作用是借助指定条件从表中过滤出符合条件的记录。它可应用于 SELECT、UPDATE、DELETE 等语句中,控制操作的范围

where 字句中可以使用:

1.比较运算符:>< >= <= <>!= 2.between 80 and 100 值在 10 到20 之间 3.in(80,90,100)值是10或20或30 4. like 'egon%' pattern 行是%或_ %表示任意多字符 _表示一个字符 5.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

(1)比较运算符: >,<,>=,<=,!=

薪资大于 10000 的人姓名

mysql> select name,salary from renyuan where salary >10000; +-----------+------------+ | name | salary | +-----------+------------+ | lisi | 1000000.31 | | 洪金宝 | 30000.00 | | 张野 | 10000.13 | | 程咬金 | 20000.00 | | 程咬银 | 19000.00 | | 程咬铜 | 18000.00 | | 程咬铁 | 17000.00 | +-----------+------------+ 7 rows in set (0.00 sec)

不是403办公室的人姓名

mysql> select name,office from renyuan where office !=403; +-----------+--------+ | name | office | +-----------+--------+ | zhangsan | 401 | | lisi | 401 | | wangwu | 401 | | zhaoliu | 401 | | suqi | 401 | | zhuba | 401 | | 洪金宝 | 401 | | 成龙 | 401 | | 歪歪 | 402 | | 丫丫 | 402 | | 丁丁 | 402 | | 星星 | 402 | | 格格 | 402 | +-----------+--------+ 13 rows in set (0.01 sec)

(2)between and :在什么之间

薪资在 10000 至 15000 之间的人姓名

mysql> select name,salary from renyuan wheree salary between 10000 and 15000 ; +--------+----------+ | name | salary | +--------+----------+ | 成龙 | 10000.00 | | 张野 | 10000.13 | +--------+----------+ 2 rows in set (0.00 sec)

(3)in:集合查询

9000 或 10000 或 30000 的人姓名就是薪资

mysql> select name,salary from renyuan where salary in(9000,10000,30000); +-----------+----------+ | name | salary | +-----------+----------+ | zhuba | 9000.00 | | 洪金宝 | 30000.00 | | 成龙 | 10000.00 | +-----------+----------+ 3 rows in set (0.00 sec)

(4)like:像,模糊匹配

_:任意单个字符
%:任意多个字符

名字以“程”开头的人的信息

mysql> select * from renyuan where name like "程咬_"; +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 | | 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 | | 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 | | 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ 4 rows in set (0.00 sec) mysql> select * from renyuan where name like "程%"; +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 | | 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 | | 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 | | 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ 4 rows in set (0.00 sec)

(5)逻辑运算符:and or not

薪资 17000 并且办公室是 403 的人

mysql> select * from renyuan where office=403 and salary=17000; +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ 1 row in set (0.00 sec)

薪资 17000 或者办公室是 403 的人

mysql> select * from renyuan where office=403 or salary=17000; +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 | | 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 | | 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 | | 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 | | 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ 5 rows in set (0.00 sec)

薪资不是 9000 或 10000 或 30000 的人姓名

mysql> select name,salary from renyuan where salary not in(9000,10000,30000); +-----------+------------+ | name | salary | +-----------+------------+ | zhangsan | 7300.33 | | lisi | 1000000.31 | | wangwu | 8300.00 | | zhaoliu | 3500.00 | | suqi | 2100.00 | | 歪歪 | 3000.13 | | 丫丫 | 2000.35 | | 丁丁 | 1000.37 | | 星星 | 3000.29 | | 格格 | 4000.33 | | 张野 | 10000.13 | | 程咬金 | 20000.00 | | 程咬银 | 19000.00 | | 程咬铜 | 18000.00 | | 程咬铁 | 17000.00 | +-----------+------------+ 15 rows in set (0.01 sec)
group by 分组

分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等

mysql> select * from renyuan group by sex; ##以 sex 分组,查看除了 sex 以外的字段会报错 ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.renyuan.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

正确的查询

mysql> select sex from renyuan group by sex; +--------+ | sex | +--------+ | male | | female | +--------+ 2 rows in set (0.00 sec)

聚合函数:count()avg()max()min()sum()

count():计数

计算男生和女生的人数

mysql> select sex,count(*) from renyuan group by sex; +--------+----------+ | sex | count(*) | +--------+----------+ | male | 10 | | female | 8 | +--------+----------+ 2 rows in set (0.00 sec)

avg():平均值

每个岗位的平均薪资

mysql> select post,avg(salary) from renyuan group by post; +-----------+---------------+ | post | avg(salary) | +-----------+---------------+ | teacher | 133775.080000 | | sale | 2600.294000 | | operation | 16800.026000 | +-----------+---------------+ 3 rows in set (0.00 sec)

max():最大值

每个岗位的最高薪资

mysql> select post,max(salary) from renyuan group by post; +-----------+-------------+ | post | max(salary) | +-----------+-------------+ | teacher | 1000000.31 | | sale | 4000.33 | | operation | 20000.00 | +-----------+-------------+ 3 rows in set (0.00 sec)

min():最小值

每个岗位的最低薪资

mysql> select post,min(salary) from renyuan group by post; +-----------+-------------+ | post | min(salary) | +-----------+-------------+ | teacher | 2100.00 | | sale | 1000.37 | | operation | 10000.13 | +-----------+-------------+ 3 rows in set (0.00 sec)

sum():总和

每个岗位的薪资总和

mysql> select post,sum(salary) from renyuan group by post; +-----------+-------------+ | post | sum(salary) | +-----------+-------------+ | teacher | 1070200.64 | | sale | 13001.47 | | operation | 84000.13 | +-----------+-------------+ 3 rows in set (0.01 sec)
having过滤

通过执行优先级从高到低:where>group by>havingWhere 发生在分组 group by之前,因而 Where 中能够有任意字段,但是绝对不能使用聚合函数

Having 发生在分组 group by 之后,因而 Having 中能够运用分组的字段,无法直接取到其他字段,但行采用聚合函数

有哪些岗位是平均工资大于 10000的

mysql> select post,avg(salary) from renyuan group by post having avg(salary) >10000; +-----------+---------------+ | post | avg(salary) | +-----------+---------------+ | teacher | 133775.080000 | | operation | 16800.026000 | +-----------+---------------+ 2 rows in set (0.00 sec)
order by排序

使用 SELECT 语句可以将需要的数据从MySQL 数据库中查询出来,如果对查询的结果进行排序,该如何去实现呢?许可使用 ORDERBY语句来完成排序,并最终将排序后的结果返回给用户

通过排序的关键字可以使用 ASC或者 DESC。ASC 是按照升序进行排序的,是默认的排序方式,即 ASC 能够省略。SELECT 语句中如果没有指定具体的排序方式则默认按 ASC 方式进行排序。DESC是按降序方式进行排列

正序查询

mysql> select * from renyuan order by id asc; +----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+ | 1 | zhangsan | male | 18 | 2017-03-01 | teacher | NULL | 7300.33 | 401 | 1 | | 2 | lisi | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 | | 3 | wangwu | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 | | 4 | zhaoliu | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 | | 5 | suqi | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 | | 6 | zhuba | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 | | 7 | 洪金宝 | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 | | 8 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 | | 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 | | 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 | | 11 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 | | 12 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 | | 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 | | 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 | | 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 | | 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 | | 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 | | 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 | +----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+ 18 rows in set (0.00 sec)

倒叙查询

mysql> select * from renyuan order by id desc; +----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+ | 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 | | 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 | | 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 | | 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 | | 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 | | 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 | | 12 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 | | 11 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 | | 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 | | 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 | | 8 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 | | 7 | 洪金宝 | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 | | 6 | zhuba | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 | | 5 | suqi | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 | | 4 | zhaoliu | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 | | 3 | wangwu | male | 81 | 2013-03-05 | teacher | NULL | 3 | wangwu | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 | | 2 | lisi | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 | | 1 | zhangsan | male | 18 | 2017-03-01 | teacher | NULL | 7300.33 | 401 | 1 | +----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+ 18 rows in set (0.00 sec)
limit限制结果条目

在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录。有时候仅需要返回第一行或者前几行,这时候就需要用到 LIMIT 子句

倒叙排列后仅表现第一行

mysql> select * from renyuan order by id desc limit 1; +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ 1 row in set (0.00 sec)
正则匹配

MySQL 正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串。MySQL的正则表达式使用 REGEXP 这个关键字来指定正则表达式的匹配模式

Name是1开头的姓名

mysql> select * from renyuan where name regexp "^1"; Empty set (0.20 sec)

Name是u结尾的姓名

mysql> select * from renyuan where name regexp "u$"; +----+---------+------+-----+------------+---------+--------------+---------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+---------+------+-----+------------+---------+--------------+---------+--------+-----------+ | 3 | wangwu | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 | | 4 | zhaoliu | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 | +----+---------+------+-----+------------+---------+--------------+---------+--------+-----------+ 2 rows in set (0.00 sec)

wan 和 wu之间至少1个g的姓名就是Name

mysql> select * from renyuan where name regexp "wang+wu"; +----+--------+------+-----+------------+---------+--------------+---------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+--------+------+-----+------------+---------+--------------+---------+--------+-----------+ | 3 | wangwu | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 | +----+--------+------+-----+------------+---------+--------------+---------+--------+-----------+ 1 row in set (0.00 sec)
(2)多表查询

多表查询用于从多个关联表中提取组合数据,常见方式包括JOIN 连接 和 子查询

创建 test2 数据库

mysql> create database test2; Query OK, 1 row affected (0.00 sec)

创建人员表和部门表

mysql> use test2; Database changed mysql> create table bumen( -> id int, -> name varchar(20) -> ); Query OK, 0 rows affected (0.01 sec) mysql> create table renyuan( -> id int primary key auto_increment, -> name varchar(20), -> sex enum('male','female') not null default 'male', -> age int, -> dep_id int #部门ID -> ); Query OK, 0 rows affected (0.02 sec)

插入数据

mysql> insert into bumen values -> (200,'技能'), -> (201,'人力资源'), -> (202,'销售'), -> (203,'运营'); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> insert into renyuan(name,sex,age,dep_id) values -> ('zhangsan','male',18,200), -> ('lisi','female',48,201), -> ('wangwu','male',38,201), -> ('zhaoliu','female',28,202), -> ('sunqi','male',18,200), -> ('zhuba','female',18,204) -> ; Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0
子查询

通过子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个査询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤。子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还能够再次嵌套新的子查询,也就是说能够多层嵌套。

IN 的语法结构如下:

<表达式> [NOT] IN <子查询>

当表达式与子查询返回的结果集中的某个值相等时,返回TRUE,否则返回FALSE。若启用了 NOT 关键字,则返回值相反。要求注意的是,子查询只能返回一列数据,若是需求比较复杂,一列解决不了疑问,可以使用多层嵌套的方式来应对。

查询平均年龄在 25 岁以上的部门名

mysql> select id,name from bumen where id in (select dep_id from renyuan group by dep_id having avg(age) > 25); +------+--------------+ | id | name | +------+--------------+ | 201 | 人力资源 | | 202 | 销售 | | 201 | 人力资源 | | 202 | 销售 | +------+--------------+ 4 rows in set (0.00 sec)

查看技术部员工姓名

mysql> select name from renyuan where dep_id in (select id from bumen where name='技术'); +----------+ | name | +----------+ | zhangsan | | sunqi | | zhangsan | | sunqi | +----------+ 4 rows in set (0.00 sec)

查看不足1人的部门名(子查询得到的是有人的部门 id)

mysql> select name from bumen where id notin (select distinct dep_id from renyuan ); +--------+ | name | +--------+ | 运营 | | 运营 | +--------+ 2 rows in set (0.01 sec)
多表连接查询

MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和石连接。

内连接(只连接匹配的行)

MySQL 中的内连接就是两张或多张表中同时符合某种条件的信息记录的组合。通常在 FROM 子句中利用关键字INNERJOIN 来连接多张表,并运用 ON 子句设置连接条件。内连接的语法格式如下

SELECT column name(s)FROM tablel INNER JOIN table2 ON tablel.column name = table2.column name.
mysql> select renyuan.id,renyuan.name,renyuan.age,renyuan.sex,bumen.name from renyuan inner join bumen on renyuan.dep_id=bumen.id; +----+----------+------+--------+--------------+ | id | name | age | sex | name | +----+----------+------+--------+--------------+ | 1 | zhangsan | 18 | male | 手艺 | | 1 | zhangsan | 18 | male | 技术 | | 2 | lisi | 48 | female | 人力资源 | | 2 | lisi | 48 | female | 人力资源 | | 3 | wangwu | 38 | male | 人力资源 | | 3 | wangwu | 38 | male | 人力资源 | | 4 | zhaoliu | 28 | female | 销售 | | 4 | zhaoliu | 28 | female | 销售 | | 5 | sunqi | 18 | male | 技术 | | 5 | sunqi | 18 | male | 技术 | | 7 | zhangsan | 18 | male | 技术 | | 7 | zhangsan | 18 | male | 技术 | | 8 | lisi | 48 | female | 人力资源 | | 8 | lisi | 48 | female | 人力资源 | | 9 | wangwu | 38 | male | 人力资源 | | 9 | wangwu | 38 | male | 人力资源 | | 10 | zhaoliu | 28 | female | 销售 | | 10 | zhaoliu | 28 | female | 销售 | | 11 | sunqi | 18 | male | 手艺 | | 11 | sunqi | 18 | male | 技术 | +----+----------+------+--------+--------------+ 20 rows in set (0.00 sec)

bumen 没有 204 该部门,因而 renyuan 表中关于 204 这条员工信息没有匹配出来

左连接(优先显示左表全部记录)

MySQL 除了内连接,还可以使用外连接。区别于 MySQL 外连接是将表分为基础表和参考表,再依据基础表返回满足条件或不满足条件的记录。外连接按照连接时表的顺序来分,有左连接和右连接之分。

通过左连接也能够被称为左外连接,在FROM子句中使用 LEFT JOIN 或者 LEFIOUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行

mysql> select renyuan.id,renyuan.name,bumen.name as depart_name from renyuan left join bumen on renyuan.dep_id=bumen.id; +----+----------+--------------+ | id | name | depart_name | +----+----------+--------------+ | 1 | zhangsan | 技术 | | 2 | lisi | 人力资源 | | 3 | wangwu | 人力资源 | | 4 | zhaoliu | 销售 | | 5 | sunqi | 科技 | | 6 | zhuba | NULL | +----+----------+--------------+ 6 rows in set (0.00 sec)

以左表为准,即找出所有员工信息,当然包括没有部门的员工本质就是:在内连接的基础上增加左边有右边没有的结果

右连接(优先表现右表全部记录)

右连接也被称为右外连接,在FROM子句中使用RIGHTJOIN或者RIGHTOUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。也就是说匹配右表中的每一行及左表中符合条件的记录

mysql> select renyuan.id,renyuan.name,bumen.name as depart_name from renyuan right join bumeen on renyuan.dep_id=bumen.id; +------+----------+--------------+ | id | name | depart_name | +------+----------+--------------+ | 5 | sunqi | 技术 | | 1 | zhangsan | 技术 | | 3 | wangwu | 人力资源 | | 2 | lisi | 人力资源 | | 4 | zhaoliu | 销售 | | NULL | NULL | 运营 | +------+----------+--------------+ 6 rows in set (0.00 sec)

以右表为准,即找出所有部门信息,包括没有员工的部门本质就是:在内连接的基础上增加右边有左边没有的结果

五. MySQL数据库用户提权

MySQL 数据库的 root 用户账号拥有对所有数据库、表的全部权限,频繁使用 root 账号会给数据库服务器带来一定的安全风险。实际工作中,通常会建立一些低权限的用户,只负责一部分数据库、表的管理和维护操作,甚至许可对查询、修改、删除记录等各种操作做进一步的细化限制,从而将数据库的风险降至最低。

(1)创建用户

Mysq18 用户创建与授权的分离,必须先创建用户才能给用户授权

语法:

CREATE USER 用户名 @来源地址 IDENTIFIED BY ‘密码’

用户名@来源地址:用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP 地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址,如“%.bdqn.com”“192.168.1.%”等

IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略“IDENTIFIED BY”部分,则用户的密码将为空

执行以下执行行添加一个名为“zhangsan‘”的数据库用户,并允许其从本机访问,验证密码为“123456”

mysql> create user 'zhangsan' @'localhost' identified by '123456'; Query OK, 0 rows affected (0.01 sec)

(2)授权管理

语法:

GRANT 权限列表 ON 数据库名. 表名 TO 用户名@来源地址

权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如select,insert,update”。使用“al1”表示所有权限,可授权执行任何处理

数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以运用通配符“”。例如,使用“auth.”表示授权操控的对象为 auth

通过执行以下处理能够为数据库用户’zhangsan’@'localhost’,设置对 test 数据库中的所有表具有查询权限

授权前

[root@localhost ~]# mysql -uzhangsan -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 8.0.36 MySQL Community Server - GPL Copyright (c) 2000, 2024, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | performance_schema | +--------------------+ 2 rows in set (0.00 sec)

授权后

[root@localhost ~]# mysql -uroot -ppwd123 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.36 MySQL Community Server - GPL Copyright (c) 2000, 2024, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> mysql> grant select on test2.* to 'zhangsan'@'localhost'; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) mysql> exit Bye [root@localhost ~]# mysql -uzhangsan -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 8.0.36 MySQL Community Server - GPL Copyright (c) 2000, 2024, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | performance_schema | | test2 | +--------------------+ 3 rows in set (0.00 sec) mysql> use test2; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-----------------+ | Tables_in_test2 | +-----------------+ | bumen | | renyuan | +-----------------+ 2 rows in set (0.00 sec)

,创建一个或几个网站专用的数据库,并授予所有权限,限制访问的来源 IP 地址。就是在企业服务器的应用中,数据库与网站服务器有时候是相互独立的。因此在MySQL 服务器中,应根据实际情况创建新的用户授权,允许授权用户从网站服务器访问数据库。通常的做法

例如,执行以下操作可以新建 bdqn 数据库,并授权从IP地址为192.168.10.101 的主机连接,用户名为“kgc”,密码为“pwd123”,允许在bdqn 数据库中执行所有操作

mysql> create database bdqn; Query OK, 1 row affected (0.01 sec) mysql> create user 'kgc'@'192.168.10.101' identified by 'pwd123'; Query OK, 0 rows affected (0.01 sec) mysql> grant all on bdqn.* to 'kgc'@'192.168.10.101'; Query OK, 0 rows affected (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)

(3)查看权限

SHOW GRANTS 语句:专门用来查看数据库用户的授权信息,通过FOR子句可指定查看的用户对象(必须与授权时使用的对象名称一致),

语法:

SHOW GRANTS FOR 用户名@来源地址

执行以下操作可以查看用户 zhangsan 从主机 localhost 访问数据库时的授权信息

mysql> show grants for 'zhangsan'@'localhost'; +-----------------------------------------------------+ | Grants for zhangsan@localhost | +-----------------------------------------------------+ | GRANT USAGE ON *.* TO `zhangsan`@`localhost` | | GRANT SELECT ON `test2`.* TO `zhangsan`@`localhost` | +-----------------------------------------------------+ 2 rows in set (0.00 sec)

(4)撤销权限

通过REVOKE 语句:用于撤销指定用户的数据库权限,撤销权限后的用户仍然能够连接到 MySQL 服务器,但将被禁止执行对应的数据库操作

语法:

REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址
执行以下操作可以撤销用户 zhangsan 从本机访问数据库:test2 的所有权限 mysql> revoke all on test2.* from 'zhangsan'@'localhost'; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> show grants for 'zhangsan'@'localhost'; +----------------------------------------------+ | Grants for zhangsan@localhost | +----------------------------------------------+ | GRANT USAGE ON *.* TO `zhangsan`@`localhost` | +----------------------------------------------+ 1 row in set (0.00 sec)
posted on 2025-06-06 17:00  ljbguanli  阅读(38)  评论(0)    收藏  举报