02 MySQL数据库

一、离线安装MySQL及配置

1. 离线安装Mysql

(1) 上传MySQL离线捆绑包 mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar

(2) 解压捆绑包 mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar

#解压mysql捆绑包
tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar 

(3) 安装mysql

注意:

​ 安装mysql的过程中需要从网络上下载依赖,需要虚拟机联通外网。

# 安装mysql
yum localinstall -y mysql-community-*

(6) 修改启动MySQL时,加载的配置文件 my.cnf

# 修改my.cnf的配置
vi /etc/my.cnf

# 追加以下内容
character_set_server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

(6) 启动 MySQL 服务,查看mysqld服务的运行状态并设置开机启动

#启动 mysqld 服务
systemctl start mysqld
systemctl status mysqld 
systemctl enable mysqld 

(7) 重新加载服务程序配置文件 ,使新服务配置生效

#重新加载服务程序配置文件
systemctl daemon-reload 

(8) 查看 MySQL数据库 root账户的临时密码

grep "password" /var/log/mysqld.log 

(9) 使用root账户和临时密码登录mysql

mysql -uroot -p 临时密码

(10) 修改root账户的登录密码为 123456

#取消mysql密码规范限制
set global validate_password_policy=0;
set global validate_password_length=1;
  
#重新设置登录密码
alter user 'root'@'localhost' identified by '123456';
  
#刷新MySQL的系统权限相关表,否则会出现拒绝访问
flush privileges;
  
#退出mysql,使用quit或者exit命令都可以退出登录
exit;

2. 配置MySQL使用的相关权限

(1) 登录到mysql

#使用新的密码'123456'登录mysql
mysql -uroot -p 新密码

(2) 设置mysql数据库字符集为utf-8

#创建数据库hivedb,设置字符集为utf8
mysql>create database hivedb DEFAULT CHARACTER SET utf8;

(3) 分配权限

#给远程访问分配权限
mysql>grant all PRIVILEGES on *.* TO 'root'@'%' IDENTIFIED BY '123456'  WITH GRANT OPTION;

#给本地访问分配权限
mysql>grant all PRIVILEGES on *.* TO 'root'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;

#给节点访问分配权限
mysql>grant all PRIVILEGES on *.* TO 'root'@'master' IDENTIFIED BY '123456' WITH GRANT OPTION;

#刷新MySQL的系统权限相关表,否则会出现拒绝访问
mysql>flush privileges;

#查看mysql数据配置信息
mysql>\s  

#查看应用的字符集
show variables like '%char%';

#退出mysql登录
mysql>exit;

二、 Mysql基础操作

数据的存储

  • 将数据放到表中,表再放到库中。

  • 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。

  • 表由列组成,我们也称为字段。每个字段描述了它所含有的数据的意义表由列组成,我们也称为字段。每个字段描述了它所含有的数据的意义

  • 表中的数据是按行存储的,一行即为一条记录。

1. 语法规则

  • 所有sql语句必须以分号; 结尾,才可以执行。
  • 一条sql语句可以分多行书写。
  • sql语句中对字母大小写不敏感。
  • 命名时,尽量使用26个英文字母大小写,数字0-9,下划线,不要使用其他符号。
  • sql语句中的字符串使用单引号,而不使用双引号。
  • 同一个mysql软件中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名。

2. 注释

  • 单行注释:#注释内容
  • 单行注释:–空格注释内容 其中–后面的空格必须有
  • 多行注释:/* 注释内容 */

3. DDL操作

3.1 数据库

(1)新建数据库

​ 创建一个数据库,给它一个名字,比如 mysql_shiyan。语句格式为 CREATE DATABASE <数据库名字>;,(注意不要漏掉分号 ;),前面的 CREATE DATABASE 也可以使用小写,具体命令为:

【示例】

CREATE DATABASE mysql_shiyan;或者create database mysql_shiyan;

# 在大多数系统中,SQL 语句都是不区分大小写的,因此以下语句都是合法的
CREATE DATABASE name1;
create database name2;

(2)访问指定数据库

​ 由于一个系统中可能会有多个数据库,要确定当前是对哪一个数据库操作,使用语句 use <数据库名字>

【示例】

use mysql_shiyan;

(3)查看所有数据库

​ 展示mysql管理系统中所有的数据库名称列表。

show databases;

(4)删除指定数据库

drop database 库名;

3.2 数据表

一个数据库中一般会有多张表,这些各自独立的表通过建立关系被联接起来,才成为可以交叉查阅、一目了然的数据库。

数据表在逻辑上可以视为如下的一张二维表格,由表名、字段组成。

ID name phone
1 Tom 110110110
2 Jack 119119119
3 Rose 114114114

(1)查看所有数据表

show tables;
show tables from 数据库名; 

(2)新建数据表

​ 在数据库中新建一张表的语句格式为:

CREATE TABLE 表的名字(
  列名a 数据类型(数据长度),
  列名b 数据类型(数据长度),
  列名c 数据类型(数据长度)
);

【示例】

CREATE TABLE employee(
	id int,
	name varchar(25),
	phone varchar(11)
);

(3)查看表结构

​ 对于数据库中已经存在的表,可以查看表的结构信息。

desc 表名;

(4)删除表

drop table 表名;

(5)修改表结构

  • 重命名表名
RENAME TABLE 原表名 TO 新表名;
ALTER TABLE 原表名 RENAME 新表名;
ALTER TABLE 原表名 RENAME TO 新表名;
  • 向原表中添加字段
alter table 表名 add 字段名 字段类型 约束;

【示例】

-- 现在 employee 表中有 id、name、age、salary、phone、in_dpt 这6个列,我们尝试加入 height (身高)一个列并指定DEFAULT 约束:
ALTER TABLE employee ADD height INT(4) DEFAULT 170;

-- 新增的列被放置在 age 的后面
ALTER TABLE employee ADD weight INT(4) DEFAULT 120 AFTER age;

-- 新增的列放在第一列的位置
ALTER TABLE employee ADD test INT(10) DEFAULT 11 FIRST;
  • 删除原表中的字段
-- 删除表中的 test 列
ALTER TABLE employee DROP test;
  • 修改字段名
-- 修改列名以及约束
ALTER TABLE employee CHANGE height shengao INT(4) DEFAULT 170;
  • 修改字段类型

注意:修改数据类型必须小心,因为这可能会导致数据丢失。在尝试修改数据类型之前,请慎重考虑。

alter table 表名 modify 字段名 字段类型 字段修饰;         【修改字段类型及修饰】

alter table 表名 modify 字段名 字段类型 字段修饰 first;        【修改字段类型设首位】

alter table 表名 modify 字段名 字段类型 字段修饰 after 字段名;   【修改字段类型并定位】

4. DML操作

  • 向表中插入数据
insert into 表名 values(值1,2,...)                   【各列必须以它们在表定义中出现的次序填充】

insert into 表名 (字段名1,2...) values(值1,2,...);          【VALUES必须以其指定的次序匹配指定的列名】

insert into 表名 values(值列表1),(值列表2)...;  【INSERT还存在另一种形式,可以利用它将SELECT语句的结果插入表中,这就是所谓的INSERT SELECT。】

insert into 表名 (部分字段列表) values(值列表1),(值列表2)...;      【添加数据】

【示例】

INSERT INTO employee(id,name,phone) VALUES(01,'Tom',110110110);
INSERT INTO employee VALUES(02,'Jack',119119119);
INSERT INTO employee(id,name) VALUES(03,'Rose');
  • 更新数据
update 表名 set 被修改字段=值,...[多个,号隔开] where (id=1); [判断条件id=1]   【修改数据】(如果没有加where条件,表示修改所有行,这个字段的值)
  • 删除数据
#情景1:
delete from 表名 where id=1; [判断条件id=1]       【删除数据】(如果没有where条件,表示删除整张表的数据;)

#情景2:删除指定表中的所有数据
truncate 表名;

