MySql基础实战案例
一、搭建mysql服务
1.1安装mysql
//配置mysql的yum源
[root@server ~]# wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
[root@server ~]# rpm -Uvh mysql57-community-release-el7-11.noarch.rpm
[root@server ~]# yum module disable mysql
//安装mysql5.7版本
[root@server ~]# dnf -y install mysql-community-server mysql-community-client mysql-community-common mysql-community-devel --nogpgcheck
1.2配置mysql
//启动mysql服务并设置为开机自启
[root@server ~]# systemctl restart mysqld.service
[root@server ~]# systemctl enable mysqld
[root@server ~]# systemctl status mysqld.service
//查看mysql的端口是否启用
[root@server ~]# ss -anltup | grep mysql
tcp LISTEN 0 80 *:3306 *:* users:(("mysqld",pid=2850,fd=21))
//在日志文件找出mysql初始密码
[root@server ~]# grep "password" /var/log/mysqld.log
//使用获取到的临时密码登录mysql
[root@server ~]# mysql -uroot -p
Enter password: //此处输入密码
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.38 MySQL Community Server (GPL)
Copyright (c) 2000, 2022, 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登录密码
mysql> set global validate_password_policy=0; //判断修改密码时候新密码是否符合当前的策略,不满足报错,不让修改。
Query OK, 0 rows affected (0.00 sec) //0是简单密码策略
mysql> set global validate_password_length=1; //设置密码长度的最小值
Query OK, 0 rows affected (0.00 sec)
mysql> alter user 'root'@'localhost' identified by 'yefeng123!'; //修改root用户的密码
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
[root@server ~]#
//为避免mysql自动升级,这里需要卸载最开始安装的yum源
[root@server ~]# rpm -e mysql57-community-release
[root@server ~]# rpm -e mysql57-community-release //删两次是为了验证是否删除成功
error: package mysql57-community-release is not installed
二、DML操作
DML操作包括增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT),均属针对表的操作。
1.1insert语句
mysql> insert yf(id,name,age) values(1,'zhangsan',5),(2,'lisi',6),(3,'nigger',6),(4,'yefu',8),(5,'liyang',7);
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from yf;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhangsan | 5 |
| 2 | yongshao | 6 |
| 3 | wangwu | 6 |
| 4 | yefu | 8 |
| 5 | liyang | 7 |
+----+-----------+------+
5 rows in set (0.00 sec)
1.2select语句
字段column表示法
表示符 | 代表什么 |
---|---|
* | 所有字段 |
as | 字段别名,如col1 AS alias1当表名很长时用别名代替 |
条件判断语句where
操作类型 | 常用操作符 |
---|---|
操作符 | >,<,>=,<=,=,!= BETWEEN column# AND column# LIKE:模糊匹配 RLIKE:基于正则表达式进行模式匹配IS NOT NULL:非空IS NULL:空 |
条件逻辑操作 | AND OR NOT |
//查询所有字段
mysql> select * from yf;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhanglang | 5 |
| 2 | yongshao | 6 |
| 3 | wangwu | 6 |
| 4 | yefu | 8 |
| 5 | liyang | 7 |
+----+-----------+------+
5 rows in set (0.00 sec)
//查询名字
mysql> select name from yf;
+-----------+
| name |
+-----------+
| zhanglang |
| yongshao |
| wangwu |
| yefu |
| liyang |
+-----------+
5 rows in set (0.00 sec)
//以id升序排列(一般都是以升序排列的)
mysql> select * from yf order by id;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhanglang | 5 |
| 2 | yongshao | 6 |
| 3 | wangwu | 6 |
| 4 | yefu | 8 |
| 5 | liyang | 7 |
+----+-----------+------+
5 rows in set (0.00 sec)
//以id降序排序
mysql> select * from yf order by id desc;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 5 | liyang | 7 |
| 4 | yefu | 8 |
| 3 | wangwu | 6 |
| 2 | yongshao | 6 |
| 1 | zhanglang | 5 |
+----+-----------+------+
5 rows in set (0.00 sec)
//升序排序取前两个
mysql> select * from yf order by id limit 2;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhanglang | 5 |
| 2 | yongshao | 6 |
+----+-----------+------+
2 rows in set (0.00 sec)
//以升序排序跳过第一个取下面两个
mysql> select * from yf order by id limit 1,2;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 2 | yongshao | 6 |
| 3 | wangwu | 6 |
+----+----------+------+
2 rows in set (0.00 sec)
//查询年龄大于,小于,大于等于,小于等于
mysql> select * from yf where age > 4;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhanglang | 5 |
| 2 | yongshao | 6 |
| 3 | wangwu | 6 |
| 4 | yefu | 8 |
| 5 | liyang | 7 |
+----+-----------+------+
5 rows in set (0.00 sec)
mysql> select * from yf where age >=5;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhanglang | 5 |
| 2 | yongshao | 6 |
| 3 | wangwu | 6 |
| 4 | yefu | 8 |
| 5 | liyang | 7 |
+----+-----------+------+
5 rows in set (0.00 sec)
mysql> select * from yf where age < 6;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhanglang | 5 |
+----+-----------+------+
mysql> select * from yf where age <= 6;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhanglang | 5 |
| 2 | yongshao | 6 |
| 3 | wangwu | 6 |
+----+-----------+------+
3 rows in set (0.00 sec)
//查找年龄等于5和名字为zhanglang
mysql> select * from yf where age =5 and name = 'zhanglang';
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhanglang | 5 |
+----+-----------+------+
1 row in set (0.00 sec)
//查询年龄在5和7之前
mysql> select * from yf where age between 5 and 7;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhanglang | 5 |
| 2 | yongshao | 6 |
| 3 | wangwu | 6 |
| 5 | liyang | 7 |
+----+-----------+------+
4 rows in set (0.00 sec)
//查找年龄不为空的内容
mysql> select * from yf where age is not null;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhanglang | 5 |
| 2 | yongshao | 6 |
| 3 | wangwu | 6 |
| 4 | yefu | 8 |
| 5 | liyang | 7 |
+----+-----------+------+
5 rows in set (0.00 sec)
//查找年龄为空的内容
mysql> select * from yf where age is null;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 6 | wangba | NULL |
+----+-------+------+
1 row in set (0.00 sec)
1.3update语句
mysql> select * from yf;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhanglang | 5 |
| 2 | yongshao | 6 |
| 3 | nigger | 6 |
| 4 | jilao | 8 |
| 5 | jiaopi | 7 |
| 6 | wangba | NULL |
+----+-----------+------+
6 rows in set (0.00 sec)
mysql> update yf set age = 20 where name = 'wangba';
Query OK, 1 row affected (0.00 sec) //将wangba年龄修改为20
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from yf;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhanglang | 5 |
| 2 | yongshao | 6 |
| 3 | nigger | 6 |
| 4 | jilao | 8 |
| 5 | jiaopi | 7 |
| 6 | wangba | 20 |
+----+-----------+------+
6 rows in set (0.00 sec)
1.4delete语句
mysql> select * from yf;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhangsan | 5 |
| 2 | lisi | 6 |
| 3 | wangwu | 6 |
| 4 | yefu | 8 |
| 5 | liyang | 7 |
| 6 | wangba | 20 |
+----+-----------+------+
6 rows in set (0.00 sec)
mysql> delete from yf where id = 6; //将id等于6的字段删除
Query OK, 1 row affected (0.00 sec)
mysql> select * from yf;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhangsan | 5 |
| 2 | lisi | 6 |
| 3 | wangwu | 6 |
| 4 | yefu | 8 |
| 5 | liyang | 7 |
+----+-----------+------+
5 rows in set (0.00 sec)
//删除整张表的内容
mysql> delete from yf;
Query OK, 5 rows affected (0.01 sec)
mysql> select * from yf;
Empty set (0.00 sec)
mysql> desc yf;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(10) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
1.5truncate语句
truncate与delete的区别:
语句类型 | 特点 |
---|---|
delete | DELETE删除表内容时仅删除内容,但会保留表结构DELETE 语句每次删除一行,并在事务日志中为所删除的 每行记录一项可以通过回滚事务日志恢 复数据非常占用空间 |
truncate | 删除表中所有数据,且无法恢复表结构、约束和索引等保持不变, 新添加的行计数值重置为初始值执行速度比DELETE快, 且使用的系统和事务日志资源少通过释放存储表数据所用的数据页来删除数据, 并且只在事务日志中记录页的释放对于有外键约束引用的表, 不能使用TRUNCATE TABLE删除数据不能用于加入了索引视图的表 |
mysql> select * from yf;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | zhangsan | 5 |
| 2 | lisi | 6 |
| 3 | wangwu | 6 |
| 4 | yefu | 8 |
| 5 | liyang | 7 |
+----+-----------+------+
5 rows in set (0.00 sec)
mysql> truncate yf;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from yf;
Empty set (0.00 sec)
mysql> desc yf;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(10) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
三、DCL操作
权限类型(priv_type)
权限类型 | 代表什么? |
---|---|
ALL | 所有权限 |
SELECT | 读取内容的权限 |
INSERT | 插入内容的权限 |
UPDATE | 更新内容的权限 |
DELETE | 删除内容的权限 |
指定要操作的对象db_name.table_name
表示方式 | 意义 |
---|---|
. | 所有库的所有表 |
db_name | 指定库的所有表 |
db_name.table_name | 指定库的指定表 |
2.1创建授权grant
mysql> grant all on *.* to 'joy'@'192.168.92.129' identified by '123456'; //授权joy用户在192.168.159.101上远程登陆访问所有数据库所有表权限
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all on *.* to 'tom'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec) //授予tom用户可以在任何位置远程登陆访问所有数据库和表
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
2.2查看授权
mysql> show grants; //查看当前用户的权限信息
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> show grants for 'joy'@'192.168.92.129'; //查看joy的权限
+--------------------------------------------------------+
| Grants for joy@192.168.92.129 |
+--------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'joy'@'192.168.92.129' |
+--------------------------------------------------------+
1 row in set (0.00 sec)
2.3取消授权revoke
mysql> revoke all on *.* from 'joy'@'192.168.92.129'
-> ;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
四、实战案例
4.1.创建库与表
题目:创建一个以你名字为名的数据库,并创建一张表student,该表包含三个字段(id,name,age),表结构如下:
mysql> desc student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
解题:
mysql> create database yefeng;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| yefeng |
+--------------------+
5 rows in set (0.00 sec)
mysql> use yefeng;
Database changed
mysql> create table student(id int(11) primary key auto_increment,name varchar(100) not null,age tinyint(4));
Query OK, 0 rows affected (0.00 sec)
mysql> desc student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
4.2.查看表内容
题目:查看下该新建的表有无内容(用select语句)
解答:
mysql> select * from student;
Empty set (0.00 sec)
4.3.键入数据
题目:往新建的student表中插入数据(用insert语句),结果应如下所示:
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 1 | tom | 20 |
| 2 | jerry | 23 |
| 3 | wangqing | 25 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
| 6 | zhangshan | 20 |
| 7 | lisi | NULL |
| 8 | chenshuo | 10 |
| 9 | wangwu | 3 |
| 10 | qiuyi | 15 |
| 11 | qiuxiaotian | 20 |
+----+-------------+------+
解答:
mysql> insert into student (name,age)
-> values('tom',20),
-> ('jerry',23),('wangqing',25),('sean',28),
-> ('zhangshan',26),('zhangsan',20),('lisi',null),
-> ('chenshuo',10),('wangwu',3),('qiuyi',15),('qiuxiaotian',20);
Query OK, 11 rows affected (0.00 sec)
Records: 11 Duplicates: 0 Warnings: 0
mysql> select * from student;
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 1 | tom | 20 |
| 2 | jerry | 23 |
| 3 | wangqing | 25 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
| 6 | zhangsan | 20 |
| 7 | lisi | NULL |
| 8 | chenshuo | 10 |
| 9 | wangwu | 3 |
| 10 | qiuyi | 15 |
| 11 | qiuxiaotian | 20 |
+----+-------------+------+
11 rows in set (0.01 sec)
4.4.修改表数据
题目:修改lisi的年龄为50
解答:
mysql> update student set age = 50 where name = 'lisi';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from student
-> where name = 'lisi';
+----+------+------+
| id | name | age |
+----+------+------+
| 7 | lisi | 50 |
+----+------+------+
1 row in set (0.00 sec)
4.5.以降序排序
题目:以age字段降序排序
解答:
mysql> select * from student
-> order by age desc;
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 7 | lisi | 50 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
| 3 | wangqing | 25 |
| 2 | jerry | 23 |
| 1 | tom | 20 |
| 6 | zhangsan | 20 |
| 11 | qiuxiaotian | 20 |
| 10 | qiuyi | 15 |
| 8 | chenshuo | 10 |
| 9 | wangwu | 3 |
+----+-------------+------+
11 rows in set (0.00 sec)
4.6.以升序查询表内容并跳过前几位
题目:查询student表中年龄最小的3位同学跳过前2位
解答:
mysql> select * from student
-> order by age
-> limit 2,3;
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 10 | qiuyi | 15 |
| 1 | tom | 20 |
| 11 | qiuxiaotian | 20 |
+----+-------------+------+
3 rows in set (0.00 sec)
//下面的内容是为了印证上面的结果
mysql> select * from student order by age;
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 9 | wangwu | 3 |
| 8 | chenshuo | 10 |
| 10 | qiuyi | 15 |
| 1 | tom | 20 |
| 6 | zhangsan | 20 |
| 11 | qiuxiaotian | 20 |
| 2 | jerry | 23 |
| 3 | wangqing | 25 |
| 5 | zhangshan | 26 |
| 4 | sean | 28 |
| 7 | lisi | 50 |
+----+-------------+------+
11 rows in set (0.00 sec)
4.7.以降序查询表内容的前几位
题目:查询student表中年龄最大的4位同学
解答:
mysql> select * from student
-> order by age desc
-> limit 4;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 7 | lisi | 50 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
| 3 | wangqing | 25 |
+----+-----------+------+
4 rows in set (0.00 sec)
//下面的内容是为了印证上面的结果
mysql> select * from student order by age desc;
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 7 | lisi | 50 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
| 3 | wangqing | 25 |
| 2 | jerry | 23 |
| 1 | tom | 20 |
| 6 | zhangsan | 20 |
| 11 | qiuxiaotian | 20 |
| 10 | qiuyi | 15 |
| 8 | chenshuo | 10 |
| 9 | wangwu | 3 |
+----+-------------+------+
11 rows in set (0.00 sec)
4.8.以条件查询表内容
题目:查询student表中名字叫zhangshan的记录
解答:
mysql> select * from student
-> where name = 'zhangshan';
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 5 | zhangshan | 26 |
+----+-----------+------+
1 row in set (0.01 sec)
4.9.满足多条件查询表内容
题目:查询student表中名字叫zhangshan且年龄大于20岁的记录
解答:
mysql> select * from student
-> where name = 'zhangshan' and age > 20;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 5 | zhangshan | 26 |
+----+-----------+------+
1 row in set (0.00 sec)
4.10.以范围区间的条件查询表内容
题目:查询student表中年龄在23到30之间的记录
解答:
//第一种解法
mysql> select * from student
-> where age
-> between 23 and 30;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 2 | jerry | 23 |
| 3 | wangqing | 25 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
+----+-----------+------+
4 rows in set (0.00 sec)
//第二种解法
mysql> select * from student
-> where age >=23 and age <= 30;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 2 | jerry | 23 |
| 3 | wangqing | 25 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
+----+-----------+------+
4 rows in set (0.00 sec)
4.11.修改表数据
题目:修改wangwu的年龄为100
解答:
mysql> update student
-> set age = 100
-> where name = 'wangwu';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from student
-> where name = 'wangwu';
+----+--------+------+
| id | name | age |
+----+--------+------+
| 9 | wangwu | 100 |
+----+--------+------+
1 row in set (0.00 sec)
4.12.以条件删除表数据
题目:删除student中名字叫zhangshan且年龄小于等于20的记录
解答:
mysql> delete from student
-> where name = 'zhangshan' and age >= 20;
Query OK, 1 row affected (0.00 sec)
//验证是否被删除
mysql> select * from student;
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 1 | tom | 20 |
| 2 | jerry | 23 |
| 3 | wangqing | 25 |
| 4 | sean | 28 |
| 6 | zhangsan | 20 |
| 7 | lisi | 50 |
| 8 | chenshuo | 10 |
| 9 | wangwu | 100 |
| 10 | qiuyi | 15 |
| 11 | qiuxiaotian | 20 |
+----+-------------+------+
10 rows in set (0.00 sec)
五、使用SQLyog远程登录
1.授权
//先在MySQL服务所在主机上授权,此IP是我windows宿主机的地址
mysql> grant all on *.* to 'root'@'192.168.159.1' identified by 'yefeng123!';
Query OK, 0 rows affected, 1 warning (0.00 sec)
//刷新权限表
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
2.授权时报错解决方案
//这段报错信息是“您的密码不符合当前策略要求”
mysql> grant all on *.* to 'yf'@'192.168.159.1' identified by 'yefeng123!';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
//查看mysql密码规则,发现要求密码强度等级较高,需要调整为简单密码策略
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 8 | //默认密码长度最少为8
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM | //默认密码等级为MEDIUM(中等)
| validate_password_special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.00 sec)
//通过这条命令修改为LOW(低)
mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.00 sec)
//设置密码长度最少为1
mysql> set global validate_password_length=1;
Query OK, 0 rows affected (0.00 sec)
//刷新权限表,让配置立即生效
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)