1. 程式人生 > >Linux資料庫管理——day4——多表查詢、phpMyAdmin管理工具、修改資料庫使用者密碼、使用者授權

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 opion;

    具體各部分解釋:    

許可權列表( 許可權可以理解為, 可以使用 用同名的命令的權力 )
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。