三、 数据类型及约束

1. 常用数据类型

数据类型 用途 数据类型 用途 格式
INT 整数 ENUM 单选,比如性别 ENUM('a','b','c')
FLOAT 单精度浮点数 SET 多选 SET('1','2','3')
DOUBLE 双精度浮点数 DATE 日期 YYYY-MM-DD
CHAR 定长字符串 TIME 时间点或持续时间 HH:MM:SS
VARCHAR 变长字符串 YEAR 年份值 YYYY
TEXT 长文本数据
  • 整数除了 INT 外,还有 TINYINTSMALLINTMEDIUMINTBIGINT

  • CHAR 和 VARCHAR 的区别: CHAR 的长度是固定的,而 VARCHAR 的长度是可以变化的,比如,存储字符串 “abc",对于 CHAR(10),表示存储的字符将占 10 个字节(包括 7 个空字符),而同样的 VARCHAR(12) 则只占用4个字节的长度,增加一个额外字节来存储字符串本身的长度,12 只是最大值,当你存储的字符小于 12 时,按实际长度存储。

  • ENUM和SET的区别: ENUM 类型的数据的值,必须是定义时枚举的值的其中之一,即单选,而 SET 类型的值则可以多选

2. 约束

约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。在MySQL中,通常有这几种约束:

约束类型: 主键 默认值 唯一 外键 检查 非空
关键字: PRIMARY KEY DEFAULT UNIQUE FOREIGN KEY CHECK NOT NULL

【示例】

​ 新建一个数据库 test_db,然后在其中创建四张表 studentteachercoursesc,它们包含了各种约束。

create table teacher(
    tid int(4) primary key,
    tname varchar(20)
);

create table student(
    sid int(4) primary key,
    sname varchar(20),
    sidcard varchar(18) unique,
    sgender int(1) default 0
);

create table course(
    cid int(4) primary key,
    cname varchar(20),
    tid int(4),
    constraint fk_course_teacher foreign key(tid) references teacher(tid)
);
-- fk_主表的名字_从表的名字(主表的外键字段名) references 从表的名字(字段名名)

create table sc(
    sid int(4), -- sc 外键 student sid
    cid int(4), -- sc 外键 course cid
    score float(4,1),
    constraint fk_sc_student foreign key(sid) references student(sid),
    constraint fk_sc_course foreign key(cid) references course(cid),
    primary key(sid,cid)
);

四、Mysql查询分析

1. 基本查询

SELECT 要查询的列名 FROM 表名字 WHERE 限制条件;
  • 数据准备
insert into teacher values (101, 'MaLing'),(102, 'Zoe'),(103, 'Herry'),(104, 'WangFeng'),(105, 'Thory');

insert into student values (1001, 'Tom','500153199011287932', 0),(1002, 'Jim','522532198505025531', 0),
(1003, 'Luo Song','562342198108066632', 0),(1004, 'kidy','586325199010056538', 1),(1005, 'Johnson','520801198805068635', 0),
(1006, 'YanZi','530126197902091122', 1),(1007, 'Candy','422352199208205328', 0),(1008, 'Sindy','420836199110108828', 1),
(1009, 'FengHe','400283199308296649', 0),(1010, 'LiuShan','620123199305319765', 1);

insert into course values (100, '马克思', 105),(200, '企业管理', 101),(300, '数据库', 103),(400, '程序设计', 102),
(500, '网页设计', 104);

insert into sc values (1001, 100, 89),(1001, 200, 65),(1001, 500, 29),(1002, 100, 78),(1002, 200, 56),(1003, 100, 71),
(1003, 500, 60),(1003, 300, 80),(1003, 400, 48),(1004, 200, 43),(1004, 300, 60),(1004, 500, 82),(1005, 100, 35),
(1006, 200, 79),(1006, 100, 79),(1006, 300, 49),(1006, 400, 61),(1006, 500, 55),(1007, 100, 50),(1007, 300, 91),
(1008, 200, 63),(1008, 400, 67),(1008, 500, 88),(1009, 100, 44),(1009, 200, 64),(1010, 200, 89),(1010, 100, 90),(1010, 300, 56);

