王海鱼 发表于 2026-2-11 03:58:55

培训第二十三天(mysql主从脚本与mysql详细语句先容)

上午

在同步时,对删除和修改都比力慎重(监控同步时)
mysql主从搭建 条件软件libaio,rsync

 1、主
 2、从
 3、同步
 4、测试注意:先实行从服务器的脚本,再实行主服务器脚本
master-mysql设置脚本


 先要在主服务器上配置免密登录
 ssh-keygen
 ssh-copy-id root@10.0.0.12
 vim mysql.sh
 #!/bin/bash
 echo "安装master-mysql"
 sleep 3
 #下载依赖软件包
 yum list installed | grep libaio &> /dev/null
 if [ $? -ne 0 ];then
    yum -y install libaio   &> /dev/null
 fi
 echo "libaio已经安装"
 yum list installed | grep rsync   &> /dev/null
 if [ $? -ne 0 ];then
 yum -y install rsync   &> /dev/null
 fi
 echo "rsync已经安装"
 yum list installed | grep ntpdate.x86_64   &> /dev/null
 if [ $? -ne 0 ];then
 yum -y install ntpdate.x86_64   &> /dev/null
 fi
 echo "ntpdate.x86_64已经安装"
 ntpdate cn.ntp.org.cn
 sleep 3
 #解压软件包
 tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar
 sleep 3
 tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz
 echo "软件包已经解压"
 #转移到指定工作目录
 cp -r mysql-8.0.33-linux-glibc2.12-x86_64 /usr/local/mysql
 cd /usr/local/mysql/
 #创建工作文件目录
 mkdir mysql-files
 #创建mysql系统用户
 id mysql
 if [ $? -ne 0 ];then
    useradd -r -s /sbin/nologin mysql
 fi
 echo "mysql用户已经创建"
 #修改工作文件目录的权限和所属主,所属组
 chown mysql:mysql ./mysql-files/
 chmod 750 ./mysql-files/
 #删除/etc/my.cnf文件
 rm -rf /etc/my.cnf
 #初始化mysql
 /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/
 sleep 3
 #加密
 /usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
 echo "加密成功"
 #设置service服务
 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql8
 #开启mysql
 service mysql8 start
 if [ $? -ne 0 ];then
    echo "mysql开启失败"
 else
    echo "mysql开启成功"
 fi
 sleep 3
 #编辑配置文件my.cnf
 cat >> /usr/local/mysql/my.cnf << EOF
 
 basedir=/usr/local/mysql
 datadir=/usr/local/mysql/data
 socket=/tmp/mysql.sock
 activate_all_roles_on_login=on
 port=3306
 log-error=/usr/local/mysql/data/db01-master.err
 log-bin=/usr/local/mysql/data/binlog
 server-id=10
 character_set_server=utf8mb4
 EOF
 #重启mysql
 service mysql8 restart
 if [ $? -ne 0 ];then
    echo "mysql重启失败"
 else
    echo "mysql重启成功"
 fi
 sleep 3
 #数据同步
 echo "开始配置数据同步,如果不配置请在3秒内按ctrl+c进行打断"
 sleep 3
 service mysql8 stop
 echo "mysql服务已经停止"
 rm -rf /usr/local/mysql/data/auto.cnf
 echo "auto.cnf文件已经删除"
 yum -y install rsync &> /dev/null
 if [ $? -eq 0 ];then
    echo "rsync软件已经安装成功"
 else
    echo "rsync软件安装失败"
 fi
 rsync -av /usr/local/mysql/data root@10.0.0.12:/usr/local/mysql/   &>/etc/null
 if [ $? -eq 0 ];then
    echo "data目录同步成功"
 else
    echo "data目录同步失败"
 fi
 sleep 3
 #开启mysql
 service mysql8 start
 if [ $? -ne 0 ];then
    echo "mysql开启失败"
 else
    echo "mysql开启成功"
 fi
 #修改环境变量
 sed -i '$aexport PATH=/usr/local/mysql/bin:$PATH' /etc/profile
 #激活配置
 source /etc/profile
 if [ $? -ne 0 ];then
    echo "profile文件激活失败"
 fi
 echo "完成master-mysql配置"

 source mysql.sh
 # source /etc/profile    //激活profile文件
 mysql -p'hz),bpIhb2x+'   //密码为上面初始化之后自动生成的slave-mysql设置脚本


 #!/bin/bash
 echo "安装slave-mysql"
 sleep 3
 #下载依赖软件包
 yum list installed | grep libaio &> /dev/null
 if [ $? -ne 0 ];then
    yum -y install libaio   &> /dev/null
 fi
 echo "libaio已经安装"
 yum list installed | grep rsync   &> /dev/null
 if [ $? -ne 0 ];then
 yum -y install rsync   &> /dev/null
 fi
 echo "rsync已经安装"
 yum list installed | grep ntpdate.x86_64   &> /dev/null
 if [ $? -ne 0 ];then
 yum -y install ntpdate.x86_64   &> /dev/null
 fi
 echo "ntpdate.x86_64已经安装"
 ntpdate cn.ntp.org.cn
 sleep 3
 #解压软件包
 tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar
 sleep 3
 tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz
 echo "软件包已经解压"
 #转移到指定工作目录
 cp -r mysql-8.0.33-linux-glibc2.12-x86_64 /usr/local/mysql
 cd /usr/local/mysql/
 #创建工作文件目录
 mkdir mysql-files
 #创建mysql系统用户
 id mysql
 if [ $? -ne 0 ];then
    useradd -r -s /sbin/nologin mysql
 fi
 echo "mysql用户已经创建"
 #修改工作文件目录的权限和所属主,所属组
 chown mysql:mysql ./mysql-files/
 chmod 750 ./mysql-files/
 #删除/etc/my.cnf文件
 rm -rf /etc/my.cnf
 #设置service服务
 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql8
 #编辑配置文件my.cnf
 cat >> /usr/local/mysql/my.cnf << EOF
 
 basedir=/usr/local/mysql
 datadir=/usr/local/mysql/data
 socket=/tmp/mysql.sock
 activate_all_roles_on_login=on
 port=3310
 log-error=/usr/local/mysql/data/db01-slave.err
 relay-log=/usr/local/mysql/data/relaylog
 server-id=11
 character_set_server=utf8mb4
 EOF
 #数据同步
 echo "开始配置数据同步,如果不配置请在3秒内按ctrl+c进行打断"
 sleep 3
 yum -y install rsync &> /dev/null
 if [ $? -eq 0 ];then
    echo "rsync软件已经安装成功"
 else
    echo "rsync软件安装失败"
 fi
 #修改环境变量
 sed -i '$aexport PATH=/usr/local/mysql/bin:$PATH' /etc/profile
 #激活配置
 source /etc/profile
 if [ $? -ne 0 ];then
    echo "profile文件激活失败"
 fi
 echo "完成slave-mysql配置,等待master-mysql同步data"
 echo "注意该数据库端口号为3310"
 source mysql.sh两个脚本都运行完之后
