MySQL的進階部分

1.MySQL的表的約束

(1)數據完整性的介紹:

  所謂的數據的完整性就是,數據的準確性和可靠性。能夠經過添加完整性約束來提升數據的完整性:mysql

  • 實體完整性:爲每個實體(記錄)肯定一個惟一標識。
    • 實現方式:主鍵約束、惟一約束、主鍵自增
  • 域完整性:表示字段是完整的
    • 實現方式:字段的類型、非空約束、默認值
  • 引用完整性:參照表和被參照表
    • 實現方式:外鍵約束
  • 自定義完整性:自定義某些字段的範圍
    • 實現方式:檢查約束(MySQL暫不支持)

(2)表字段添加約束和刪除

主鍵約束
  要求:要求主鍵列數惟一,而且不能爲空,主鍵能夠包含表的一列或多列(能夠是一個列成爲主鍵,也能夠是幾個列組合成爲主鍵)。儘可能不要選擇業務數據爲主鍵。
   做用:主鍵是惟一能肯定一行數據的字段。
建立主鍵的三種方式:sql

#例1:
#建立字段的時候添加約束
create table stu(
id int primary key ,
sname varchar(20));
#例2:
#最後添加約束
create table stu(
id int ,
sname varchar(20),
primary key(id));
#例3
#表已經建立,而後添加約束
create table stu(
id int  ,
sname varchar(20));
alter table stu add constraint ky_id primary key(id);

ps:若是想加入主鍵自增,只須要在primary key 後面加入:auto_increment

刪除主鍵約束:數據庫

#刪除主鍵約束,首先要刪除他的主鍵自增,而後在刪除:
alter table stu modify id int //刪除主鍵自增
alter table stu drop primary key;  //刪除主鍵約束

惟一約束
  要求:要求該列惟一,容許爲一個空。安全

#例:
alter table stu add constraint unique(sname)

刪除惟一約束服務器

#在刪除惟一約束時,首先須要刪除索引,由於在建立惟一約束時默認會建立一個索引
alter table stu drop index sname
alter table stu drop index 惟一約束名

非空約束
  要求:某類內容不容許爲空
  語法:name varchar(50) not null
默認值
  要求:當字段沒有給固定的值得時候,自動賦初值。
  語法:name varchar(50) default ‘zs’;
外鍵約束
  要求:一個表中的某個字段必須與另外一張表中的某個字段相等,若是不相等,或者另外一張表沒有這個值,則存儲失敗。
  語法:foreign key(表的字段) references 外表名(字段)ide

#例:添加外鍵約束
alter table table1 add constraint foreign key(須要設爲外鍵的字段) references  table2(父表的關聯字段)

(3) 舉例:

CREATE TABLE `t_book` (
  `bid` int(10) NOT NULL,
  `bname` varchar(50) NOT NULL,
  `price` double DEFAULT NULL,
  `author` varchar(50) DEFAULT NULL,
  `authorid` int(10) DEFAULT NULL,
  PRIMARY KEY (`bid`),
  UNIQUE KEY `author` (`author`)
) ;

2.MySQL的索引

  描述:在數據庫中用來加速對錶的查詢,經過使用快速路徑訪問的方法,快速定位數據,減小了磁盤的IO。
  類型:B-Tree索引、位圖索引、哈希索引。在不一樣的存儲引擎中對索引的存儲策略不一樣:
    - Myisam引擎:葉子節點中保存記錄的地址
    - Innodb引擎:葉子節點中直接保存相應的數據。(B+樹索引)
   索引的優勢:創建索引能夠加快查詢的速度,而下降增、刪、改的效率。
   索引的建立:索引的建立分爲兩種:自動建立和手動建立:
     - 自動建立:當在表中定義了一個主鍵,或者惟一約束時,數據庫會自動的建立一個對應的惟一索引。
     - 手動建立:oop

#普通索引
create index index_name on t_name(field)
#惟一索引
create unique index index_name on t_name(field)
#複合索引
create  index index_name on t_name(field1,field2)

   索引的使用條件:當經過設置索引的字段做爲過濾條件時查詢的語句,纔會用到索引。
   索引的效率