(1)使用通配符 * 查询表中所有数据,

select * from 表名;

(2)查询指定列的数据

SELECT sid,sname FROM student;

(3)where子句进行精确查询

​ SELECT 语句常常会有 WHERE 限制条件,用于达到更加精确的查询。

  • WHERE限制条件可以有数学符号 (=,<,>,>=,<=)
SELECT name,age FROM employee WHERE age>25;   -- 筛选出 age 大于 25 的结果
SELECT name,age,phone FROM employee WHERE name='Mary';  -- 查找一个名字为 Mary 的员工的 name,age 和 phone
  • where限制条件使用 andor

    WHERE 后面可以有不止一条限制,而根据条件之间的逻辑关系,可以用 [条件一 OR 条件二]] 和 [条件一 AND 条件二] 连接:

SELECT name,age FROM employee WHERE age<25 OR age>30;  -- 筛选出 age 小于 25,或 age 大于 30
SELECT name,age FROM employee WHERE age>25 AND age<30;  -- 筛选出 age 大于 25,且 age 小于 30
  • where限制条件使用 between... and ... (全闭区间)
SELECT name,age FROM employee WHERE age between 25 AND 30;  -- 筛选出 age 大于等于 25,且 age 小于等于 30
  • where限制条件使用 innot in,用于筛选“在”“不在”某个范围内的结果
SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt IN ('dpt3','dpt4');
  • where限制条件使用关键字 like进行模糊查询,而like通常配合通配符一起使用。

    关键字 LIKE 可用于实现模糊查询,常见于搜索功能中。和 LIKE 联用的通常还有通配符,代表未知字符。

    SQL中的通配符是 _% 。其中 _ 代表一个未指定字符,% 代表不定个未指定字符

#只记得电话号码前四位数为1101,而后两位忘记了,则可以用两个 _ 通配符代替
SELECT name,age,phone FROM employee WHERE phone LIKE '1101__';

#只记名字的首字母,又不知道名字长度,则用 % 通配符代替不定个字符:
SELECT name,age,phone FROM employee WHERE name LIKE 'J%';

2. 排序

为了使查询结果看起来更规律,我们可能需要对结果按某一列来排序,这就要用到 ORDER BY 排序关键词。

默认情况下,ORDER BY 的结果是升序排列,而使用关键词 ASCDESC 可指定升序降序排序。

【示例】按 salary 降序排列

SELECT name,age,salary,phone FROM employee ORDER BY salary DESC;

3. 子查询

上面讨论的 SELECT 语句都仅涉及一个表中的数据,然而有时必须处理多个表才能获得所需的信息。例如:想要知道名为 “Tom” 的员工所在部门做了几个工程。员工信息储存在 employee 表中,但工程信息储存在 project 表中。对于这样的情况,我们可以用子查询:

【示例】

/*
语句包含两个 SELECT 语句,第二个 SELECT 语句将返回一个集合的数据形式,然后被第一个 SELECT 语句用 in 进行判断。
HAVING 关键字可以的作用和 WHERE 是一样的,都是说明接下来要进行条件筛选操作。区别在于 HAVING 用于对分组后的数据进行筛选
*/
SELECT of_dpt,COUNT(proj_name) AS count_project FROM project GROUP BY of_dpt
HAVING of_dpt IN (SELECT in_dpt FROM employee WHERE name='Tom');

4. 连接查询

​ 在处理多个表时,子查询只有在结果来自一个表时才有用。但如果需要显示两个表或多个表中的数据,这时就必须使用连接 (join) 操作。连接的基本思想是把两个或多个表当作一个新的表来操作

【示例】

#格式一:
SELECT id,name,people_num FROM employee JOIN department
ON employee.in_dpt = department.dpt_name ORDER BY id;

#格式二:
SELECT id,name,people_num FROM employee JOIN department
ON employee.in_dpt = department.dpt_name ORDER BY id;