主服务器设置

 systemctl stop firewalld                 //关闭防火墙
 mysql> alter user 'root'@'localhost' identified by '123';
 Query OK, 0 rows affected (0.15 sec)     //修改root密码
 mysql> create user 'slave'@'%' identified by '123';
 Query OK, 0 rows affected (0.03 sec)    //创建slave用户
 mysql> grant replication slave on *.* to 'slave'@'%';
 Query OK, 0 rows affected (0.02 sec)    //授予replication slave权限
 mysql> flush privileges;                //重新加载权限表
 Query OK, 0 rows affected (0.00 sec)
 mysql> flush tables with read lock;       //刷新所有表并施加一个全局读锁
 Query OK, 0 rows affected (0.01 sec)
 mysql> show master status;              //查看主服务器当前二进制日志的状态信息
 +---------------+----------+--------------+------------------+-------------------+
 | File        | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
 +---------------+----------+--------------+------------------+-------------------+
 | binlog.000003 |     1178 |            |                |                   |
 +---------------+----------+--------------+------------------+-------------------+
 1 row in set (0.00 sec)从服务器设置

 service mysql8 start
 source /etc/profile       //激活profile文件
 mysql -uslave -p123 -h10.0.0.13 -P3306 --get-server-public-key         //获取服务器的公共密钥
 mysql> quit
 Bye
 mysql -P3310 -p'hz),bpIhb2x+'  //密码为主服务器原先生成的密码
 mysql> alter user 'root'@'localhost' identified by '123';
 Query OK, 0 rows affected (0.08 sec)   //修改root密码
 mysql> change master to
     -> master_host='10.0.0.13',
     -> master_user='slave',
     -> master_password='123',
     -> master_port=3306,
     -> master_log_file='binlog.000003',
     -> master_log_pos=1178;
 Query OK, 0 rows affected, 9 warnings (0.02 sec)
 mysql> start slave;
 Query OK, 0 rows affected, 1 warning (0.03 sec)
 mysql> show slave status\G
 *************************** 1. row ***************************
                Slave_IO_State: Waiting for source to send event
                 Master_Host: 10.0.0.13
                 Master_User: slave
                 Master_Port: 3306
               Connect_Retry: 60
             Master_Log_File: binlog.000003
         Read_Master_Log_Pos: 1178
                Relay_Log_File: relaylog.000002
               Relay_Log_Pos: 323
       Relay_Master_Log_File: binlog.000003
              Slave_IO_Running: Yes
           Slave_SQL_Running: Yes主服务器设置

 mysql> unlock tables;
 Query OK, 0 rows affected (0.00 sec)到此设置全部完成
下战书


 1、新增
    insert into 库名称.表名(id,username,password) values(1,"abc","123");
    insert into 表名称 values(1,"name","word");
    insert into 表名称 select * from 其他表;
    inster into 表名称 values(),();
 2、删除
    delete from 表名;
    delete from tablename where id=3;
    delete from tablename where age>8;
    delect from tablename where name on("a","b","c");
 3、修改
    update mysql.user set host='%' where name='root'
    update user set password='abc' where username="zhangsan"
 4、查询
    单表查询:select 字段名列表 from 表名,索引;一、MySQL 函 数先容

1、聚合函数

只有 select ⼦句和 having ⼦句、order by ⼦句中能使⽤聚合函数,where ⼦句不能使⽤聚合函数。当使⽤聚合查询以后,不能使⽤where条件,假如要添加条件,就使⽤having。
常⽤聚合``函数统计表中数据的⾏数大概统计指定列不为空值的数据⾏个数select count(*或表头名) from 表名;盘算指定列的最⼤值,假如指定列是字符串范例(⽂字范例)则使⽤字符⾸拼排序select max(表头名) from 表名;盘算指定列的最⼩值,假如指定列是字符串范例(⽂字范例)则使⽤字符⾸拼排序select min(表头名) from 表名;盘算指定列的数值和,假如指定列不是数值范例则盘算效果为 0select sum(表头名) from 表名;盘算指定列的均匀值,假如指定列不是数值范例则盘算效果为 0select avg(表头名) from 表名;2、其他常⽤函数

(1)⽇期函数

⽇期时间函数获取当前⽇期和时间select now();表现输⼊⽇期的年份select year('date');比方:select year('1998-08-24');(只表现 1998 年)盘算输⼊的⽇期 到年初的周数select weekofyear ('date');比方:select year('2023-01-31');(会表现 5,也就是5 周)盘算输⼊的⽇期 到年初的天数select dayofyear ('date');比方:select dayofyear('2023-01-31');(会表现 31,也就是 31 天)表现输⼊⽇期的 ⽉份值select month('date');比方:select month('1998-08-24');(只表现 8 ⽉)表现输⼊⽇期是 ⼏号select day('date');比方:select day('1998-08-24');(只表现 24 号)表现输⼊⽇期是 ⼀周中的第⼏天 (从周⽇开始)select dayofweek('date');比方:select dayofweek('1998-08-24');(表现 2,也就是周⼀)表现输⼊⽇期的 ⽉份的末了⼀天select last_day('date');比方:select last_day('2023-09-24');(会表现 2023 年 9 ⽉ 末了⼀天是⼏号)表现输⼊⽇期加多少天的效果select adddate(current_date,须要加的天数);比方:select adddate(current_date,44);(会表现当前⽇期加上 44 天的效果)表现输⼊⽇期减 多少天的效果select subdate(current_date,须要减的天数); 比方:select subdate(current_date,44);(会表现当前⽇期减去 44 天的效果)表现两个⽇期中 隔断了多少天select datediff ('date1','date2');比方:select datediff ('2023-09-24','1998-08-24');(会表现 9162,也就是两个⽇期之隔断了 9162 天)表现输⼊时间已 颠末了多少⼩时select hour('time');比方:select hour('18:41:44');(会表现已经已往了 18 个⼩ 时)表现输⼊时间已 颠末了多少分钟select minute('time');(time 为时间尺度格式)表现过了多少秒select second('time');(time 为时间尺度格式)表现输⼊⽇期时 间的时间值select time('datetime');(datetime:尺度⽇期格式)表现输⼊⽇期select date('datetime');(datetime:尺度⽇期 格式)(2)数字函数

数字函数表现⼩于输⼊数字的最⼤整数值或输⼊⼀个算式select floor(数字);例:select floor(1+2-3*5/6);表现⼤于输⼊数字的最小整数值或输⼊⼀个算式select ceiling(数字);例: select ceiling(1+2-3*5/6);表现带⼩数点数字的四舍 五⼊的整数值或输⼊⼀个效果带⼩数点的算式select round(数字);例:select round(651351/52);生存多少位⼩数select truncate(带⼩数点的数字,生存的位数);例:select truncate(12345.6789,2);(效果为 12345.67)(3)字符串函数

字符串函数去掉字符串 str 开头的空格select ltrim(str);去掉字符串 str 尾部的空格select rtrim(str);去掉字符串⾸部和尾部的全部空格select trim(str);指定字符串的 x 位,y 个字符⻓的字符串更换为其他字符select insert('指定字符 串',x,y,'更换字符串');将字符串从 x 位分开,分成 y 个字符⻓的字符串(x 可⽤负数,表现从右往左数)select substring(str,x,y);二、MySQL 分组查询

