MySQL数据库操作
MySQL数据库介绍
数据库目前标准的指令集是 SQL。SQL是 Structured Query Language 的缩写,即结构化查询语言。
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库操作
系统数据库
经初始化后的 MySQL 服务器 ,默认建立了四个数据库:sys、mysql、information_schema performance_schema
information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一information schema:些参数,如用户表信息、列信息、权限信息、字符信息等
performance schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象
mysql:授权库,主要存储系统用户的权限信息
sys:主要用于存储系统性能信息和监控数据,对数据库的性能优化和故障排除具有关键作用
数据库操作
创建数据库
语法:
mysql>CREATE DATABASE 数据库名;
例子:将创建一个名为db1的库
数据库命名规则
可以由字母、数字、下划线、@、#、$
区分大小写
唯一性
不能使用关键字,如create selete
不能单独使用数字
最长128位
选择数据库
mysql>USE 数据库名;
例子:切换 | 进入db1
查看数据库
mysql>show databases; #查看当前数据库中有哪些表
mysql>show create database db1; #显示创建名为db1的
数据库所使用的SQL语句
mysql>selete database; #返回当前选中的数据库的名称
删除数据库
mysql> DROP DATABASE 数据库名;
例子:
MySQL表操作
1、表介绍
库相当于文件夹。而表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录由对应的标题,称为表的字段
2、查看表
使用 SHOW TABLES 查看当前所在的数据库中包含的表。在操作之前,需要先使用 USE语句切换到所使用的数据库,就像要查看一个文件夹里面有多少文件,要先进入这个文件夹
3.创建表
语法
mysql>create table 表名(
字段名1 类型[(宽度)约束条件],
字段名2 类型[(宽度)约束条件]
字段名3 类型[(宽度)约束条件]
#注意:
1.在同一张表中,字段名是不能相同
2.宽度和约束条件可选
3.字段名和类型是必须的,字段的类型宽度和约束条件是可选项
4.表中最后一个字段不要加逗号
类型介绍
表内存放的数据有不同的类型,类似于使用exce1存储数据时也需要设置的数据类型,每种数据类型都有自己的宽度,但宽度是可选的,不设置宽度时,会使用字段的默认宽度。
ID | name | age | sex name |
---|---|---|---|
1 | 张三 | 18 | male |
2 | 李四 | 68 | female |
3 | 王五 | 30 | male |
id,name,age,sex称为字段,其余的,一行内容称为一条数据记录
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。对于我们约束数据的类型有很大的帮助
数值类型
数值类型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
INT | 4 字节 | (-2 147 483 648, 2 147 483 647) | (0, 4 294 967 295) | 大整数值 |
DOUBLE | 8 字节 | (-1.797E+308, -2.22E-308) | (0, 2.22E-308, 1.797E+308) | 双精度浮点数值 |
DOUBLE(M,D) | 8 字节 | 受 M 和 D 约束,如 DOUBLE(5,2) -999.99 到 999.99 | 受 M 和 D 约束 | 双精度浮点数值 |
DECIMAL(M,D) | DECLMAL(M,D) | 依赖 M 和 D,M 最大 65 | 依赖 M 和 D,M 最大 65 | 小数值 |
日期类型
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | -838:59:59 至 838:59:59 | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901 至 2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00 至 2038-01-19 03:14:07 (UTC) | YYYYMMDD HH:MM:SS | 混合日期和时间值,时间戳 |
字符串类型
类型 | 大小范围 | 用途 | 示例 |
---|---|---|---|
CHAR | 0-255字符 | 定长字符串 | char(10)存储10个字符 |
VARCHAR | 0-65535字节 | 变长字符串 | varchar(10) 变长存储 |
BLOB | 0-65535字节 | 二进制形式的长文本数据 | 如图片、加密数据 |
TEXT | 0-65535字节 | 长文本数据 | 文章、日志等 |
约束条件
约束条件与数据类型的宽度一样,都是可选参数,类似于使用exce1存储数据时,可以利用 excel 的公式限制员工 ID 列:禁止重复值,且不能为空
约束条件作用:用于保证数据的完整性和一致性,主要分为:
约束条件 | 说明 |
---|---|
PRIMARY KEY (PK) | 标识该字段为该表的主键,可以唯一的标识记录 |
FOREIGN KEY (FK) | 标识该字段为该表的外键 |
NOT NULL | 标识该字段不能为空 |
UNIQUE KEY (UK) | 标识该字段的值是唯一的 |
AUTO INCREMENT | 标识该字段的值自动增长(整数类型而且为主键) |
DEFAULT | 为该字段设置默认值 |
UNS IGNED | 无符号 |
ZEROFILL | 使用0填充 |
ENMU() | 限制字段可以存储的值集合 |
创建表示例
4.查看表结构
DESCRIBE 语句:用于显示表的结构,即组成表的各字段(列)的信息。需要指定“数据库名.表名”作为参数;若只指定表名参数,则需先通过 USE 语句切换到目标数据库
查看详细表结构或者创建表所使用的语句可以执行 show create table tl\G;#查看表详细结构,可加\G。\G 表示以长格式展示结果
5.修改表
修改表名
ALTER TABLE 表名 RENAME 新表名;
增加字段
ALTER TABLE表名ADD 字段名数据类型[完整性约束条件…],
ADD 字段名数据类型[完整性约束条件…];
ALTER TABLE 表名 ADD 字段名 数据类型[完整性约束条件…] FIRST;
ALTER TABLE 表名 ADD 字段名、数据类型[完整性约束条件…]AFTER 字段名;
删除字段
ALTER TABLE 表名 DROP 字段名;
例子
修改字段
ALTER TABLE 表名 MODIFY 字段名 数据类型[完整性约束条件…];
ALTER TABLE表名 CHANGE 旧字段名 新字段名 旧数据类型[完整性约束条件…];
ALTER TABLE 表名CHANGE旧字段名 新字段名 新数据类型「完整性约束条件…;
例子
6.复制表
只复制表结构,不复制表中数据
7.删除表
删除数据库中的表,需要指定“数据库名.表名”作为参数;若只指定表名参数,则需先通过执行“USE”语句切换到目标数据库
MySQL数据操作
介绍
在 MySQL 管理软件中,可以通过 SQL, 语句中的 DML,语言来实现数据的操作,包括使用 INSERT 实现数据的插入、使用 UPDATE 实现数据的更新、使用 DELETE实现数据的删除、使用 SELECT 查询数据
创建表示例
插入数据INSERT
INSERT INTO 语句:用于向表中插入新的数据记录,语句格式如下所示
插入数据后可使用 mysql>select*from t1;验证
顺序插入:
INSERT INTO 表名 VALUES(值 1,值 2,值 3…值 n)
;
指定字段插入数据:
INSERT INTO 表名 (字段1,字段2,字段3....字段n) VALUES(值1,值2,值3....值n)
;
插入多条记录:
INSERT INTO 表名 VALUES(值 1,值 2,值 3…值 n),(值 1,值 2,值 3…值 n),(值 1,值 2,值 3…值 n)
;
删除数据DELETE
DELETE 语句:用于删除表中指定的数据记录,语格式如下所示
删除数据后可使用 mysql>select *from tl;验证
DELETE FROM 表名 WHERE 条件表达式
更新数据UPDATE
UPDATE 语句:用于修改、更新表中的数据记录。语句格式如下所示。
更新数据后可使用 mysql>select *from tl;验证
UPDATE 表名 SET 字段名 1=字段值 1[,字段名 2=字段值 2] WHERE 条件表达 式
需要注意的是,在执行 UPDATE、DELETE 语句时,通常都带 WHERE 条件,不带条件的 UPDATE 语句和 DELETE 语句会修改或删除所有的记录,是非常危险的操作。
查询数据 INSERI
SELECT 语句:用于从指定的表中查找符合条件的数据记录。MySQL数据库支持标准的 SQL 查询语句,语句格式如下所示
单表查询
单表查询
单表查询语法
语法:
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
准备数据
创建数据库
创建人员信息表
插入数据:
三个部门:教学,销售,运营
简单查询
语法:把表中需要的列的数据查询出来
SELECT 字段 1,字段 2... FROM 表名
例子:
SELECT id, name, office FROM renyuan ;
表示所有字段时,可以使用通配符“*”,显示所有的数据记录
SELECT \* FROM renyuan;
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 的人姓名
select name,salary from renyuan where salary >10000;
不是 403 办公室的人姓名
select name,office from renyuan where office != 403;
(2)between and :在什么之间薪资在 10000 至 15000 之间的人姓名select name, salary from renyuan where salary between 10000 and 15000 :
(3)in:集合查询薪资是 9000 或 10000 或 30000 的人姓名
select name,salary from renyuan where salary in(9000.10000.30000).
(4)like:像,模糊匹配:
_任意单个字符
%任意多个字符
名字以“程”开头的人的信息
select * from renyuan where name like "程咬"
select * from renyuan where name like "程%”;
(5)逻辑运算符: and or not
薪资 17000 并且办公室是 403 的人
select * from renyuan where office=403 and salary=17000;
薪资 17000 或者办公室是 403 的人
select * from renyuan where office=403 or salary=17000;
薪资不是 9000 或 10000 或 30000 的人姓名
select name, salary from renyuan where salary not in(9000,10000, 30000);
group by 分组
(1)什么是分组?为什么要分组?
分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等
为何要分组呢?
取每个部门的最高工资
取每个部门的员工数
取男人数和女人数 #这个需求没有“每”字,但可以把需求格式化为:取每个性别的人数
小窍门:'每’这个字后面的字段,就是我们分组的字段
可以按照任意字段分组,但是分组完毕后,比如group by sex,只能查看 sex字段,如果想查看组内信息,需要借助于聚合函数
例如
#以sex分组,查看处理sex以外都会报错
(2)聚合所数:count()avg()max()min()sum(
count():计数
计算男生和女生的人数
mysql>select sex,count(*)from renyuan group by sex;
avg():平均值每个岗位的平均薪资
mysql>select post,avg(salary)from renyuan group by post;
max():最大值
每个岗位的最高薪资
mysql>select post,max(salary)from renyuan group by post;
min():最小值
每个岗位的最低薪资
mysql>select post,min(salary)from renyuan group by post;
sum():总和
每个岗位的薪资总和
mysql>select post,sum(salary)from renyuan group by post;
order by 排序
使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来,如果对查询的结果进行排序,该如何去实现呢?可以使用ORDERBY语句来完成排序,并最终将排序后的结果返回给用户
排序的关键字可以使用 ASC或者 DESC。ASC 是按照升序进行排序的,是默认的排序方式,即 ASC 可以省略。SELECT语句中如果没有指定具体的排序方式,则默认按 ASC 方式进行排序。DESC是按降序方式进行排列
limit 限制结果条目
在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录。有时候仅需要返回第一行或者前几行,这时候就需要用到 LIMIT 子句
倒叙排列后仅显示第一行
mysql>select *from renyuan order by id desc limit l:
正则匹配
MySQL 正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串。MySQL的正则表达式使用 REGEXP 这个关键字来指定正则表达式的匹配模式
Name 是1开头的姓名
mysql>select *from renyuan where name regexp "^1"
Name 是u结尾的姓名
mysql>select * from renyuan where name regexp "u$";
Name 是 wan 和 wu之间至少1个g的姓名
mysql>select *from renyuan where name regexp "wangtwu"
多表查询
多表查询用于从多个关联表中提取组合数据,常见方式包括JOIN连接 和子查询
准备数据
创建test2数据库库
创建人员表和部门表
插入数据
子查询
子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤。子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。
在开始实际的举例之前,先来学习一下 IN 这个操作符的用法,IN 用来判断某个值是否在给定的结果集中,通常结合子查询来使用。IN的语法结构如下:
<表达式>[NOT]IN〈子查询>
当表达式与子查询返回的结果集中的某个值相等时,返回TRUE,否则返回FALSE。若启用了 NOT 关键字,则返回值相反。需要注意的是,子查询只能返回一列数据,如果需求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对。
查询平均年龄在 25 岁以上的部门名
mysql>select id, name from bumen where id in (select dep id from renyuangroup by dep_id having avg(age)>25);
#查看技术部员工姓名
mysql>select name from renyuan where dep id in (select id from bumen wherename=’技术’);
#查看不足1人的部门名(子查询得到的是有人的部门 id)
mysql>select name from bumen where id not in (select distinct dep id fromrenyuan);
多表连接查询
MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接
1.内连接(只连接匹配的行)
MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件。内连接的语法格式如下。
SELECT column name(s)FROM tablelINNER JOIN table2 ON tablel.column name = table2.column name;
bumen 没有 204 这个部门,因而 renyuan 表中关于 204 这条员工信息没有匹配出来
2.左连接(优先显示左表全部记录)
MySQL 除了内连接,还可以使用外连接。区别于MySQL 外连接是将表分为基础表和参考表,再依据基础表返回满足条件或不满足条件的记录。外连接按照连接时表的顺序来分,有左连接和右连接之分。
左连接也可以被称为左外连接,在FROM 子句中使用 LEFTJOIN 或者 LEFTOUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行
以右表为准,即找出所有部门信息,包括没有员工的部门本质就是:在内连接的基础上增加右边有左边没有的结果
MySQL 数据库用户授权
MySQL 数据库的 root 用户账号拥有对所有数据库、表的全部权限,频繁使用 root 账号会给数据库服务器带来一定的安全风险。实际工作中,通常会建立一些低权限的用户,只负责一部分数据库、表的管理和维护操作,甚至可以对查询、驀嫪]ふ鰂拙改、訉矚殇酹靿假鵯觎窶Ƨ槛除记录等各种操作做进一步的细化限制,从而将数据库的风险降至最低。
1.创建用户
Mysql8 用户创建与授权的分离,必须先创建用户才能给用户授权语法:
CREATE USER用户名@来源地址 IDENTIFIED BY'密码’
用户名@来源地址:用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址,如“%.bdqn.com”“192.168.1.%”等。
IDENTIFIEDBY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略“IDENTIFIED BY”部分,则用户的密码将为空
执行以下操作可以添加一个名为“xiaoqi”的数据库用户,并允许其从本机访问,
验证密码为“123456”
CREATE USER 'xiaoqi’@’localhost’ IDENTIFIED BY'123456’
2.授权操作
授权语法:
GRANT权限列表ON数据库名.表名 TO 用户名@来源地址
权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如select, insert,。使用“all”表示所有权限,可授权执行任何操作。
数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符“”。例如,使用“auth.”表示授权操作的对象为 auth
执行以下操作可以为数据库用户’xiaoqi’@'localhost’,设置对 test 数据库中的所有表具有查询权限
GRANT SELECT ON test.* To 'xiaogi' @ localhost’
切换到其他 Shell终端,以用户 xiaoqi 的身份连接数据库。在已授权的数据库上操作将被允许,否则将被拒绝。例如,允许用户xiaoqi 查询 test 数据库中表的数据记录,但禁止查询其他数据库中的表的记录。show databases只能看到被授权的库
在企业服务器的应用中,数据库与网站服务器有时候是相互独立的。因此在MySQL 服务器中,应根据实际情况创建新的用户授权,允许授权用户从网站服务器访问数据库。通常的做法是,创建一个或几个网站专用的数据库,并授予所有权限,限制访问的来源 IP 地址。
例如,执行以下操作可以新建 bdqn 数据库,并授权从IP地址为192.168.4.19 的主机连接,用户名为“dbuser”,密码为“pwd@123”,允许在bdqn 数据库中执行所有操作
3.查看权限
SHOW GRANTS 语句:专门用来查看数据库用户的授权信息,通过FOR子可指定查看的用户对象(必须与授权时使用的对象名称一致),语句格式如下所小。
SHOW GRANTS FOR 用户名@来源地址
执行以下操作可以査看用户 dbuser 从主机 192.168.4.19 访问数据库时的授权信息。
4.撤销权限
REVOKE 语句:用于撤销指定用户的数据库权限,撤销权限后的用户仍然可以连接到 MySQL 服务器,但将被禁止执行对应的数据库操作,语句格式如下所示。
REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址
执行以下操作可以撤销用户 xiaoqi 从本机访问数据库 test 的所有权限