五、Mysql函数

SQL 有 5 个内置函数,这些函数都对 SELECT 的结果做操作:

函数名: COUNT SUM AVG MAX MIN
作用: 计数 求和 求平均值 最大值 最小值
  • COUNT 函数可用于任何数据类型(因为它只是计数)
  • SUM 、AVG 函数都只能对数字类数据类型做计算
  • MAX 和 MIN 可用于数值、字符串或是日期时间数据类型

【示例】

#使用 AS 关键词可以给值重命名,比如最大值被命名为了 max_salary
SELECT MAX(salary) AS max_salary,MIN(salary) FROM employee;  -- 计算出 salary 的最大、最小值

1. 分组

(1)group by 字段名

  • 对于用来分组的字段必须出现在select关键字后面
  • 分组常与聚合函数一起使用
  • 分组聚合之后的结果可以使用having进行过滤

六、 Mysql视图和索引

1. 索引

索引是一种与表有关的结构,它的作用相当于书的目录,可以根据目录中的页码快速找到所需的内容。

当表中有大量记录时,若要对表进行查询,没有索引的情况是全表搜索:将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录。这样做会消耗大量数据库系统时间,并造成大量磁盘 I/O 操作。

而如果在表中已建立索引,在索引中找到符合查询条件的索引值,通过索引值就可以快速找到表中的数据,可以大大加快查询速度

  • 新建索引

对一张表中的某个列建立索引,有以下两种语句格式:

ALTER TABLE 表名字 ADD INDEX 索引名 (列名);
CREATE INDEX 索引名 ON 表名字 (列名);

【示例】

ALTER TABLE employee ADD INDEX idx_id (id);  -- 在employee表的id列上建立名为idx_id的索引
CREATE INDEX idx_name ON employee (name);    -- 在employee表的name列上建立名为idx_name的索引
  • 查看表中索引
show index from 表名;
  • 在使用 SELECT 语句查询的时候,语句中 WHERE 里面的条件,会自动判断有没有可用的索引

2. 视图

视图是从一个或多个表中导出来的表,是一种虚拟存在的表。它就像一个窗口,通过这个窗口可以看到系统专门提供的数据,这样,用户可以不用看到整个数据库中的数据,而只关心对自己有用的数据。

注意理解视图是虚拟的表:

  • 数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中;
  • 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据;
  • 视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变;
  • 在使用视图的时候,可以把它当作一张表。

(1)创建视图

CREATE VIEW 视图名(列a,列b,列c) AS SELECT 列1,列2,列3 FROM 表名字;

创建视图的语句,后半句是一个 SELECT 查询语句,所以视图也可以建立在多张表上,只需在 SELECT 语句中使用子查询连接查询,这些在之前的实验已经进行过。

【示例】

#创建一个简单的视图,名为 v_emp,包含v_name,v_age,v_phone三个列
CREATE VIEW v_emp (v_name,v_age,v_phone) AS SELECT name,age,phone FROM employee;

七、Mysql事务操作

  • 事务:针对数据库的一组操作,通常由一条或多条SQL语句组成,同一个事务的操作具备同步的特点,如果其中有一条语句无法执行,那么所有的语句都不会执行。也就是说,事务的一组操作要么都执行,要么都不执行

数据库的操作过程中引入事务管理,由此保证了数据操作的完整性,这也是事务管理的意义所在。

  • 事务的生命周期:MySQL默认开启自动事务提交,一条语句就是一个事务,一条语句执行完成就是一个事务的生命周期。对手动提交事务来说,从开启事务(begin)开始,然后执行SQL语句,最终以提交commit或回滚rollback的执行完成事务的生命周期。

注意事项

​ (1)在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务

​ (2)书写执行的SQL语句都是自动提交,而开启事务中的操作语句都需要手动提交,而只有事务提交后事务的才会生效。

​ (3)事务用来管理 insert, update, delete 语句

猜你喜欢

转载自blog.csdn.net/BIN_2011464841/article/details/129110816
今日推荐