语法:
select 聚合函数(表头名 1),表头名 2 from 数据表名 group by 表 头名;
select 聚合函数(表头名) 临时表头名,真实表头名 from 数据表名 group by 真实表头名;
若⽤ group by 分组查询语句,必须加⼊聚合函数,否则报错 (踩坑)

 mysql> create table 学⽣表(序号 int,姓名 char(16),年龄 int,班级 int);
 Query OK, 0 rows affected (0.01 sec)
 #新建⼀个学⽣表,表头有:序号,数字形式;姓名,⽂本字符串形式;年龄,数字形式;班级,数字形式。
 mysql> desc 学⽣表;
 +--------+----------+------+-----+---------+-------+
 | Field | Type     | Null | Key | Default | Extra
 |
 +--------+----------+------+-----+---------+-------+
 | 序号   | int(11) | YES |     | NULL   |      
 |
 | 姓名   | char(16) | YES |     | NULL   |      
 |
 | 年龄   | int(11) | YES |     | NULL   |      
 |
 | 班级   | int(11) | YES |     | NULL   |      
 |
 +--------+----------+------+-----+---------+-------+
 4 rows in set (0.00 sec)
 #展示学⽣表表头信息
 insert into 学⽣表 values(1,'tom',15,101);
 insert into 学⽣表 values(2,'mike',16,102);
 insert into 学⽣表 values(3,'john',14,103);
 insert into 学⽣表 values(4,'lili',15,102);
 insert into 学⽣表 values(5,'jack',15,101);
 insert into 学⽣表 values(6,'xiaoming',17,103);
 #向学⽣表内插⼊学⽣信息
 mysql> select * from 学⽣表;
 +--------+----------+--------+--------+
 | 序号   | 姓名     | 年龄   | 班级     |
 +--------+----------+--------+--------+
 |      1 | tom     |     15 |    101|
 |      2 | mike     |     16 |    102 |
 |      3 | john     |     14 |    103 |
 |      4 | lili     |     15 |    102 |
 |      5 | jack     |     15 |    101 |
 |      6 | xiaoming |     17 |    103 |
 +--------+----------+--------+--------+
 6 rows in set (0.00 sec)
 #查看表内学⽣信息
 mysql> select avg(年龄) from 学⽣表;
 +-------------+
 | avg(年龄)   |
 +-------------+
 |     15.3333 |
 +-------------+
 1 row in set (0.00 sec)
 #计算所有学⽣平均年龄,avg:计算平均值,计算⾮数字,结果为0
 mysql> select avg(年龄) from 学⽣表 group by 班级;
 +-------------+
 | avg(年龄)   |
 +-------------+
 |     15.0000 |
 |     15.5000 |
 |     15.5000 |
 +-------------+
 3 rows in set (0.00 sec)
 #通过group by语法计算每个班的学⽣平均年龄
 mysql> select avg(年龄) 平均年龄,班级 from 学⽣表 group by 班级;
 +--------------+--------+
 | 平均年龄   | 班级 |
 +--------------+--------+
 |      15.0000 |    101 |
 |      15.5000 |    102 |
 |      15.5000 |    103 |
 +--------------+--------+
 3 rows in set (0.00 sec)
 #“平均年龄”:这个是⾃⼰临时命名的表头名,也可以不写,那么就是下⾯的效果
 mysql> select avg(年龄),班级 from 学⽣表 group by 班级;
 +-------------+--------+
 | avg(年龄) | 班级 |
 +-------------+--------+
 |     15.0000 |    101 |
 |     15.5000 |    102 |
 |     15.5000 |    103 |
 +-------------+--------+
 3 rows in set (0.00 sec)
 mysql> select min(年龄) 最⼩年龄,班级 from 学⽣表 group by 班级;
 +--------------+--------+
 | 最⼩年龄   | 班级 |
 +--------------+--------+
 |           15 |    101 |
 |           15 |    102 |
 |           14 |    103 |
 +--------------+--------+
 3 rows in set (0.00 sec)
 #avg也可以改成min最⼩值、max最⼤值、sum加法函数等运算⽅式
 mysql> select count(*) 总⼈数,班级 from 学⽣表 group by 班级;
 +-----------+--------+
 | 总⼈数 | 班级 |
 +-----------+--------+
 |         2 |    101 |
 |         2 |    102 |
 |         2 |    103 |
 +-----------+--------+
 3 rows in set (0.00 sec)
 #也可以⽤count统计函数计算每个班的总⼈数
 #这些count、avg、max、min、sum就是聚合函数,分组查询必须有这些函数的其⼀三、MySQL ⼦语句查询

⼦查询是指⼀个查询语句嵌套在另⼀个查询语句内部的查询;
该查询语句可以嵌套在⼀个 SELECT、SELECT...INTO、 INSERT...INTO 等语句中。
在执⾏查询时,⾸先会执⾏⼦查询中的语句,再将返回的效果作为外层查询的过滤条件。
在⼦查询中通常可以使⽤⽐较运算符和 IN、EXISTS、ANY、 ALL 等关键字。
比方:select * from class where cid=(select classid from student where sname='张三');
1、⽐较运算符的⼦查询

