云计算实战系列十六(SQL II)
1.3 MySQL数据操作DML
在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括使用INSERT实现数据
的插入、DELETE实现数据的删除以及UPDATE实现数据的更新。
更新数据 insert
更新数据 update
删除数据 delete一、插入数据INSERT
1. 插入完整数据(顺序插入)语法一:INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES (值1,值2,值3…值n);语法二:INSERT INTO 表名 VALUES (值1,值2,值3…值n);2. 指定字段插入数据语法:INSERT INTO 表名(字段2,字段3…) VALUES (值2,值3…);3. 插入多条记录语法:INSERT INTO 表名 VALUES(值1,值2,值3…值n),(值1,值2,值3…值n),(值1,值2,值3…值n);4. 插入查询结果语法:INSERT INTO 表1(字段1,字段2,字段3…字段n) SELECT (字段1,字段2,字段3…字段n) FROM 表2WHERE …;例子:
mysql> create table student7(id int,name varchar(20),sex enum('m','FROM'),age int(2));
mysql> desc student7;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| sex | enum('m','FROM') | YES | | NULL | |
| age | int(2) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)mysql> insert into student7 values(1,'jack','m',20); \\顺序插入数据
mysql> insert into student7(name,age) values('bob',21); \\指定字段插入数据
mysql> insert into student7 values(6,'jex','m',21),(7,'bob1','FROM',22); \\插入多条记录插入查询结果:
mysql> create table student_his(id int,name varchar(20),sex enum('m','FROM'),age int(2));
mysql> insert into student_his SELECT * from student7 WHERE name = 'bob'; \\插入查询结果
mysql> insert into student_his SELECT * from student7 WHERE age > 17; \\插入符合条件的二、更新数据UPDATE
语法:UPDATE 表名 SET 字段1=值1,字段2=值2 WHERE CONDITION;示例:
mysql> update student7 set id=8; #修改全部
mysql> SELECT * from student7;
+------+------+------+------+
| id | name | sex | age |
+------+------+------+------+
| 8 | jex | m | 21 |
| 8 | bob1 | FROM | 22 |
+------+------+------+------+
2 rows in set (0.00 sec)mysql> update student7 set id=9 WHERE name="bob1"; 指定条件
mysql> SELECT * from student7;
+------+------+------+------+
| id | name | sex | age |
+------+------+------+------+
| 8 | jex | m | 21 |
| 9 | bob1 | FROM | 22 |
+------+------+------+------+
2 rows in set (0.00 sec)mysql> update student7 set id=10,name="newrain" WHERE name="bob1";
mysql> SELECT * from student7;
+------+----------+------+------+
| id | name | sex | age |
+------+----------+------+------+
| 8 | jex | m | 21 |
| 10 | newrain | FROM | 22 |
+------+----------+------+------+
2 rows in set (0.01 sec)三、删除数据DELETE
语法:DELETE FROM 表名 WHERE CONITION;
示例:DELETE FROM mysql.user WHERE authentication_string=’’;delete from 表名 WHERE 条件;
mysql> delete from student7 WHERE name="jack";delete from 表名; //删除表的全部数据
mysql> delete from student7;
Query OK, 3 rows affected (0.00 sec)mysql> SELECT * from student7;
Empty set (0.01 sec)
作业: 更新MySQL root用户密码NewRain!@#
注:表的修改练习作为课下作业
二、MySQL数据库的查询操作
MySQL数据库查询
2.1、MySQL单表查询
准备测试表:company.employee5
| 雇员编号 | id | int | | -------- | --------------- | ------------ | | 雇员姓名 | name | varchar(30) | | 雇员性别 | sex | enum | | 雇用时期 | hire_date | date | | 雇员职位 | post | varchar(50) | | 职位描述 | job_description | varchar(100) | | 雇员薪水 | salary | double(15,2) | | 办公室 | office | int | | 部门编号 | dep_id | int |
mysql> CREATE TABLE company.employee5(id int primary key AUTO_INCREMENT not null,name varchar(30) not null,sex enum('male','female') default 'male' not null,hire_date date not null,post varchar(50) not null,job_description varchar(100),salary double(15,2) not null,office int,dep_id int);mysql> insert into company.employee5(name,sex,hire_date,post,job_description,salary,office,dep_id) values ('jack','male','20180202','instructor','teach',5000,501,100),('tom','male','20180203','instructor','teach',5500,501,100),('robin','male','20180202','instructor','teach',8000,501,100),('alice','female','20180202','instructor','teach',7200,501,100),('tianyun','male','20180202','hr','hrcc',600,502,101),('harry','male','20180202','hr',NULL,6000,502,101),('emma','female','20180206','sale','salecc',20000,503,102),('christine','female','20180205','sale','salecc',2200,503,102),('zhuzhu','male','20180205','sale',NULL,2200,503,102),('gougou','male','20180205','sale','',2200,503,102);mysql> SELECT 字段名称,字段名称2 from 表名 条件mysql> SELECT column_name,column_2 from table WHERE ...简单查询:
mysql> SELECT * from t3;
mysql> SELECT name, salary, dep_id from employee5;避免重复DISTINCTSELECT post FROM employee5;SELECT DISTINCT post FROM employee5; 通过四则运算查询运算:mysql>SELECT 437.4384/5;mysql>SELECT 5>3;SELECT name, salary, salary*14 FROM employee5;SELECT name, salary, salary*14 AS Annual_salary FROM employee5;SELECT name, salary, salary*14 Annual_salary FROM employee5;定义显示格式CONCAT() 函数用于连接字符串SELECT CONCAT(name, ' annual salary: ', salary*14) AS Annual_salary FROM employee5;单条件查询mysql> SELECT name from employee5 WHERE salary=5000;多条件查询mysql> SELECT name from employee5 WHERE salary>5000 and salary<6000;关键字BETWEEN ANDSELECT name,salary FROM employee5 WHERE salary BETWEEN 5000 AND 15000;SELECT name,salary FROM employee5 WHERE salary NOT BETWEEN 5000 AND 15000;关键字IS NULLSELECT name,job_description FROM employee5 WHERE job_description IS NULL;SELECT name,job_description FROM employee5 WHERE job_description IS NOT NULL;SELECT name,job_description FROM employee5 WHERE job_description='';NULL说明:1、等价于没有任何值、是未知数。2、NULL与0、空字符串、空格都不同,NULL没有分配存储空间。3、对空值做加、减、乘、除等运算操作,结果仍为空。4、比较时使用关键字用“is null”和“is not null”。5、排序时比其他数据都小,所以NULL值总是排在最前。关键字IN集合查询
SELECT name, salary FROM employee5 WHERE salary=4000 OR salary=5000 OR salary=6000 OR salary=9000;SELECT name, salary FROM employee5 WHERE salary IN (4000,5000,6000,9000) ;SELECT name, salary FROM employee5 WHERE salary NOT IN (4000,5000,6000,9000) ;排序查询
mysql> SELECT name from employee5 order by name;
mysql> SELECT name from employee5 order by name desc;
mysql> SELECT name from employee5 order by name desc limit 3; //限制次数
mysql> SELECT name from employee5 order by name desc limit 1,3;
mysql> SELECT name from employee5 order by name desc limit 2,3;注:ascending 美音 /ə'sɛndɪŋ/ 升序descending 美音 /dɪ'sɛndɪŋ/ 降序按多列排序:入职时间相同的人薪水不同SELECT * FROM employee5 ORDER BY hire_date DESC,salary ASC;有差别于SELECT * from employee5 ORDER BY hire_date DESC; 先按入职时间,再按薪水排序SELECT * from employee5 ORDER BY hire_date DESC,salary DESC;先按职位,再按薪水排序SELECT * from employee5 ORDER BY post,salary DESC;限制查询的记录数SELECT * FROM employee5 ORDER BY salary DESC LIMIT 5; //默认初始位置为0 SELECT * FROM employee5 ORDER BY salary DESC LIMIT 3,5; //从第4条开始,共显示5条分组查询GROUP BY和GROUP_CONCAT()函数一起使用SELECT dep_id,GROUP_CONCAT(name) FROM employee5 GROUP BY dep_id;SELECT dep_id,GROUP_CONCAT(name) as emp_members FROM employee5 GROUP BY dep_id;模糊查询(通配符) % 所有字符mysql> SELECT * from employee5 WHERE salary like '%20%';正则查询SELECT * FROM employee5 WHERE salary regexp '72+';SELECT * FROM employee5 WHERE name REGEXP '^ali';SELECT * FROM employee5 WHERE name REGEXP 'yun$';SELECT * FROM employee5 WHERE name REGEXP 'm{2}';函数count()max()min()avg()database()user()now()sum()password()SELECT COUNT(*) FROM employee5;SELECT COUNT(*) FROM employee5 WHERE dep_id=101;SELECT MAX(salary) FROM employee5;SELECT MIN(salary) FROM employee5;SELECT AVG(salary) FROM employee5;SELECT SUM(salary) FROM employee5;SELECT SUM(salary) FROM employee5 WHERE dep_id=101;
2.2、MySQL多表查询
多表查询 多表连接查询复合条件连接查询子查询一、准备两张测试表
表company.employee6
mysql> create table employee6(
emp_id int auto_increment primary key not null,
emp_name varchar(50),
age int,
dept_id int);mysql> desc employee6;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| emp_id | int(11) | NO | PRI | NULL | auto_increment |
| emp_name | varchar(50) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| dept_id | int(11) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+mysql> insert into employee6(emp_name,age,dept_id) values
('tianyun',19,200),
('tom',26,201),
('jack',30,201),
('alice',24,202),
('robin',40,200),
('natasha',28,204);mysql> select * from employee6;
+--------+----------+------+---------+
| emp_id | emp_name | age | dept_id |
+--------+----------+------+---------+
| 1 | tianyun | 19 | 200 |
| 2 | tom | 26 | 201 |
| 3 | jack | 30 | 201 |
| 4 | alice | 24 | 202 |
| 5 | robin | 40 | 200 |
| 6 | natasha | 28 | 204 |
+--------+----------+------+---------+表company.department6
mysql> create table department6(
dept_id int,
dept_name varchar(100)
);mysql> desc department6;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| dept_id | int(11) | YES | | NULL | |
| dept_name | varchar(100) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+mysql> insert into department6 values
(200,'hr'),
(201,'it'),
(202,'sale'),
(203,'fd');mysql> select * from department6;
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
| 200 | hr |
| 201 | it |
| 202 | sale |
| 203 | fd |
+---------+-----------+
注:
Financial department:财务部门 fd二、多表的连接查询
交叉连接: 生成笛卡尔积,它不使用任何匹配条件 自己了解就好,这个生产用会把数据库跑死内连接: 只连接匹配的行外连接:(了解)左连接: 会显示左边表内所有的值,不论在右边表内匹不匹配右连接: 会显示右边表内所有的值,不论在左边表内匹不匹配全外连接:(了解) 包含左、右两个表的全部行=================内连接=======================
两种方式:方式1:使用where条件 方式2:使用inner join
只找出有部门的员工 (部门表中没有natasha所在的部门)
mysql> select employee6.emp_id,employee6.emp_name,employee6.age,department6.dept_name
from employee6,department6
where employee6.dept_id = department6.dept_id;
+--------+----------+------+-----------+
| emp_id | emp_name | age | dept_name |
+--------+----------+------+-----------+
| 1 | tianyun | 19 | hr |
| 2 | tom | 26 | it |
| 3 | jack | 30 | it |
| 4 | alice | 24 | sale |
| 5 | robin | 40 | hr |
+--------+----------+------+-----------+使用别名:
> select a.emp_id,a.emp_name,a.age,b.dept_name from employee6 a,department6 b where a.dept_id = b.dept_id;
+--------+----------+------+-----------+
| emp_id | emp_name | age | dept_name |
+--------+----------+------+-----------+
| 1 | tianyun | 19 | hr |
| 2 | tom | 26 | it |
| 3 | jack | 30 | it |
| 4 | alice | 24 | sale |
| 5 | robin | 40 | hr |
+--------+----------+------+-----------+使用inner join
> select a.emp_id,a.emp_name,a.age,b.dept_name from employee6 a inner join department6 b on a.dept_id = b.dept_id;
+--------+----------+------+-----------+
| emp_id | emp_name | age | dept_name |
+--------+----------+------+-----------+
| 1 | tianyun | 19 | hr |
| 2 | tom | 26 | it |
| 3 | jack | 30 | it |
| 4 | alice | 24 | sale |
| 5 | robin | 40 | hr |
+--------+----------+------+-----------+外连接语法:
SELECT 字段列表FROM 表1 LEFT|RIGHT JOIN 表2ON 表1.字段 = 表2.字段;=================外连接(左连接 left join)=======================
mysql> select emp_id,emp_name,dept_name from employee6 left join department6 on employee6.dept_id = department6.dept_id;
找出所有员工及所属的部门,包括没有部门的员工
+--------+----------+-----------+
| emp_id | emp_name | dept_name |
+--------+----------+-----------+
| 1 | tianyun | hr |
| 5 | robin | hr |
| 2 | tom | it |
| 3 | jack | it |
| 4 | alice | sale |
| 6 | natasha | NULL |
+--------+----------+-----------+=================外连接(右连接right join)=======================
mysql> select emp_id,emp_name,dept_name from employee6 right join department6 on employee6.dept_id = department6.dept_id;
找出所有部门包含的员工,包括空部门
+--------+----------+-----------+
| emp_id | emp_name | dept_name |
+--------+----------+-----------+
| 1 | tianyun | hr |
| 2 | tom | it |
| 3 | jack | it |
| 4 | alice | sale |
| 5 | robin | hr |
| NULL | NULL | fd |
+--------+----------+-----------+============================全外连接=================================
> select * from employee6 full join department6;
+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
| 1 | tianyun | 19 | 200 | 200 | hr |
| 1 | tianyun | 19 | 200 | 201 | it |
| 1 | tianyun | 19 | 200 | 202 | sale |
| 1 | tianyun | 19 | 200 | 203 | fd |
| 2 | tom | 26 | 201 | 200 | hr |
| 2 | tom | 26 | 201 | 201 | it |
| 2 | tom | 26 | 201 | 202 | sale |
| 2 | tom | 26 | 201 | 203 | fd |
| 3 | jack | 30 | 201 | 200 | hr |
| 3 | jack | 30 | 201 | 201 | it |
| 3 | jack | 30 | 201 | 202 | sale |
| 3 | jack | 30 | 201 | 203 | fd |
| 4 | alice | 24 | 202 | 200 | hr |
| 4 | alice | 24 | 202 | 201 | it |
| 4 | alice | 24 | 202 | 202 | sale |
| 4 | alice | 24 | 202 | 203 | fd |
| 5 | robin | 40 | 200 | 200 | hr |
| 5 | robin | 40 | 200 | 201 | it |
| 5 | robin | 40 | 200 | 202 | sale |
| 5 | robin | 40 | 200 | 203 | fd |
| 6 | natasha | 28 | 204 | 200 | hr |
| 6 | natasha | 28 | 204 | 201 | it |
| 6 | natasha | 28 | 204 | 202 | sale |
| 6 | natasha | 28 | 204 | 203 | fd |
+--------+----------+------+---------+---------+-----------+三、复合条件连接查询
示例1:以内连接的方式查询employee6和department6表,并且employee6表中的age字段值必须大于25
找出公司所有部门中年龄大于25岁的员工
select emp_id,emp_name,age,dept_name FROM employee6,department6 WHERE employee6.dept_id=department6.dept_id AND age > 25;示例2:以内连接的方式查询employee6和department6表,并且以age字段的升序方式显示
SELECT emp_id,emp_name,age,dept_name FROM employee6,department6 where employee6.dept_id=depaartment6.dept_id ORDER BY age asc;四、子查询
子查询是将一个查询语句嵌套在另一个查询语句中。
内层查询语句的查询结果,可以为外层查询语句提供查询条件。
子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
还可以包含比较运算符:= 、 !=、> 、<等1. 带IN关键字的子查询
查询employee表,但dept_id必须在department表中出现过
SELECT * FROM employee6 WHERE dept_id IN (SELECT dept_id FROM department6);2. 带比较运算符的子查询
=、!=、>、>=、<、<=、<>
查询年龄大于等于25岁员工所在部门(查询老龄化的部门)
SELECT dept_id,dept_name FROM department6 WHERE dept_id IN (SELECT DISTINCT dept_id FROM employee6 WHERER age >= 25);3. 带EXISTS关键字的子查询
EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。
True或False,当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询department表中存在dept_id=203,Ture
SELECT * from employee6 WHERE EXISTS (SELECT * FROM depratment6 WHERE dept_id=203);
后续会通过sql精华教程重点强化
2.3、Mysql安全控制
- 确保MySQL运行用户为一般用户
```shell # groupadd mysql # useradd -M -s /sbin/nologin -g mysql mysql
# vim /etc/my.cnf user = mysql
#注意点: 改变拥有者和所属组对于mysql的安装目录 ```
- 建议修改默认端口3306,改为其他的一些端口
shell # vim /etc/my.cnf port = 3306 false port = 10086 true
- 开启mysql二进制日志,在误删除数据的情况下,可以通过二进制日志恢复到某个时间点
shell # vim /etc/my.cnf log_bin = othername
4.删除空口令账号
```sql #禁用匿名账号 # vim /etc/my.cnf skip-grant-tables = 1. --改成 "#skip-grant-tables = 1"
#删除空口令用户 mysql> SELECT User,Host,authentication_string from mysql.user; +---------------+-----------+-------------------------------------------+ | User | Host | authentication_string | +---------------+-----------+-------------------------------------------+ | root | localhost | AFE7E33F3C21EAE1BF8231C3B09F9B0184A670F6 | | mysql.session | localhost | THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | +---------------+-----------+-------------------------------------------+ 3 rows in set (0.00 sec)
mysql> create user 'newrain'@'localhost'; #(这是在做实验)创建空口令账户 Query OK, 0 rows affected (0.00 sec)
mysql> SELECT User,Host,authentication_string from mysql.user; +---------------+-----------+-------------------------------------------+ | User | Host | authentication_string | +---------------+-----------+-------------------------------------------+ | root | localhost | AFE7E33F3C21EAE1BF8231C3B09F9B0184A670F6 | | mysql.session | localhost | THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | newrain | localhost | | +---------------+-----------+-------------------------------------------+ 4 rows in set (0.00 sec)
mysql> drop user 'newrain'@'localhost'; #这是删除空口令账户 Query OK, 0 rows affected (0.01 sec)
mysql> SELECT User,Host,authentication_string from mysql.user; +---------------+-----------+-------------------------------------------+ | User | Host | authentication_string | +---------------+-----------+-------------------------------------------+ | root | localhost | AFE7E33F3C21EAE1BF8231C3B09F9B0184A670F6 | | mysql.session | localhost | THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | +---------------+-----------+-------------------------------------------+ 3 rows in set (0.00 sec) ```
- 禁止root账户远程访问(允许普通用户远程访问,某个网段即可)
```sql mysql> SELECT User,Host,authentication_string from mysql.user; +---------------+-----------+-------------------------------------------+ | User | Host | authentication_string | +---------------+-----------+-------------------------------------------+ | root | localhost | AFE7E33F3C21EAE1BF8231C3B09F9B0184A670F6 | | mysql.session | localhost | THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | +---------------+-----------+-------------------------------------------+ 3 rows in set (0.00 sec)
mysql> create user 'root'@'10.0.11.%' identified by "123"; Query OK, 0 rows affected (0.00 sec)
mysql> SELECT User,Host,authentication_string from mysql.user; +---------------+-----------+-------------------------------------------+ | User | Host | authentication_string | +---------------+-----------+-------------------------------------------+ | root | localhost | AFE7E33F3C21EAE1BF8231C3B09F9B0184A670F6 | | mysql.session | localhost | THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql.sys | localhost | THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | root | 10.0.11.% | 23AE809DDACAF96AF0FD78ED04B6A265E05AA257 | +---------------+-----------+-------------------------------------------+ 4 rows in set (0.00 sec)
mysql> drop user 'root'@'10.0.11.%'; Query OK, 0 rows affected (0.00 sec) ``` - 使用mysql的时候,经常会遇到
MySQL: ERROR 1040: Too many connections
这样的问题,一种是访问量确实很高, MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力,另外一种情况是MySQL配置文件中max_connections值过小, 这时就需要调整当前最大连接数
mysql ##设置最大连接数02 修改mysql配置文件my.cnf,在[mysqld]段中添加或修改max_connections值: max_connections=256
DCL(Data Control Language 数据库控制语言)
用于数据库授权、角色控制等操作
GRANT
授权,为用户赋予访问权限
REVOKE
取消授权,撤回授权权限
用户管理
登录和退出MySQL
远程登陆:
客户端语法:mysql -u 用户名 -p 密码 -h ip地址 -P端口号:如果没有改端口号就不用-P指定端口
# mysql -h192.168.62.148 -P 3306 -uroot -p123创建用户create user '用户名'@'客户端来源IP地址' identified by '密码';mysql> create user newrain@'192.168.62.%' identified by '123';删除用户drop user '用户名'@'客户端来源IP地址';mysql> drop user newrain@'192.168.62.%';修改用户rename user '用户名'@'客户端来源IP地址' to '新用户名'@'客户端来源IP地址' ;mysql> rename user newrain@'192.168.62.%' to ehome@'%';
修改密码// 第一种方法:set password for '用户名'@'IP地址'=Password('新密码')mysql> set password for ehome@'%'=Password('123');// 第二种方法:alter user '用户名'@'客户端来源IP地址' identified by '新密码';// 第三种方法(忘记密码时,必须使用此方法修改密码):UPDATE mysql.user SET authentication_string=password('QFedu123!') WHERE user='root' and host='localhost';===root修改自己密码
# mysqladmin -uroot -p'123' password 'new_password' //123为旧密码
案例:
# mysqladmin -uroot -p'123' password 'qf@123';PS:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)
权限管理
grant 权限 on 数据库.表 to '用户'@'客户端来源IP地址' identified by '密码'; -- 授权并设置密码
revoke 权限 on 数据库.表 from '用户'@'客户端来源IP地址' -- 取消权限mysql> grant all privileges on company.* to ehome@'%';
mysql> revoke all privileges on company.* from ehome@'%';
mysql> flush privileges; #关于权限方面的修改,注意刷新权限,否则有可能不生效
查看授权信息
查看授权语句
show grants for '用户'@'客户端来源IP地址';
mysql> show grants for ehome@'%';
+-----------------------------------+
| Grants for ehome@% |
+-----------------------------------+
| GRANT USAGE ON *.* TO 'ehome'@'%' |
+-----------------------------------+
1 row in set (0.00 sec
查看生效的授权信息
针对所有库和表的权限,比如 *.*
。 去 mysql.user
中查看
SELECT * from mysql.user WHERE user='root'\Gmysql> SELECT * from mysql.user WHERE user='ehome'\G
*************************** 1. row ***************************Host: %User: ehomeSELECT_priv: NInsert_priv: NUpdate_priv: NDelete_priv: NCreate_priv: NDrop_priv: NReload_priv: NShutdown_priv: NProcess_priv: NFile_priv: NGrant_priv: NReferences_priv: NIndex_priv: NAlter_priv: NShow_db_priv: NSuper_priv: NCreate_tmp_table_priv: NLock_tables_priv: NExecute_priv: NRepl_slave_priv: NRepl_client_priv: NCreate_view_priv: NShow_view_priv: NCreate_routine_priv: NAlter_routine_priv: NCreate_user_priv: NEvent_priv: NTrigger_priv: N
Create_tablespace_priv: Nssl_type: ssl_cipher: x509_issuer: x509_subject: max_questions: 0max_updates: 0max_connections: 0max_user_connections: 0plugin: mysql_native_passwordauthentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257password_expired: Npassword_last_changed: 2019-08-20 19:35:41password_lifetime: NULLaccount_locked: N
1 row in set (0.00 sec)
针对具体到库的权限,比如db_name.*
。 去 mysql.db
中查看
mysql> SELECT * from mysql.db WHERE user='ehome'\G
*************************** 1. row ***************************Host: %Db: companyUser: ehomeSELECT_priv: YInsert_priv: YUpdate_priv: YDelete_priv: YCreate_priv: YDrop_priv: YGrant_priv: NReferences_priv: YIndex_priv: YAlter_priv: Y
Create_tmp_table_priv: YLock_tables_priv: YCreate_view_priv: YShow_view_priv: YCreate_routine_priv: YAlter_routine_priv: YExecute_priv: YEvent_priv: YTrigger_priv: Y
1 row in set (0.00 sec)
假如是 MySQL8.x
CREATE USER '你的用户名'@'localhost' IDENTIFIED BY '你的密码';
#创建新的用户
GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'localhost';
#把刚刚创建的数据库的管理权限给予刚刚创建的MySQL用户
FLUSH PRIVILEGES;
#刷新权限,使用设置生效
Mysql调优策略(面试拓展)
1. 选择合适的存储引擎: InnoDB
2. 选取磁盘读写速度较快的设备作为Mysql服务器
3. 充分使用索引
4. 增加慢查询日志功能
5. 频繁访问的数据,用缓存数据库解决
6. 单条查询最后增加 LIMIT 1,停止全表扫描
7. 设置最大连接数
8. 设置引擎的读写速度
云计算实战系列十六(SQL II)相关推荐
- 云计算实战系列十五(SQL I)
一.MySQL数据库表操作 MySQL表的基本概念 在windows中有个程序叫做excel. 而Excel文件中存在了如sheet1.sheet2.sheet3的表, 所有的sheet都存储在这个E ...
- 云计算实战系列十四(MySQL基础)
一.Mysql开篇 1.1.MySQL数据库介绍 什么是数据库DB? 数据库无处不在 DB的全称是database,即数据库的意思.数据库实际上就是一个文件集合,是一个存储数据的仓库,数据库是按照特定 ...
- 云计算实战系列十二(Linux系统优化)
Linux高级系统优化 uptime 命令 [root@newrain ~]# uptime 14:01:51 up 1 day, 20:11, 3 users, load average: 0.13 ...
- 云计算实战系列十(文件查找及包管理)
文件查找 知识点 grep: 文件内容过滤 find : 文件查找,针对文件名 xargs 文件打包及压缩 gzip bzip2 xz unzip(了解) 1.1 命令文件 # which ls // ...
- 抖音短视频数据抓取实战系列(六)——Mitmproxy+python编写监测程序
抖音短视频数据抓取实战系列(六)--Mitmproxy+python编写监测程序 项目目录 1.抖音短视频数据抓取实战系列(〇)--前言 2.抖音短视频数据抓取实战系列(一)--模拟器的选择与设置 3 ...
- Vue实战篇十六:导航菜单
系列文章目录 Vue基础篇一:编写第一个Vue程序 Vue基础篇二:Vue组件的核心概念 Vue基础篇三:Vue的计算属性与侦听器 Vue基础篇四:Vue的生命周期(秒杀案例实战) Vue基础篇五:V ...
- 来自极客标签10款最新设计素材-系列十六
本周我们推荐来自极客标签社区带来的10款免费设计素材,大家可以在这里免费下载你需要的内容.如果你也有更好的作品,欢迎分享到社区中来,在得到帮助的同时,也能与更多人分享来自你的作品. 免费图标:扁平风格 ...
- Spring Boot实战系列《六》:人事管理系统的登录设计
Spring Boot实战系列<六>:人事管理系统的登录设计 Spring Boot实战系列<六>:人事管理系统的登录设计 1.前言 在上一篇中教大家在IEDA或者eclips ...
- 数学之美 系列十六 (下)- 不要把所有的鸡蛋放在一个篮子里 最大熵模型
数学之美 系列十六 (下)- 不要把所有的鸡蛋放在一个篮子里 最大熵模型 我们上次谈到用最大熵模型可以将各种信息综合在一起.我们留下一个问题没有回答,就是如何构造最大熵模型.我们已经所有的最大熵模型都 ...
最新文章
- DNA测序,第一代DNA测序,第二代DNA测序,第三代DNA测序,sanger法
- 后端开发需要学什么_都2020年了,还在纠结学什么语言?| 后端篇
- Jenkins持续集成——用户管理
- 程序员面试金典 - 面试题 02.03. 删除中间节点
- 移动云11.11,钜惠High不停!
- SQL Server MDF 文件打开和相关问题图解
- android代码设置点击涟漪,android – 为自定义CompoundButton添加涟漪效果
- python日志:去掉noteexpress导出参考文献题录的空格
- android nat64,dpvs学习笔记: 18 nat64 的实现
- Docker之通过阿里云的镜像加速器快速拉取镜像到本地
- SpringBoot生成二维码 扫描并可下载文件
- Vuex、axios以及跨域请求处理
- c++函数模板,有默认参数的函数
- CANape19系统需求与特性简介
- LPDDR4x 的 学习总结(3) - SDRAM基本功能
- Java面向对象练习题
- 基于数字孪生的机器人焊接自动编程关键技术
- 【Verilog - 组合逻辑 - 基础3】4. 与或门-1
- Unity中实现刮奖效果
- 中国平安发起保护华南虎公益行动 首发区块链数字艺术藏品
热门文章
- 暴风影音“猝死” ,官网、APP全挂了!网友:我的青春说没就没了
- 每晚有1700万人逛淘宝但什么都不买,马云:我们仍可以靠他们赚钱
- 小米MIXAlpha将首发1亿像素传感器:1/1.33英寸大底业内无敌
- 开局说丑说拒绝,开售抢的贼快!iPhone11预约超百万
- 小鹏吃相难看,消费者难做“鹏”友
- 安卓依然是华为手机首选,鸿蒙系统或许不用于手机
- 探探被安卓市场下架 官方回应:深入开展整改
- iPhone 7疯狂生产 苹果提升在印度存在感
- [python]json.loads 几种错误 解决方案
- oracle logical standby,Oracle10gR2 Logical Standby(一)概念与原理