Linux数据库管理——day4——多表查询、phpMyAdmin管理工具、修改数据库用户密码、用户授权

复制表

    主要作用:  备份表 、 快速建表
    语法: create table 表名 SQL查询语句

# 备份一个表的所有数据
create table 表名 select * from 被备份的表;
# 以一个表的表结构为模型创建一个新表,但不要数据
create table 表名 select * from 模型表名 where false;
# 具体选择某些字段,某几行
create table 表名 select 字段1,字段2 from 原表 where 具体条件;

    注意: 
        复制表的时候,原表中的KEY键值不会被拷贝过来,
        不过字段、类型、默认值会被复制到新表中。


连接查询

   多表查询
      定义: 让两个表作笛卡尔积运算,得到一个新的大表,如果两个表中有相同含义字段可以,作为连接标示,这样可以去除一些冗余数据
      笛卡尔积: 笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积,又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
      语法: select 表.字段  表.字段  from 表1,……,表n  where 条件 …… ;
      注意:
         1. 一旦有多表查询,每个字段前面必须写上表名
         2. 连接如果不加相关条件约束,就是表1的一行信息和表2的每行信息组成若干行,依次类推,得到的就算表1的行数*表2的行数……行数的内容,这就是笛卡尔积

      一般情况下 使用自然连接 也就两个表的唯一标识是一样的,所以通常的语法模板就是:
select  表.字段(或者*)  from 表  1,……,表n  where 表1.主键 = 表2.主键 …… and 表n-1.主键 = 表n.主键 ……其他条件……
     

   子查询
      定义: 把内层查询结果作为外层查询的查询条件,实现较为负载的查询需求
      语法: select  字段  from  表  where 条件 (select 字段 from  表 where  条件);
      原理: 把内层查询表的输出作为一个具体值,参与外层表筛选条件的组成部分
      注意:
         1. 内层查询的表不一定和外层查询的表是一个表,随便都可以
         2. 不管内层外层表都可以是多表组成
         3. 当内层查询的返回结果有可能是多个不同的值的时候,条件只能用 in 或者 not in ,如果确定只可能有一个值,那就可以用=或者!=等

# 查询某字段最大值的行的全部信息
select * from 表 where 字段 = ( select max(字段) from 表 );
# 查询表1中不包含表2的某个字段的行的信息
select * from 表1 where 字段 not in ( select 字段 from 表2);

   左连接 、右连接
      定义:
      语法:
         左连接:select 字段 from 表(左) left join 表(右) on 条件;
         右连接:select 字段 from 表(左) right join 表(右) on 条件;
      原理:
          左连接就是以左表为主,右表为辅 ; 右连接与之相反,右表为主,左表为辅
          把主表的所有信息列出来,辅表中有满足条件的值就写上,没有就用NULL代替
      注意:
         1. 不管条件如何,主表中所有信息都是会显示出来的,而条件成立的情况下,才输出右表数据

# 先附上实验的表的数据
select * from table_l;
+----+--------+---------------+
| id | name   | shell         |
+----+--------+---------------+
|  1 | root   | /bin/bash     |
|  2 | bin    | /sbin/nologin |
|  3 | daemon | /sbin/nologin |
|  4 | adm    | /sbin/nologin |
+----+--------+---------------+

select * from table_r;
+----+----------+----------------+
| id | name     | home           |
+----+----------+----------------+
|  1 | root     | /root          |
|  2 | bin      | /bin           |
|  3 | daemon   | /sbin          |
|  4 | adm      | /var/adm       |
|  5 | lp       | /var/spool/lpd |
|  6 | sync     | /sbin          |
|  7 | shutdown | /sbin          |
+----+----------+----------------+

# 进行测试
select * from table_l left join table_r on table_l.id = 1 ;
# 输出结果就是
+----+--------+---------------+------+----------+----------------+
| id | name   | shell         | id   | name     | home           |
+----+--------+---------------+------+----------+----------------+
|  1 | root   | /bin/bash     |    1 | root     | /root          |
|  1 | root   | /bin/bash     |    2 | bin      | /bin           |
|  1 | root   | /bin/bash     |    3 | daemon   | /sbin          |
|  1 | root   | /bin/bash     |    4 | adm      | /var/adm       |
|  1 | root   | /bin/bash     |    5 | lp       | /var/spool/lpd |
|  1 | root   | /bin/bash     |    6 | sync     | /sbin          |
|  1 | root   | /bin/bash     |    7 | shutdown | /sbin          |
|  2 | bin    | /sbin/nologin | NULL | NULL     | NULL           |
|  3 | daemon | /sbin/nologin | NULL | NULL     | NULL           |
|  4 | adm    | /sbin/nologin | NULL | NULL     | NULL           |
+----+--------+---------------+------+----------+----------------+

         2. 如果条件恒成立,那么左连接或者右连接就变成了多表查询

select * from table_l right join table_r on true ;

         3. 如果条件恒不成立,那么输出所有主表中的所有数据,然后辅表中的所有数据都不输出,所有代替的是null。

select * from table_l left join table_r on false;

管理工具

常见的管理工具
mysql命令行跨平台MySQL官方包自带的
MySQL-Workbench图形跨平台MySQL官方提供
MySQL-Front图形Widows开源的小客户端软件
phpMyAdmin浏览器跨平台开源,需要LAMP服务平台

phpMyAdmin

   其实,这是一个web网页代码,由以一堆代码组成的网页架构,实现连接数据库,从而通过网页界面控制数据库
   网页代码tar包,将在下载中上传
   安装步骤: 搭建LAMP,赋予权限,修改配置,启动服务
       1. 装包: httpd php php-mysql

       2. 启动Apache服务: httpd

       3. 解压phpMyAdmin包到web服务

unzip phpMyAdmin-2.11.11-all-languages.tar.gz -d  .
cp -rf phpMyAdmin/* /var/www/html/
rm -rf phpMyAdmin/

       4. 赋权

chown -R apche:apache /var/www/html/*

       5. 修改配置文件

cp /var/www/html/config.sample.inc.php /var/www/html/config.inc.php
vim /var/www/html/config.inc.php
# 把17行密钥后面随便写点字符串即可
$cfg['blowfish_secret'] = 'PMASecrit';

       6. 客户端访问网页即可对数据库进行操作


MySQL管理密码

   数据库管理员所有密码的修改操作,只有操作系统的管理员才有权限修改!

   恢复 MySQL 的 localhost 管理登陆密码(Linux操作的系统命令)
      1. 设置配置文件,跳过授权表启动MySQL程序

sed -i '/password/s/^/#==/' /etc/my.cnf
sed -i '/mysqld/askip-grant-tables' /etc/my.cnf

      2. 重新启动MySQL服务程序(Linux操作的系统命令)

systemctl restart mysqld

      3. 修改 mysql.user 表的内容(MySQL下的命令)

update mysql.user set authentication_string = password('新密码') where host='localhost' and user='root';
flush privileges;

      4. 改回配置文件,重启服务(Linux操作的系统命令)

sed -i 's/^#==//' /etc/my.cnf
sed -i 's/^skip-grant-tables//' /etc/my.cnf
systemctl restart mysqld

       注意:再次强调所有操作必须要是系统的管理员才能进行!  命令可以直接拷贝执行。

   修改密码

# 交互修改数据库管理员密码(Linux操作的系统命令)
mysqladim -u root -p password '新密码'
# 非交互修改数据管理员密码,p和旧密码间没有空格
mysqladim -u root -p旧密码 password '新密码'

   


用户赋权

   权限存储在mysql库里面,这个库是装完软件后自带的

记录内容
user存储授权用户的访问权限
db存储授权用户对数据的访问权限,用户对某个数据库拥有的权限
tables_priv存储授权用户对表的访问权限
columns_priv存储授权用户对字段的访问权限

   授权命令

grant  权限列表  on  库名.表名  to 用户名@'客户端地址'  identified by '密码' ;
# 如果赋予用户 授权权限(允许用户给任何人赋权,只能授予小于等于自己用户的权限)
grant 权限列表 on  库名.表名  to 用户名@'客户端地址'  identified by '密码'  with grant option;

    具体各部分解释:
   

权限列表( 权限可以理解为, 可以使用 用同名的命令的权力 )
all代表所有权限(也称为完全权限,但是其中不包括授权权限)
select代表查看权限
update代表修改表内容权限
update(字段1,字段2)代表具体修改某表中某几个具体字段的修改权限
delete代表删除表中信息权限
insert代表添加表信息的权限
create代表创建权限
库名和表名:
*.*代表所有库所有表,
具体库.* 代表某库的所有表,
具体库.具体表代表就算具体到某库某表的权限,
一般不存在  *.具体表 的情况,因为很少所有库中都有同名的表。
客户端地址:
localhost代表用MySQL服务器进行本地登陆
192.168.10.100指定一个IP的单个主机
server.Lyu.com匹配一个指定域名的主机(能被DNS解析)
192.168.10.%指定一个网段
%.Lyu.com匹配一个域名(该域名要能被DNS解析)
%匹配所有主机
客户端连接数据的时候,权限匹配,从上之下,匹配即停止,然后开始按照其被配置的权限进入数据库

   查看授权信息

select * from mysql.user where user='创建的用户名'\G;
show grants for 创建的用户名;

   查看当前登陆的用户

select user();

   查看当前主机名

select  @@hostname;

   查看自己当前拥有的权限

show grants;

   授权用户连接后,修改自己的登陆密码

set password = password( '密码' );

   管理员修改授权用户的密码

set password for 用户名@'客户端地址'=password( '密码' );

   撤除授权

revoke  权限列表(或者 grant option)  on  库名.表名  from  用户名@'客户端地址';
# 撤销前查看一下有哪些权限,然后再具体删除
show grants for 用户名;
# 注意:只能撤销查看到的权限,查看的权限怎么写,撤销的时候就必须怎么写!

   删除授权用户

drop  user  用户名@'客户端地址';

   权限部分知识点详细解释:

       1. 我们有时候会发现,我们授予权限,已经登陆的用户的权限可能不即时有效,,也许查看权限的时候,权限是不存在的,但实际操作却表现出权限允许,这是时候,我们退出重新登陆一下即可,权限就会同步完成量,当然这只是小概率事件。

       2. 权限赋予操作实际上是进行追加。
          说具体点就是,假如我现在的当前用户拥有test库的select权限,然后被赋予量test库下的test_table表的修改权限,实际上为对test_table拥有读写权限。换言之,对高层次(库->表->字段)的权限会继承到下层次中,而所有权限只会一直添加,不会覆盖,想要去除,只能删除具体的权限。

       3. 权限中USAGE是比较特殊的,它指的是进入数据库或表的权限,他不用进行赋权,默认只要用户有任何一个权限,就默认拥有该权限,如果拥有某库的表的权限,而没有该库的任何权限,也会默认给你该库的usage权限,因为如果没有进入权限,对表的所有权限也就没有了任何意义。

       4. 授权可以授予一个不存在的库或者表的权限,这样被授权的用户就可以自己创建一个被授权的库或者表。
          说具体点就是,假如我现在的用户拥有test库的完全权限,而这个库并不存在,那么我就可以创建一个名为test的库,并用于其全部的权限

       5. 库名为 information_schema,是内存映射出来的,实际不存在,是一个假库,不能进行任何操作

       6. 如果用户对mysql库没有insert的权限,那么即使给他 授权权限也没用,他不能创建任何一个用户,
          如果没有update权限,那么他不能他不能给任何存在的用户授予任何权限,因为所有的权限信息都是记录在mysql库里面,所以,如果要给授权权限,一定是要对mysql库有相应的权限的。

       7. 完全权限指的是除了授权权限外的所有权限,也可以理解为权限列表中的所有权限,而all指代的是完全权限

       8. 撤除用户的权限只能一个一个撤销,不能越级撤销,而且撤销的权限必须是的当初创建时候写的权限,必须一模一样。
          说具体点就是,假如我删除test数据库的的所有权限,这时候会发现,单独授权给test_table的权限还在,所以还要撤除表的权限
          还有一个情况,假如我只授予了用户拥有test数据库所有权限,这时候为想只删除test库下的test_table表的权限,这时候会报错,因为只能撤销当初创建的权限。

       9. 即使撤除所有权限,用户只要存在,就有一个登陆的权限,只不过什么都看不到也不能才做,显示权限的时候,就是如下的一个标示。
GRANT USAGE ON *.* TO 'test'@'localhost'
          如果用户没有test数据库的任何权限,但是拥有该数据库下一个表test_table的权限,那么查看用户权限的时候,一定是有下面的提示,他标示我可以进入这个数据库
GRANT USAGE ON test.* TO 'test'@'localhost'

       10. 删除用户和撤除用户所有权限的区别,如果删除用户,那么其所有权限也将全部消失,再次创建的时候也没有那些权限了,如果撤除用户的所有权限,用户仍然可以登陆,但是什么操作都没有,和删除用户实际上作用差不多,但是一般不是删除用户而是修改其权限。

       11. 权限被拒绝的报错信息,看到这些报错,就可以明白,是权限出了问题
# 不拥有授权权限,进行授权操作的报错
ERROR 1045 (28000): Access denied
# 不拥有具体权限,进行权限操作的报错 (举例drop没有权限)
ERROR 1142 (42000): DROP command denied 

      12. 用户登陆的时候,在主机名匹配中先后优先级的区分,对一个用户的具体的主机名进行的权限设置会覆盖统配
          具体说,如果给 mydb用户的localhost 单独设置权限为select, 而我们又设置量 mydb用户的 % 登陆的时候通配权限为all,用户用localhost主机登陆的时候, 拥有的权限就是select。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值