也就是⽤“=”、“<”、“>”这类⽐较运算符

 mysql> create table class(cid int(4) not null primary key,cname varchar(20));
 Query OK, 0 rows affected (0.05 sec)
 # 创建班级表
 mysql> create table student (sid int(4) not null primary key, sname varchar (20), sage int (2), classid int (4) not null);
 Query OK, 0 rows affected (0.03 sec)
 # 创建学⽣表
 insert into class values(1001,'Java');
 insert into class values(1002,'C++');
 insert into class values(1003,'Python');
 insert into class values(1004,'PHP');
 insert into class values(1005,'Android');
 # 向班级表插⼊数据
 insert into student values(1,'张三',20,1001);
 insert into student values(2,'李四',21,1002);
 insert into student values(3,'王五',24,1003);
 insert into student values(4,'赵六',23,1004);
 insert into student values(5,'⼩明',21,1001);
 insert into student values(6,'⼩红',26,1001);
 insert into student values(7,'⼩亮',27,1002);
 # 向学⽣表插⼊数据
 mysql> select * from class where cid=(select classid from student where sname='张三');
 +------+-------+
 | cid | cname |
 +------+-------+
 | 1001 | Java |
 +------+-------+
 1 row in set (0.00 sec)
 #查询张三同学所在班级的信息
 mysql> select * from class where cid>(select classid from student where sname='张三');
 +------+---------+
 | cid | cname |
 +------+---------+
 | 1002 | C++ |
 | 1003 | Python |
 | 1004 | PHP |
 | 1005 | Android |
 +------+---------+
 4 rows in set (0.03 sec)
 # 查询⽐张三同学所在班级编号还⼤的班级的信息2、exists 关键字的⼦查询

exists 关键字后⾯的参数可以是恣意⼀个⼦查询, 它不产⽣任何数据,只返回 true 或 false。⽽当返回值为 true 时外层查询才会执⾏。
相称于内层句⼦是⼀个判定句式。

 mysql> select * from class where exists (select * from student where sname='王五');
 +------+---------+
 | cid | cname |
 +------+---------+
 | 1001 | Java |
 | 1002 | C++ |
 | 1003 | Python |
 | 1004 | PHP |
 | 1005 | Android |
 +------+---------+
 5 rows in set (0.00 sec)
 # 假如王五同学在学⽣表中则从班级表查询所有班级信息四、MySQL 多表团结查询

1、交织毗连查询