在查詢時使用:explain select * from emp where ename='scott'; explain關鍵字用於查看索引的效率:
MySQL的進階部分
關於type的級別:
MySQL的進階部分
   使用索引的注意點
    - 索引與表是分開保存的,會佔用大量的磁盤空間
    - 索引改善了檢索數據的性能,可是下降了增、刪、改數據的性能。
    - 限制索引中索引數目。索引越多,數據庫的工做量越大
    - 索引用於數據過濾和數據排序(表的數據量比較大,常用某些字段作排序和查詢,創建索引)性能

3.MySQL的視圖

   介紹:視圖是從若干個表和其餘視圖中構造出來的虛表,並不是是以物理文件保存數據,在執行過程當中動態從基表中獲取數據,以表爲底層。code

#例:建立視圖
create view v_viem as select * from emp1 where deptno =20;
#修改視圖:
update v_viem set deptno=10;
#查詢視圖
select * from v_viem;
注意:視圖通常不建議進行刪除、修改操做,由於他會影響到基表。以上的案例表示:若是修改了建立視圖的條件字段,可是視圖在查詢時還按照原有的條件查詢,會致使查詢的數據不許確。
# 控制視圖 不能修改字段:
CREATE 
    OR REPLACE VIEW v_emp AS SELECT
    * 
FROM
    emp 
WHERE
    deptno = 20 WITH CHECK OPTION;
    注意:使用上面的方式,建立視圖,若是想對視圖的條件字段進行修改,就會出現:
1369 - CHECK OPTION failed 'db1807.v_emp',錯誤。

   對視圖的操做blog

#查詢視圖
select * from v_emp;
#在視圖中插入數據
insert into v_emp(field1,field2,field3) values(value1,value2,value3)
#重建視圖
create or REPLACE view t_view as select * from emp where sal >2000
#銷燬視圖
drop view view_name

   視圖的優勢:
    - 安全性:bao保密敏感字段
    - 提升查詢效率
    - 定製化SQL:能夠將多張表中常常被使用的數據放置在視圖中,快速查詢。

4.MySQL的建立用戶與受權

  原本覺得這部分不重要,不,應該說不會是本身去操做MySQL的DCL,由於公司都有本身的數據庫管理員,我們使用MySQL都會有特殊的權限限制,能經過特定的用戶,可是通過幾回的安裝集羣后發現,最初hadoop平臺搭建的時候,這個MySQL的受權操做還得本身來,每次都會由於hive初始化元數據庫、Azkaban組件安裝糾結半天。得嘞,本身總結下吧,以避免下次在糾結。

(1)MySQL建立&&刪除用戶

語法:

CREATE USER 'username'@'host' IDENTIFIED BY 'password';
  • username:你將建立的用戶名
  • host:指定該用戶在哪一個主機上能夠登錄,若是是本地用戶可用localhost,若是想讓該用戶能夠從任意遠程主機登錄,可使用通配符%
  • password:該用戶的登錄密碼,密碼能夠爲空,若是爲空則該用戶能夠不須要密碼登錄服務器
CREATE USER 'hadoop'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'hive'@'192.168.1.101' IDENDIFIED BY '123456';
CREATE USER 'hadoop'@'%' IDENTIFIED BY '123456';
CREATE USER 'hive'@'%' IDENTIFIED BY '';
CREATE USER 'azkaban'@'%';

建立用戶成功後,就能夠經過這個用戶登陸:

$mysql -hmysql_host -uhadoop -p123456

刪除用戶:

DROP USER 'username'@'host';

(2)MySQL受權

  只有擁有特定權限的用戶才能執行特定的操做。
語法:

GRANT privileges ON dbname.tableanme TO 'username'@'host';
  • privileges:用戶的操做權限,如SELECT,INSERT,UPDATE等,若是要授予所的權限則使用ALL
  • databasename:數據庫名
  • tablename:表名,若是要授予該用戶對全部數據庫和表的相應操做權限則可用*表示,如 *.*
    例:
GRANT SELECT, INSERT ON test.user TO 'hadoop'@'%';
GRANT ALL ON *.* TO 'hadoop'@'%';
GRANT ALL ON maindataplus.* TO 'hadoop'@'%';

受權以後通常都會刷新該操做:

mysql>flush privileges;

撤銷受權

REVOKE privilege ON databasename.tablename FROM 'username'@'host';

其中的內容與受權操做相似。

(3)設置和修改MySQL用戶密碼

命令:

SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');

若是修改當前用戶的密碼則:

SET PASSWORD = PASSWORD("newpassword");

舉例:

SET PASSWORD FOR 'hadoop'@'%' = PASSWORD("123456");
相關文章
相關標籤/搜索