数据库管理入门之四(末尾有彩蛋)

一、多表查询

1.1复制表

1.1.1功能:可以备份、快速建立相同表结构的表;

1.1.2基本用法:create table 库.表 sql查询

//库不指定则复制到当前库下

eg:create table yyy select * from xxx;

//将源表xxx复制为新表yyy

mysql> create table t2 select id,name from A.user limit 10;

ps:

复制表时源表中键值的设置不会复制到新表,需要手动添加,复制的内容取决于查询结果,不一定要整表复制;

快速建立表结构但不需要内容时可将查询条件设为全部不匹配,使得查询结果为0,则复制过来的只有表结构,再手动加上键值即可,如:

mysql> create table t3 select * from A.user where 1=2;

Query OK, 0 rows affected (0.03 sec)

mysql> desc t3;

1.2多表查询(连接查询)

1.2.1含义:

当2个或2个以上的表按某个条件连接起来,从中选择需要的数据;

当多个表中存在相同意义的字段(字段名可以不同)时,可以通过该字段连接多个表

1.2.2用途:实际应用中,不可能把所有的数据存放在一个表里,往往不同类型的数据存放在不同表里,当需要使用的时候再把与之相关的数据从不同的表中取出。

1.2.3where嵌套查询

用于数据一次性找不出来,把内层的查询结果作为外层查询的查询条件,类似于系统命令中的管道符“|”;

基本用法:

select 字段名列表 from 表 where 条件(select 字段名列表 from 表 where 条件);

ps:内层(括号里面内容)查询用到的表可以与外层查询用的表相同,也可以不同;

eg:

mysql> select name,uid from A.user where uid < (select avg(uid) from A.user);

//查询出uid小于uid平均值的用户及其uid值;

mysql> select user from mysql.user where host="localhost";

mysql> select name from db4.t1 where name in (select user from mysql.user where host="localhost");

查询出在mysql.user表里主机为本地的用户在db4.t1表里的名字;

1.2.4连接查询

连接查询的类型:交叉链接,内连接,外链接

基本用法:

select 字段名列表 from 表1 join_type 表2 on条件

结合例子介绍:

学生信息表()

交叉连接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合,交叉联接也称作笛卡尔积;

内连接:使用比较运算符(包括=、>、、>=、<=、!>和!

等值连接:在连接条件中使用等于号(=)运算符,其查询结果中列出被连接表中的所有列,包括其中的重复列。

mysql> select * from xxb,cjb on xxb.id=cjb.id;

数据库管理入门之四(末尾有彩蛋)

自然连接:特殊的等值连接,等值连接中去掉重复的列,形成的连接。

mysql> select xxb.* ,cjb.chengji from xxb,cjb on xxb.id=cjb.id;

数据库管理入门之四(末尾有彩蛋)

不等连接:在连接条件中使用除等于号之外运算符(>、、>=、<=、!>和!

mysql> select * from xxb,cjb on xxb.id > cjb.id;

数据库管理入门之四(末尾有彩蛋)

自连接:特殊的内连接,如果在一个连接查询中,设计到的两个表都是同一个表,这种查询称为自连接查询,逻辑上为2个表;

mysql> select * from cjb on id=chengji;

外连接:外连接分为左连接、右连接和全连接。

左连接:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。

mysql> select * from xxb left join cjb on xxb.id=cjb.id;

数据库管理入门之四(末尾有彩蛋)

右连接:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

mysql> select * from xxb right join cjb on xxb.id=cjb.id;

数据库管理入门之四(末尾有彩蛋)

全连接:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值。

mysql> select * from xxb full join cjb on xxb.id = cjb.id;

ERROR 1054 (42S22): Unknown column 'xxb.id' in 'on clause'

ps:默认会报错,因为mysql不支持full join ,可以通过left join +union+right join的方式实现,即:

mysql> select * from xxb left join cjb on xxb.id = cjb.id union select * from xxb right join cjb on xxb.id=cjb.id;

数据库管理入门之四(末尾有彩蛋)

交叉连接:也叫笛卡尔积,不带on条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积(例如:T_student和T_class,返回4*4=16条记录),如果带on,返回或显示的是匹配的行数,交叉连接中的on可以用where替代。

mysql> select * from xxb , cjb;

数据库管理入门之四(末尾有彩蛋)

mysql> select * from xxb cross join cjb on xxb.id=cjb.id;

ps:结果等同于等值连接

ps:cross join后加条件只能用where,不能用on

数据库管理入门之四(末尾有彩蛋)

二、图形管理工具

2.1常见的管理工具

数据库管理入门之四(末尾有彩蛋)

2.2安装phpMyAdmin方便开发人员及用户操作数据库

2.2.1安装的基本思路:

-搭建lamp平台(安装httpd,mysql,php-mysql及相关包)

-启动httpd服务程序使得用户可以通过web访问数据库;

-解压phpMyAdmin包,部署到网站目录

-配置config.inc.php,指定mysql主机地址

-浏览器访问,登录使用

2.2.2实际流程:

#yum -y install httpd php php-mysql

#tar -zxf phpMyAdmin-2.11.11-all-languages.tar.gz -C /var/www/html/

#cd /var/www/html/

#mv phpMyAdmin-2.11.11-all-languages/ phpmyadmin

#chown -R apache:apache phpmyadmin/

#cp phpmyadmin/config.sample.inc.php phpmyadmin/config.inc.php

# vim /var/www/html/phpmyadmin/config.inc.php

$cfg['blowfish_secret'] = 'xxx'; //随便填

$cfg['Servers'][$i]['host'] = 'localhost'; //指定mysql服务器地址

访问验证,账号密码为登陆数据库的账号密码;

ps:登陆界面提示没有mcrypt php加密软件,不装不影响,需要网上下载,镜像没有

3.1密码恢复与设置

默认只有数据库管理在本及能够访问数据库服务器

操作系统的管理员root用户可以管理数据库管理员root密码:

3.1.1重置数据库管理员密码:

mysqladmin -hlocalhost -uroot -p password”新密码”--->输入当前密码---》成功

3.1.2恢复数据库管理员登陆密码:

1)停服务

2)修改配置文件,更改为登陆跳过身份认证并注释掉关于密码的语句(若没设置密码策略则不用注释)