交织毗连返回的效果是被毗连的两个表中全部数据⾏的笛卡尔积;
⽐如:聚集A={a,b},聚集B={0,1,2},则聚集A和B的笛卡尔积为 {(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)。以是,交织毗连也被称为笛卡尔毗连。
语法: select * from 表1 cross join 表2;

 mysql> select * from student cross join class;
 +-----+--------+------+---------+------+---------+
 | sid | sname | sage | classid | cid | cname |
 +-----+--------+------+---------+------+---------+
 | 1 | 张三 | 20 | 1001 | 1001 | Java |
 | 1 | 张三 | 20 | 1001 | 1002 | C++ |
 | 1 | 张三 | 20 | 1001 | 1003 | Python |
 | 1 | 张三 | 20 | 1001 | 1004 | PHP |
 | 1 | 张三 | 20 | 1001 | 1005 | Android |
 | 2 | 李四 | 21 | 1002 | 1001 | Java |
 | 2 | 李四 | 21 | 1002 | 1002 | C++ |
 | 2 | 李四 | 21 | 1002 | 1003 | Python |
 | 2 | 李四 | 21 | 1002 | 1004 | PHP |
 | 2 | 李四 | 21 | 1002 | 1005 | Android |
 | 3 | 王五 | 24 | 1003 | 1001 | Java |
 | 3 | 王五 | 24 | 1003 | 1002 | C++ |
 | 3 | 王五 | 24 | 1003 | 1003 | Python |
 | 3 | 王五 | 24 | 1003 | 1004 | PHP |
 | 3 | 王五 | 24 | 1003 | 1005 | Android |
 | 4 | 赵六 | 23 | 1004 | 1001 | Java |
 | 4 | 赵六 | 23 | 1004 | 1002 | C++ |
 | 4 | 赵六 | 23 | 1004 | 1003 | Python |
 | 4 | 赵六 | 23 | 1004 | 1004 | PHP |
 | 4 | 赵六 | 23 | 1004 | 1005 | Android |
 | 5 | ⼩明 | 21 | 1001 | 1001 | Java |
 | 5 | ⼩明 | 21 | 1001 | 1002 | C++ |
 | 5 | ⼩明 | 21 | 1001 | 1003 | Python |
 | 5 | ⼩明 | 21 | 1001 | 1004 | PHP |
 | 5 | ⼩明 | 21 | 1001 | 1005 | Android |
 | 6 | ⼩红 | 26 | 1001 | 1001 | Java |
 | 6 | ⼩红 | 26 | 1001 | 1002 | C++ |
 | 6 | ⼩红 | 26 | 1001 | 1003 | Python |
 | 6 | ⼩红 | 26 | 1001 | 1004 | PHP |
 | 6 | ⼩红 | 26 | 1001 | 1005 | Android |
 | 7 | ⼩亮 | 27 | 1002 | 1001 | Java |
 | 7 | ⼩亮 | 27 | 1002 | 1002 | C++ |
 | 7 | ⼩亮 | 27 | 1002 | 1003 | Python |
 | 7 | ⼩亮 | 27 | 1002 | 1004 | PHP |
 | 7 | ⼩亮 | 27 | 1002 | 1005 | Android |
 +-----+--------+------+---------+------+---------+
 35 rows in set (0.00 sec)
 #两个表交叉连接,class表的cid和student表的classid相乘2、多表团结查询

语法:select 查询字段1,查询字段2, ... from 表1 join 表2 join ... on 表1.关系字段=表2.关系字段=...;
join:团结
on:条件

 mysql> select sname,cname from student inner join class on student.classid=class.cid;
 +--------+--------+
 | sname | cname |
 +--------+--------+
 | 张三 | Java |
 | 李四 | C++ |
 | 王五 | Python |
 | 赵六 | PHP |
 | ⼩明 | Java |
 | ⼩红 | Java |
 | ⼩亮 | C++ |
 +--------+--------+
 7 rows in set (0.00 sec)
 # 查询学⽣姓名及其所学习的学科五、MySQL 授权

1、MySQL 根本权限

权限分析all设置 grant option 之外的全部权限(授权选项)alter答应使⽤ alter table(修改表的权限)create答应使⽤ create table(添加表的权限)create user答应使⽤ create user(添加⽤户权限)delete答应使⽤ delete(删除权限)index答应使⽤ index(索引权限)insert答应使⽤ insert(插⼊权限)select答应使⽤ select(选择权限)update答应使⽤ update(更新权限)drop答应使⽤ drop table(删除表权限)replication slave答应从主服务器中读取⼆进制⽇志⽂件show databases答应表现全部数据库2、权限语法

grant all on test.user
为 客 户机授权grant all on 库.* to ⽤户@客户机地点 identified by '密 码';all:表现全部权限,可更换为其他权限库.*:表现某个数 据库下全部数据表⽤户@客户机地点:表现盼望给予哪个⽤户权限,前⾯的⽤户是临时⾃建⽤户,当客户机登录时,⽤ 该⽤户登录'暗码':临时⾃建⽤户的暗码,也是临时⾃写的查 看 给 予 客 户 机 的 权 限show grants for ⽤户@客户机地点取 消 权 限revoke 权限列表 on 库.* from ⽤户@客户机地点;刷 新 权 限flush privileges;(重新加载权限表)删除 临 时用户drop user '⽤户名'@'客户机地点';客户机地点可以有以下表现情势:
%:表现全部地点
192.168.33.%:表现 33 ⽹段下全部主机,⼀般为你想为哪个⽹段授权,或为⾃⼰⽹段下的主机授权

 mysql> grant all on *.* to haha@'192.168.100.%' identified by '123456';
 # 为haha⽤户进⾏授权
 Query OK, 0 rows affected, 1 warning (0.00 sec)
 mysql> flush privileges; # 刷新权限
 Query OK, 0 rows affected (0.00 sec)
 mysql> show grants for haha@'192.168.100.%'; # 查看haha的权限
 +-------------------------------------------------------+
 | Grants for haha@192.168.100.% |
 +-------------------------------------------------------+
 | GRANT ALL PRIVILEGES ON *.* TO 'haha'@'192.168.100.%' |
 +-------------------------------------------------------+
 1 row in set (0.00 sec)
 mysql> drop user haha@'192.168.100.%'; # 删除⽤户
 Query OK, 0 rows affected (0.00 sec)
 mysql> show grants for haha@'192.168.100.%';
 ERROR 1141 (42000): There is no such grant defined for user 'haha' on host '192.168.100.%'六、MySQL 触发器

1、概念

触发器是⼀种特殊的存储过程,它在插⼊,删除或修改特定表中的数据时触发执⾏,它⽐数据库本身尺度的功能有更风雅和更复杂的数据控制能⼒。
1、比方在某⼀个时间触发什么事变
2、比方不答应股票代价的升幅⼀次高出%10
3、审计功能,某⼀个⼈登录会记录全部的使用
2、触发器语法

create trigger 触发器名称 触发的时机 触发的动作 on 表名 for each row 触发器状态
1、语法的红字为固定格式
2、触发器名称:⾃界说
3、触发的时机:before(之前) 或 after(之后),在执⾏动作之前照旧之后
4、触发的动作:指的引发触发步伐的语句范例(插⼊、更新、删除表或数据等)
5、each row:使用的每⼀⾏都会被监控
6、触发器状态:在触发的动作之前或之后做什么事变,⽐如当我删 了表 1 的某条数据后,⾃动清空表 2。
3、触发器创建的四要素

(1)监督地点:table(表)
(2)监督事故:insert(插⼊)、update(更新)、delete(删除) 等动作
(3)触发时间:before(之前)、after(之后)
(4)触发事故:在监督事故之前或之后,对当前表或其他表的插 ⼊、更新、删除等动作
4、触发器实例


 #查看数据库内的所有表
 mysql> show tables;
 +--------------+
 | Tables_in_yh |
 +--------------+
 | class       |
 | it           |
 | student     |
 +--------------+
 3 rows in set (0.00 sec)
 #创建触发器规则
 #命令⼤意:创建名为deltable的触发器,在执⾏每⼀条的删除class表命令之后,删除student表
 mysql> create trigger deltable after delete on class for each row delete from student;
 Query OK, 0 rows affected (0.00 sec)
 #查看触发器
 mysql> show triggers\G;
 *************************** 1. row ***************************
              Trigger: deltable
                Event: DELETE
                Table: class
            Statement: delete from student
              Timing: AFTER
              Created: 2023-09-26 20:46:24.53
              sql_mode:
 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_
 DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AU
 TO_CREATE_USER,NO_ENGINE_SUBSTITUTION
              Definer: root@localhost
 character_set_client: utf8
 collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
 1 row in set (0.00 sec)
 ERROR:
 No query specified
 #查看当前数据库下的所有数据表
 mysql> show tables;
 +--------------+
 | Tables_in_yh |
 +--------------+
 | class       |
 | it           |
 | student     |
 +--------------+
 3 rows in set (0.00 sec)
 #查看⼀下class表的内容,因为要⽤该表做示范
 mysql> select * from class;
 +------+---------+
 | cid | cname   |
 +------+---------+
 | 1001 | Java   |
 | 1002 | C++     |
 | 1003 | Python |
 | 1004 | PHP     |
 | 1005 | Android |
 +------+---------+
 5 rows in set (0.01 sec)
 #查看⼀下student表的内容,因为要⽤该表做示范
 mysql> select * from student;
 +-----+----------+------+---------+
 | sid | sname   | sage | classid |
 +-----+----------+------+---------+
 |   1 | mike     |   17 |    1001 |
 |   2 | john     |   18 |    1002 |
 |   3 | lili     |   19 |    1003 |
 |   4 | zhangsan |   20 |    1004 |
 |   5 | tom     |   21 |    1005 |
 +-----+----------+------+---------+
 5 rows in set (0.00 sec)
 #删除class表中cid为1005的整⾏数据,也就是执⾏之前设置的触发动作
 mysql> delete from class where cid=1005;
 Query OK, 1 row affected (0.00 sec)
 #因为触发器执⾏,所以student表的内容在class表的删除动作后被清空
 mysql> select * from student;
 Empty set (0.00 sec)
 #删除触发器
 mysql> drop trigger deltable;
 Query OK, 0 rows affected (0.00 sec)七、MySQL 根本优化使用

1、忘记 MySQL 暗码


 # vim /etc/my.cnf
 
 skip-name-resolve #添加该⾏,表示本机跳过MySQL密码验证
 skip-grant-tables #添加该⾏,表示登录时,忽略所有的⽤户认证信息,包括⽤户名、密码和权限。
 :wq
 # systemctl restart mysqld.service
 # mysql #免密时,直接使⽤MySQL命令登录
 mysql> use mysql;
 mysql> update user set authentication_string=password('123') where user="root";
 Query OK, 1 row affected, 1 warning (0.00 sec)
 Rows matched: 1 Changed: 1 Warnings: 1
 #更新MySQL⽤户“root”的密码为“123”等。如果⽤户名不叫“root”,那么最后的等号后⾯写你想要改的⽤户名
 mysql> select Host,user,authentication_string from user;
 #这条命令意为:算法对账户明⽂密码加密后的字符串,不⽤看,看不懂,没什么⽤。
 mysql> flush privileges;
 Query OK, 0 rows affected (0.00 sec)
 mysql> exit
 Bye
 # mysql -uroot -p1232、MySQL 存储引擎

检察数据库表使⽤的存储引擎show table status where name='表 名';创建表并指定存储引擎create table 表名(表头名) engine=存储引擎;修改已经存在表的存储 引擎alter table 表名 engine=存储引擎;修改 MySQL 服务的默 认存储引擎https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMTUyYWEzZjZkNTA0NGE1ZTk3ODJmYTE4ZTI0YTJmZTUucG5n(1)检察数据库使⽤的存储引擎


 mysql> use yh; #查看存储引擎时,必须要切换到某个数据库
 Database changed
 mysql> show tables; #查看当前yh数据库下的所有数据表
 +--------------+
 | Tables_in_yh |
 +--------------+
 | class       |
 | it           |
 | student     |
 +--------------+
 3 rows in set (0.00 sec)
 mysql> show table status \G; #查看所有数据表的存储引擎
 *************************** 1. row ***************************
            Name: class
          Engine: InnoDB #存储引擎,常⽤的还有MyISAM
    Create_time: 2023-09-25 09:27:28 #数据表创建时间
    Update_time: 2023-09-26 20:57:20 #数据表更新时间
 *************************** 2. row ***************************
            Name: it
          Engine: InnoDB #存储引擎
    Create_time: 2023-09-25 17:55:38 #数据表创建时间
 *************************** 3. row ***************************
            Name: student
            Engine: InnoDB
    Create_time: 2023-09-25 10:16:48 #数据表创建时间
    Update_time: 2023-09-26 20:57:20
 mysql> show table status where name='class' \G;
 #也可查看单个数据表的存储引擎
 *************************** 1. row ***************************
            Name: class
            Engine: InnoDB #存储引擎
        Version: 10
      Row_format: Dynamic
            Rows: 4
  Avg_row_length: 4096
    Data_length: 16384
 Max_data_length: 0
    Index_length: 0
      Data_free: 0
  Auto_increment: NULL
    Create_time: 2023-09-25 09:27:28 #创建时间
    Update_time: 2023-09-26 20:57:20 #更新时间
      Check_time: NULL
      Collation: latin1_swedish_ci
        Checksum: NULL
  Create_options:
        Comment:
 1 row in set (0.00 sec)
 ERROR:
 No query specified(2)创建表并指定存储引擎


 mysql> create table haha(id int) engine=MyISAM;
 #创建表haha,并添加数字形式的表头id,指定haha表的存储引擎为MyISAM
 Query OK, 0 rows affected (0.00 sec)
 mysql> show table status where name='haha' \G;
 #查看haha表的存储引擎及其他状态信息
 *************************** 1. row ***************************
            Name: haha
          Engine: MyISAM #存储引擎(3)修改已存在数据表的存储引擎


 mysql> alter table haha engine=InnoDB; #修改已存在的数据表haha的存储引擎
 Query OK, 0 rows affected (0.01 sec)
 Records: 0 Duplicates: 0 Warnings: 0
 mysql> show table status where name='haha' \G;
 #查看haha表状态及存储引擎
 *************************** 1. row ***************************
            Name: haha
          Engine: InnoDB #存储引擎(4)修改 MySQL 服务的默认存储引擎


 # vim /etc/my.cnf
 
 default-storage-engine=InnoDB   #添加此⾏,当以后再创建表时,存储引擎将改为InnoDB训练


 远程连接数据库的要素
 1、username
 2、password
 3、urlmysql ip|域名 数据库名称端口
 别名
 select id as 编号,name as 姓名,gender as 性别 from student;
 数据分析的基础
 1、排序
 max
 min
 2、汇总
 count
 sum
 avg
 3、数学进制
 二进制
 八进制
 十进制
 十六进制
 select max(price) from product;
 select * from student order by gender;
 select * from student order by gender desc;
 select * from student order by gender asc;
 当我们对数据进行聚合查询后,不能使用where条件,如果要添加条件就使用having
 select gender as 性别,count(gender) as 人数 from student group by gender;
 create table product(id int primary key auto_increment,name varchar(45) not null,price float not null,qty int not null);
 desc product;
 insert into product (name,price,qty) values("香蕉",8.5,200),("苹果",12.5,400),("菠萝",12.4,70),("哈密瓜",18.3,400);
 select * from product;
 select * from product order by qty;
 select * from product order by price;
 select * from (select * from product order by qty) as a order by a.price;
 select max(price) from product;
 select min(price) from product;
 select sum(price) from product;
 select avg(price) from product;
 select *,price*qty as tt from product;
 select sum(tt) from (select *,price*qty as tt from product) as a;
 select year('1985-7-6') as birth;
 select month('1985-7-6') as mon;
 select now();
 select year(now());
 select second(now());
 insert into product (name,price,qty)values(now(),7.8,90);
 select * from product;
 create table p(createtime defult now())
 select trim("a b");
 select floor(3.14);
 select floor(-3.14);
 select ceiling(9.8);
 select ceiling(9.3);
 select round(9.5);
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
页: [1]
查看完整版本: 培训第二十三天(mysql主从脚本与mysql详细语句先容)