#授权 ,默认情况下mysql和mariadb都是不允许root用户远程连接登录的。
# grant 操作(增删改查,all) on 库名.表名 to 用户名@'%' identified by '密码';
grant all on *.* to root@'192.168.31.%' identified by 'aini';
grant all on wordpress.* to wordpress@'192.168.61.%' identified by '123456';
grant all on wordpress.t1 to jaden@'192.168.61.%' identified by '123'; #jaden用户只能对menu表进行操作
# 网站代码中连接数据库的时候使用的是哪个用户,那个用户有什么权限,那么网站代码就能对数据库做什么操作。
## 查看某个用户有哪些权限
show grants for root@'%';
# 单独创建用户
create user wang@'%' identified by '123';
# 单独创建的用户是没有任何权限的,只能登录,需要授权
grant all on wordpress.* to wang@'%';
# 上面两条就等于我们前面授权加创建用户的一条指令。
# 删除用户
drop user wang@'%';
# 查看用户的权限
show grants for jaden@'192.168.61.%';
# 回收权限: 注意:只有在本机登录的root用户才有这个能力
revoke select on wordpress.t1 from jaden@'192.168.61.%';
show grants for jaden@'192.168.61.%';
4-3 登录修改密码
sql复制代码
#使用普通用户登录
mysql -u wordpress -p123456 -h 10.0.0.7
#默认的数据文件存储位置是
/var/lib/mysql/
#/root/.mysql_history 记录了我们做的历史sql指令
# 修改用户密码
#安全初始化,可以修改root用户的密码:mysql_secure_installation
格式:mysql> set password for 用户名@localhost = password('新密码');
例子:mysql> set password for root@localhost = password('123');
# 查询当前是在哪个库里面
MariaDB [mysql]> select database();
#查看表结构
desc songs;
+---------+--------------+------+----
#切换库
use linux;
#创建表 #每个web项目其实都会创建很多个表来存储不同的数据
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
示例:
mysql> create table jaden(
-> id int,
-> name varchar(50),
-> age int(3)
-> );
#查看一下mysql帮我们创建表的时候的详细指令
show create table jaden;
#创建库和创建表的时候还可以指定字符集编码,默认字符集是Latin。
DEFAULT CHARACTER SET utf8mb4
create table jaden(id int, name varchar(50)) ENGINE=MyISAM DEFAULT CHARSET=utf8;
# ENGINE=MyISAM这是指定存储引擎,这个后面说。
#往表里面插入数据
insert into jaden(id,name,age) value(1,'xx',18); # 插入单条数据
insert into jaden(id,name,age) values(2,'xx2',15),(3,'xx3',19); #插入多条数据
#创建只有name列的表t1;
create table t1(name char(6));
#查看表结构
desc t1;
#往表t1插入数据
insert t1 value('zhang');
insert t1 value('li');
#查询t1表中所有数据
select * from t1;
#指定字符集的创表语句
create table t2(name char(6),age int(3)) default charset=utf8;
#往表t2插入数据
insert t2 value('张三',20);
insert t2 value('李四',60);
#创建表t4
create table t4(name char(6),age int(3) default 0 ) default charset=utf8;
#指定列插入数据
insert t4(name) values('张三'),('李四');
#查询结果
mysql> select * from t4;
+--------+------+
| name | age |
+--------+------+
| 张三 | 0 |
| 李四 | 0 |
+--------+------+
2 rows in set (0.00 sec)
##修改表
#修改字段的长度
alter table s2 modify name char(10);
#查看创表语句
show create table s2;
#增加字段
alter table s2 add age int(3);
#删除字段
alter table s2 drop age;
#ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件...] FIRST; #添加这个字段的时候,把它放到第一个字段位置去。
#ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件...] AFTER 字段名;#after是放到后的这个字段的后面去了,我们通过一个first和一个after就可以将新添加的字段放到表的任意字段位置了。
# 修改表的字符集
alter table 表名 charset=utf8mb4;
#使用where条件删除单条数据
delete from t5 where name='zhangsan';
#删除所有数据
delete from t5;
#单条件修改:
update t5 set password='123' where name='wangwu';
#单条件修改多列:
update t5 set password='123',name='xxx' where name='wangwu';
#多条件修改
update t5 set password='123' where name='wangwu' and id=1;
update t5 set password='123' where name='wangwu' or id=1;
#修改所有数据
update t5 set password='123456';
4-10 MySQL查询数据
sql复制代码
#sql查询
## city有多少个中国的城市?
select * from city where CountryCode='CHN';
## 查询city表中,山西省的城市名?
select * from city where district='shanxi';
## 查询city表中,山西省和河北省的城市名?
select * from city where district='shanxi' or district='hebei' ;
## 查询city表中,山西省和河北省的城市中人口大于100w?
select * from city where (district='shanxi' or district='hebei') and Population >1000000 ;
## 查询city表中,要求只显示城市名和人口数量,山西省和河北省的城市名按人口数量排序,升序?
select Name,Population from city where district='shanxi' or district='hebei'order by Population ;
## 查询city表中,要求只显示城市名和人口数量,山西省和河北省的城市名按人口数量排序,降序?
select Name,Population from city where district='shanxi' or district='hebei'order by Population desc ;
## 查询city表中,要求只显示城市名和人口数量,山西省和河北省的城市名按人口数量前5名;
select Name,Population from city where district='shanxi' or district='hebei'order by Population desc limit 5;
## 查询city表中,要求只显示城市名和人口数量,山西省和河北省的城市名按人口数量第2名和第3名;
select Name,Population from city where district='shanxi' or district='hebei'order by Population desc limit 1,2;
## 查询city表中,所有中国省份中带an的城市
select * from city where countrycode='chn' and district like '%an%' ;
## 查询city表中,所有中国的城市人口在89000和89999之间的城市
select * from city where countrycode='chn' and Population between 89000 and 89999 ;
## 查询city表中,要求只显示城市名和人口数量,查询CHN人口最多的前5个城市?
## 查询city表中,要求只显示城市名和人口数量,查询CHN人口最少的前5个城市?
## 查询中国的城市数量?
select count(name) as 中国城市总数 from city where countrycode='CHN';
## 查询世界的国家数量?
select count(name) from country;
## 查询中国的总人口?
select sum(population) from city where countrycode='chn';
## 把多行合并成一行
select group_concat(name) from city where countrycode='chn' and district='hebei';
## 把多列合并成一列
select concat(Name,"#",CountryCode,"#",District) from city where countrycode='chn' and district='hebei' ;
4-11 MySQL 索引
sql复制代码
#增加主键索引(要求结果唯一)
alter table t100w add PRIMARY KEY(id);
#创建普通索引
alter table t100w add index num(num);
#创建联合索引
alter table t100w add index lianhe(k1,k2);
#查看索引
show index from t100w;
#删除普通索引
alter table t100w drop index lianhe;
#删除主键索引
alter table t100w drop PRIMARY key;
#创建表的时候,指定索引
create table zhu2(id int(8) primary key AUTO_INCREMENT ,name char(10),passwd char(10));
4-12 MySQL Union
sql复制代码
#合并两个select查询结果
CREATE TABLE `c1` (
`ID` int NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `c2` (
`ID` int NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into c1(ID,Name,District,Population) select ID,Name,District,Population
from city where CountryCode='CHN' and District='Hebei';
insert into c2(ID,Name,District,Population) select ID,Name,District,Population
from city where CountryCode='CHN' and District='Henan';
select * from c1 union select * from c2 order by Population;
#sql注入中经常会使用的
select * from c1 union select 1,2,3,user();
#b适用于mariadb 10.6
1.修改配置文件
vim /etc/my.cnf.d/server.cnf
[mysqld]
skip-grant-tables
2.启动mariadb
systemctl start mariadb
3.空密码 登录数据库并执行修改密码
use mysql;
update user set password=password('123') where user='root' and host='localhost';
flush privileges;
4.删除配置文件中前面增加的skip-grant-tables
5.重启启动mariadb
systemctl restart mariadb
6.使用新密码验证
mysql -uroot -p123