3)登陆数据库,修改mysql库下的user表,更改root的auth....值为password(“密码”)

4)刷新权限

5)修改回配置文件,重启服务

6)登陆测试

7)eg:

[root@host50 phpmyadmin]# vim /etc/my.cnf

[mysqld]

skip-grant-tables

#validate_password_policy=0

#validate_password_length=6

...

[root@host50 phpmyadmin]# mysql

mysql> update mysql.user set authentication_string=password("654321")

where user="root" and host="localhost";

//authentication_string列存放的是密码

mysql> flush privileges;

//刷新权限

[root@host50 phpmyadmin]# vim /etc/my.cnf

[mysqld]

#skip-grant-tables

validate_password_policy=0

validate_password_length=6

...

[root@host50 phpmyadmin]# systemctl restart mysqld

[root@host50 phpmyadmin]# mysql -uroot -p654321

3.2用户授权(默认数据库管理员在本及登陆有授权权限)

3.2.1基本用法:

grant 权限列表 on 数据库名.表名 to 用户名@”客户端地址” identified by “密码” with grant option;

//with grant option 授权的该用户也有执行grant授权其他人管理的权限

3.2.2权限列表

-all:匹配所有权限

-select,update,insert,delete....

-select,update(字段1,字段2...),...

-usage只添加能连的用户,但是没有任何权限

-详细的权限关键词可通过查看user表结构了解;

3.2.3客户端地址

-%:匹配所有能ping通服务器的主机

-192.168.1.%:匹配指定的一个网段

-192.168.1.1:匹配指定ip地址的单个主机

-%.xxx.com:匹配一个dns区域,需要有dns解释域名

-xx.xxx.com:匹配指定域名的单个主机

-当库名.表名为“*.*”时,匹配所有库所有表

-授权设置存放在mysql库的user表;

3.2.5with grant option

-授权的该用户也有执行grant授权其他人管理的权限,因此当赋予all权限给所有库下的所有表,再加上授权权限,相当于管理员身份,常用于管理员将权限赋予给自己工作的远程主机,方便操作数据库。

3.2.5.1授权用户能授权别人的前提:

-有授权权限(with grant option)

3.2.6其他相关指令

mysql> select @@hostname; //数据库的内置变量,显示数据库服务器的主机名

mysql> select user();

mysql> show grants;//查看用户授权

3.2.7注意事项:

