數據庫管理入門之四(末尾有彩蛋)

一、多表查詢

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 有創建表空間的權限


分享到:


相關文章: