mysql -h ip -P 端口 -u 用户名 -p 密码 选项参数: -h ip 如果是在本机登录可以不用写默认即可,如果登录其他机器则使用其他机器 ip。 -P(大写) mysql 在没有修改端口时默认端口为 3306。 -u mysql 默认管理员用户为 root。 -p(小写) 使用自己的真实修改的密码。 mysql -h 127.0.0.1 -P3306 -uroot -p'Admin123.'
简单演示基本使用 查看数据库中的库:
1 2 3 4 5 6
show databases; --基本库讲解: information_schema 保存服务器中的基本信息,如数据库名称权限等。 mysql 保存数据库运行时的信息,如数据库文件夹,字符集等。 performance_schema 用于监控 mysql 各类指标。 sys 也是用于存储系统指标。
创建一个自己的数据库:
1 2 3 4 5 6 7 8
create database dbtest; --进入到数据库 use 库名 use dbtest; --在当前库中创建一个表 create table test(id int,name verchat(50)); --查看当前库中的表 show tables;
#下载 mysql 源码包 wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.34.tar.gz #创建组 groupadd mysql #创建一个账号,属于 mysql 组,不允许登录系统 useradd -r -g mysql -s /bin/false mysql #解压 mysql 包 tar -zxvf mysql-5.7.34.tar.gz #进入解压好的包 cd mysql-5.7.34 #把 boost 移动到这里面 cp ../boost_1_59_0.tar.gz . #解压 boost tar -zxvf boost_1_59_0.tar.gz #创建 mysql 存放目录 mkdir -p /mysql5.7/etc /mysql5.7/data /mysql5.7/man /mysql5.7/tmp /mysql5.7/logs
#复制 mysql.server 到开机启动目录 cp /mysql5.7/support-files/mysql.server /etc/init.d/mysqld #添加 mysql 服务 chkconfig --add mysqld #开机自启 mysql 服务 chkconfig mysqld on #启动 mysql systemctl start mysqld #修改密码 /mysql5.7/bin/mysqladmin -uroot -p'原临时密码' password 'admin' #登录 mysql /mysql5.7/bin/mysql -uroot -p'admin' #将 mysql 创建快捷方式创建后可以直接使用 mysql 登录 ln -s /mysql5.7/bin/mysql /usr/bin/mysql
三、图形化管理工具 MySQL 图形化管理工具极大地方便了数据库的操作与管理,常用的图形化管理工具有:MySQL Workbench、 phpMyAdmin、Navicat Preminum、MySQLDumper、SQLyog、dbeaver、MySQL ODBC Connector。
MySQL Workbench MySQL 官方提供的图形化管理工具 MySQL Workbench 完全支持 MySQL 5.0 以上的版本。MySQL Workbench 分为社区版和商业版,社区版完全免费,而商业版则是按年收费。 MySQL Workbench 为数据库管理员、程序开发者和系统规划师提供可视化设计、模型建立、以及数据库管理功能。它包含了用于创建复杂的数据建模 ER 模型,正向和逆向数据库工程,也可以用于执行通常需要花费大量时间的、难以变更和管理的文档任务。 下载地址
Navicat Navicat MySQL 是一个强大的 MySQL 数据库服务器管理和开发工具。它可以与任何 3.21 或以上版本的 MySQL 一起工作,支持触发器、存储过程、函数、事件、视图、管理用户等,对于新手来说易学易用。 其精心设计的图形用户界面(GUI)可以让用户用一种安全简便的方式来快速方便地创建、组织、访问和共享信息。Navicat 支持中文,有免费版本提供。 下载地址
#修改这两个参数需要去 mysql 配置文件中修改,修改后重启一下数据库即可 vim /etc/my.cnf character*set_server=utf8mb4 collation_server=utf8mb4_general_ci
修改已创建数据库和表的字符集:
1 2 3 4
--修改已经创建的数据库的字符集 alter database 库名 character set'utf8mb4' collate 'utf8mb4_general_ci'; --修改已创建表的字符集 alter table 表名 convert to character set'utf8mb4' collate 'utf8mb4_general_ci';
3.函数
什么是函数? 函数在计算机中它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。能提高了代码效率 ,提高可维 护性 。在 SQL 中我们也可以使用函数对检索出来的数据进行函数操作。使用这些函数,可以极大地 提高用户对数据库的管理效率 。 函数可以分为内置函数 和 自定义函数 ,内置函数系统自带,自定义函数需要我们自己定义。 MySQL 提供的内置函数可以分为数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、获取 MySQL 信息函数、聚合函数等。本记录只记录部分常用函数
日期时间函数
获取日期、时间:
函数
作用
用法
CURDATE()
返回当前日期,只包含年、月、日
SELECT CURDATE() FROM DUAL;
—
—
—
CURTIME()
返回当前时间,只包含时、分、秒
SELECT CURTIME() FROM DUAL;
—
—
—
NOW()
返回当前系统日期和时间
SELECT NOW() FROM DUAL;
日期与时间戳的转换 :
函数
作用
用法
UNIX_TIMESTAMP()
以 UNIX 时间戳的形式返回当前时间
SELECT UNIX_TIMESTAMP(now());
—
—
—
UNIX_TIMESTAMP(date)
将时间 date 以 UNIX 时间戳的形式返回
SELECT UNIX_TIMESTAMP(CURDATE());
—
—
—
FROM_UNIXTIME(timestamp)
将 UNIX 时间戳的时间转换为普通格式的时间
SELECT FROM_UNIXTIME(timestamp);
函数
作用
用法
IF(value,value1,value2) 如果 value 的值为 TRUE,返回 value1,否则返回 value2SELECT IF(1 0,’正确’,’错误’)
—
—
—
IFNULL(value1, value2)
如果 value1 不为 NULL,返回 value1,否则返回 value2
SELECTIFNULL(null,’HelloWord’)
—
—
—
CASE WHEN 条件 1 THEN 结果 1 WHEN 条件 2THEN 结果 2…. [ELSE resultn] END
--方式 1:创建数据库 CREATE DATABASE 数据库名; --方式 2:创建数据库并指定字符集 CREATE DATABASE 数据库名 CHARACTER SET 字符集; --方式 3:判断数据库是否已经存在,不存在则创建数据库( 推荐 ) CREATE DATABASE IF NOT EXISTS 数据库名;
使用数据库:
1 2 3 4 5 6 7 8 9 10
--查看当前所有的数据库 SHOW DATABASES; #有一个 S,代表多个数据库 --查看当前正在使用的数据库 SELECT DATABASE(); --查看指定库下所有的表 SHOW TABLES FROM 数据库名; --查看数据库的创建信息 SHOW CREATE DATABASE 数据库名; --使用/切换数据库 USE 数据库名;
修改数据库 :
1 2 3 4 5 6 7
--更改数据库字符集 ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:gbk、utf8 等 删除数据库: --方式 1:删除指定的数据库 DROP DATABASE 数据库名; --方式 2:删除指定的数据库( 推荐 ) DROP DATABASE IF EXISTS 数据库名;
--追加一个列 ALTER TABLE 表名 ADD 字段名 字段类型; ALTER TABLE table1 ADD job_id varchar(15); --修改一个列 ALTER TABLE 表名 MODIFY 字段名 1 字段类型; ALTER TABLE table1 MODIFY t_name VARCHAR(30); --重命名一个列 ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型; ALTER TABLE table1 CHANGE t_name t1_name varchar(15); --删除一个列 ALTER TABLE 表名 DROP COLUMN 字段名 ALTER TABLE table1 DROP COLUMN job_id;
删除表:
1 2 3 4 5
--此操作不能回滚,谨慎操作 --方法一 DROP TABLE [IF EXISTS] table1; --方法二 DROP TABLE table1;
清空表:
1 2 3 4 5 6
--此操作不能回滚,谨慎操作 TRUNCATE TABLE 表名; TRUNCATE TABLE table1; --可以回滚 DELETE FROM 表名; DELETE FROM table1;
3.DML
数据库操纵语言:插入数据 insert,删除数据 delete,更新数据 update
插入数据 insert
1 2 3 4 5 6 7 8
--方式 1:为表的所有字段按默认顺序插入数据 INSERT INTO 表名 VALUES (value1,value2,....); insert into mytable value (1,'hhh',3000,'2000-01-01'); --方式 2:指定字段添加 insert into mytable (t_id,t_name) value (2,'aaa'); --方式 3:同时添加多条 insert into mytable value (3,'bbb',3000,'2000-01-01'),(4,'ccc',3000,'2000-01-01'); insert into mytable (t_id,t_name) value (5,'ddd'),(6,'eee');
删除数据 delete
1 2 3 4 5
--删除数据 delete 表名 where 条件; delete mytable where t_id =6; --如果省略 WHERE 子句,则表中的全部数据将被删除 delete 表名;
更新数据 update
1 2 3
--修改表数据 update 表名 set 修改内容 where 修改条件; update mytable set t_name='fff'where t_id=2;
4.DQL
DQL 主要是 select,用于数据库查询数据,使用频率最多。
select 最基本的语法
1 2 3 4 5 6 7 8 9 10
--基本语法 select \* from 表名;或者 select 字段一,字段二 from 表名; select \_ from table; 参数讲解: SELECT 标识选择哪些列
* 列出所有字段 FROM 标识从哪个表中选择 --最基本的查询 select 1+1,1*2 from dual; --dual 属于伪表
列的别名
1 2 3 4 5 6
--查询一些数据时,我们想重新给字段设置一个名字,我们就可以使用别名。别名可以紧跟列名,也可以在列名和别名之间加 入关键字 AS,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写 --使用 as 用法 select name as 姓名,age as 年龄 from table; --不使用 as select name 姓名,age 年龄 from table;
去除重复项
1 2 3
--默认情况下,查询会返回全部行,所以很有可能出现很多重复项比如通话记录中电话号码就会很多重复,可以使用关键字 DISTINCT 去除重复项 SELECT DISTINCT phone FROM table;
查询常数
1 2
--查询有些数据时,想在查询结果添加一个字段就需要使用查询常数,比如每一行都加一个性别 select name,'男' from table;
where 条件查询
1 2
--查询数据时,需要筛选过滤一些数据就可以使用 where 条件语句。比如查找年龄 18 岁以上的人员 select * from table where age>18;
ORDER BY 排序
1 2 3 4 5 6 7
--查询数据时,需要对查询的数据进行排序可以使用 ORDER BY 进行排序,ORDER BY 子句在 SELECT 语句的结尾 --排序规则:使用 ORDER BY 子句排序,ASC(升序),DESC(降序)默认排序是 asc。 --单列排序 select _ from table order by id; select _ from table order by id desc; --多列排序 select _ from table order by id,age desc;
--在正常环境中我们不会把所有数据放在同一张表中,会存放在多张表里面比如学生表和教师表,但是又想查询每个学生对应的老师就需要用到多表查询,多表查询一般两个表都需要有相互关联的字段 select _ from student s,tecaher t where s.tid=s.tid;
GROUP BY 分组
1 2
--在查询时需要对某一个字段进行分组可以使用 group by,比如查询每个部门平均工资 SELECT departmentid, AVG(salary) FROM employees GROUP BY departmentid;
子查询
1 2
--子查询是指在 SQL 查询语句中嵌套使用的查询语句。子查询也被称为内部查询或嵌套查询。子查询可以出现在 SELECT、INSERT、UPDATE 或 DELETE 语句中的 WHERE 子句中,用于提供更复杂的查询逻辑和过滤条件。 select _ from table1 where table1.id in (select _ from table2);
5.DCL
数据库控制语言:定义数据库、表、字段、用户的访问权限和安全级别
查看权限
1 2 3 4 5 6
--查看权限列表 SHOW PRIVILEGES; --查看当前用户的权限 show grants; --查看某个用户的权限 SHOW GRANTS FOR '用户名';
权限列表
权限分布
可设置的权限
表权限
SELECT、INSERT、UPDATE、DELETE 等
—
—
列权限
SELECT、INSERT、UPDATE 等
—
—
过程权限
对存储过程的执行权限
赋予权限
1 2 3 4 5 6 7 8 9 10 11 12
--语法 GRANT 权限 1,权限 2,... on 数据库名.表名 to '用户名'@'用户地址' IDENTIFIED BY '密码'; GRANT select,update ON mydb.mytable TO 'test'@'%'; --赋予所有的权限 GRANT ALL PRIVILEGES ON _._ TO 'test'@'%'; --注意:给其他用户赋予了所有权限之后,其他用户是不可以对另外的用户进行赋予权限的,这就是和 root 的区别,如果需要 给普通用户赋予权限的需求可以使用 WITH GRANT OPTION --语法 GRANT 权限列表 ON 库名.表名 TO '用户名'@'客户端主机 ip' IDENTIFIED BY '密码' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON _._ TO 'root'@'%'IDENTIFIED BY 'Admin123.' WITH GRANT OPTION; --最终需要刷新 FLUSH PRIVILEGES;
收回权限
1 2 3 4 5
--语法 REVOKE 权限 1,权限 2,... ON 数据库名.表名 TO '用户名'@'用户地址' IDENTIFIED BY '密码'; REVOKE ALL PRIVILEGES ON _._ TO 'root'@'%'IDENTIFIED BY 'Admin123.' WITH GRANT OPTION; --最终需要刷新 FLUSH PRIVILEGES;
六、用户管理
MySQL 的用户是用来管理数据库和表,mysql 把用户分成普通用户和 root 用户,root 用户是超级管理员拥有所有权 限。
1.查看,创建,修改,删除用户
查看数据库中的用户
1
SELECT user,host,authentication_string from mysql.user;
创建用户
1 2 3 4 5
--语法 CREATE USER 用户名 IDENTIFIED BY 密码; --示例 create user 'test' identified by 'test'; CREATE USER 'test'@'%' IDENTIFIED BY 'test';
修改用户
1 2 3 4 5 6
--方法一 update mysql.user set host='localhost'where user='test' --方法二 ALTER USER 'test'@'localhost' IDENTIFIED BY 'test'; --修改后需要进行刷新 flush privileges;
删除用户
1 2 3 4 5 6
--方式一,删除所有的 DROP USER 用户名; DROP USER 'test'; --方式二,指定 host 删除 DROP USER 用户名@host; DROP USER 'test'@'localhost';
2.修改密码
1 2
ALTER USER 用户名 IDENTIFIED BY 密码; ALTER USER 'test' IDENTIFIED BY 'Admin';
3.密码过期策略
1 2 3 4
--设置密码立即过期 alter user 用户名 password expire; --设置过期时间 alter user 用户名 password expire interval 90 day;
七、约束
1. 什么是约束
约束是表级的强制规定。 可以在创建表时规定约束或者在表创建之后通过 ALTER TABLE 语句规定约束 。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。 约束的分类:
--建表时创建约束 CREATE TABLE 表名称( 字段名 数据类型, 字段名 数据类型 NOT NULL, 字段名 数据类型 NOT NULL ); CREATE TABLE student( id int, name varchar(20) not null ); --表创建好后添加 alter table 表名称 modify 字段名 数据类型 not null; alter table student modify id int not null;
删除非空约束
1 2 3 4 5
alter table 表名称 modify 字段名 数据类型 NULL; ALTER TABLE student MODIFY name VARCHAR(30) NULL; 或 alter table 表名称 modify 字段名 数据类型; ALTER TABLE student MODIFY name VARCHAR(30);
3.唯一性约束
特点:用来限制某个字段/某列的值不能重复 。同一个表可以有多个唯一约束 ,唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。 MySQL 会给唯一约束的列上默认创建一个唯一索引 。
CREATE VIEW 视图名称 AS 查询语句; CREATE VIEW table_view AS SELECT id,name,salary FROM table;
查看视图
1 2 3 4
--查看数据库的表对象、视图对象 SHOW TABLES; --查看视图的结构 DESC / DESCRIBE 视图名称;
修改视图
1
ALTER VIEW 视图名称 AS 查询语句
删除视图
1 2
--删除视图只是删除视图的定义,并不会删除基表的数据 DROP VIEW IF EXISTS 视图名称;
九、存储过程
什么是存储过程 MySQL 的存储过程是一组预先编译好的 SQL 语句集合,类似于程序中的函数,可以在 MySQL 服务器上存储和执行。存储过程可以接受参数、执行 SQL 查询、控制流程、进行逻辑处理,并返回结果。存储过程可以被多次调用,提高了 SQL 代码的重用性和可维护性。 好处:
1、简化操作,提高了 sql 语句的重用性,减少了开发程序员的压力
2、减少操作过程中的失误,提高效率
3、减少网络传输量(客户端不需要把所有的 SQL 语句通过网络发给服务器)
4、减少了 SQL 语句暴露在网上的风险,也提高了数据查询的安全性
创建存储过程
1 2 3 4 5 6 7 8 9 10 11
--语法 CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...) [characteristics ...] BEGIN 存储过程体 END --示例 CREATE PROCEDURE select*mytable() BEGIN SELECT * FROM mytable; END
存储过程的调用
1 2
CALL 存储过程名(实参列表); call select*mytable();
删除存储过程
1 2
DROP PROCEDURE 存储过程名 DROP PROCEDURE select_mytable;
十、触发器
什么是触发器 MySQL 触发器是一种特殊的数据库对象,它与表相关联,并在表上执行定义的操作(例如插入、更新、删除)时自 动触发。触发器是一种用于实现数据库约束、自动化业务逻辑和数据一致性的机制。
创建触发器
1 2 3 4 5 6 7 8 9 10 11 12 13 14
--语法结构 CREATE TRIGGER 触发器名称 {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名 FOR EACH ROW --说明 表名 :表示触发器监控的对象。 BEFORE|AFTER :表示触发的时间。BEFORE 表示在事件之前触发;AFTER 表示在事件之后触发。 INSERT|UPDATE|DELETE :表示触发的事件。 INSERT 表示插入记录时触发; UPDATE 表示更新记录时触发; DELETE 表示删除记录时触发。 CREATE TRIGGER 触发器名称 {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名 FOR EACH ROW
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
--创建两个表 CREATE TABLE mytb ( id INT PRIMARY KEY AUTO_INCREMENT, user_name VARCHAR(30) ); CREATE TABLE mytb_log ( id INT PRIMARY KEY AUTO_INCREMENT, log VARCHAR(30) ); --创建触发器 CREATE TRIGGER mytergger AFTER INSERT ON mytb FOR EACH ROW BEGIN INSERT INTO mytb_log (log) VALUES ('mytb 表插入了新的数据'); END --验证 insert into mytb (user_name) value ('hhh') select * from mytb*log
查看触发器
1 2 3 4 5 6
--方式 1:查看当前数据库的所有触发器的定义 SHOW TRIGGERS\G --方式 2:查看当前数据库中某个触发器的定义 SHOW CREATE TRIGGER 触发器名 --方式 3:从系统库 information_schema 的 TRIGGERS 表中查询“salary_check_trigger”触发器的信息。 SELECT * FROM information*schema.TRIGGERS;
vim /etc/my.cnf log-bin=mysql-bin server-id=1 #重启 systemctl restart mysqld
主库授权从库
1 2 3 4 5
--登录数据库 mysql -uroot -p grant replication slave on _._ to '授权用户'@'从库 IP' identified by '授权密码'; grant replication slave on _._ to 'slave'@'192.168.134.145' identified by 'Admin123.'; flush privileges;