当要对某个库有全部权限时,库可以不事先创建,因为该用户具有创建库的权限

当对update有限制字段时,对于哪个表要有明确的指定,不能用*,同时要有指定的字段

3.2.8eg:

mysql>grant all on webdb.* to webuser@"192.168.4.%" identified by "123456";

mysql>grant select,update(name,uid) on db1.user to yaya@"%" identified by "123456" ;

grant all on *.* to admin@"192.168.4.51" identified by "123456" with grant option;

mysql> select @@hostname;

mysql> select user();

mysql> show grants;

3.3.1授权信息存储在数据库服务器的授权库(mysql库)里,使用不同的表存储授权信息:

-user表,存储授权用户的访问权限;登陆名和密码

-db表,存储授权用户对数据库的访问权限;

-tables_priv表,存储授权用户对表的访问权限;

-column_priv表,存储授权用户对字段的访问权限。

3.3.2主要指令:

select host,user from mysql.user;

看某一个用户的访问权限

show grants for 用户名@”host对应的地址”;

看某个用户的详细权限:

select * from mysql.user where user=”用户名” \G;

3.3.3eg:

select host,user,db from mysql.db;

select * from mysql.db where user="webuser" and db="webdb"\G;

select host,user,db,table_name from mysql.tables_priv;

select * from mysql.tables_priv where user="yaya"\G;

select * from mysql.columns_priv;

ps:

Table_priv: 对表的权限有什么权限

Column_priv: 对表中的特定字段有哪些权限,字段的信息存放在columns_priv表。

ps:查看db表、table_priv表以及cloumns表的结构都可以看到有一个复合主键,说明不能对同一个主机上的同一个用户对相同的数据库及库下的内容重复授权,要修改权限只要修改对应表的记录即相当于修改授权,因为授权其实也就是往这些表内插入记录,比如:

mysql> update mysql.tables_priv set Table_priv="Select,insert"

where user="yaya";

mysql> flush privileges;

mysql> show grants for yaya@"%";

3.4权限撤销(权限撤销了,用户还在,对数据库有过授权才可以撤销权限)

有过授权指的是授权时的库.表对应,比如:

3.4.1基本用法:

revoke 权限列表 on 数据库名.表名 from 用户名@”客户端地址”;

ps:撤销时数据库.表名必须与授权时相同,不同撤销不了,比如授权时授权的数据库.表名为*.*,则撤销db1.*也不行,即使*.*包含了db1;

-用户删了,权限自动也没了

基本用法:drop user ‘用户名’@‘客户端地址’;

ps:也可以直接在user表里删记录,这样就不能通过此用户登陆数据库了,相当于删了用户,但该用户在db表、table表以及columns表的记录还在,此时也还可以执行drop 该用户的操作,一旦用户被drop,全部记录都没有了。

基本用法:set password=password(“新密码”);

3.4.4 管理员root修改授权用户密码

基本用法:set password for 用户名@“客户端地址”=password(“新密码”);

附录:权限关键字及说明

命令 权限

usage 无权限

SELECT 查询表记录

INSERT 插入表记录

UPDATE 更新表记录

DELETE 删除表记录

CREATE 创建库、表

DROP 删除库、表

RELOAD 有重新载入授权 必须拥有reload权限,才可以执行flush [tables | logs | privileges]

SHUTDOWN 允许关闭mysql服务 使用mysqladmin shutdown 来关闭mysql

PROCESS 允许查看用户登录数据库服务器的进程 ( show processlist; )

FILE 导入、导出数据

REFERENCES 创建外键

INDEX 创建索引

ALTER 修改表结构

SHOW DATABASES 查看库

SUPER 关闭属于任何用户的线程

CREATE TEMPORARY TABLES 允许在create table 语句中使用 TEMPORARY关键字

LOCK TABLES 允许使用 LOCK TABLES 语句

EXECUTE 执行存在的Functions,Procedures

REPLICATION SLAVE 从主服务器读取二进制日志

REPLICATION CLIENT 允许在主/从数据库服务器上使用 show status命令

CREATE VIEW 创建视图

SHOW VIEW 查看视图

CREATE ROUTINE 创建存储过程

ALTER ROUTINE 修改存储过程

CREATE USER 创建用户

EVENT 有操作事件的权限

TRIGGER, 有操作触发器的权限

CREATE TABLESPACE 有创建表空间的权限


分享到:


相關文章: