1. 程式人生 > >MySQL數據庫(二)

MySQL數據庫(二)

stun 建立索引 inux 性別 寫法 _id value extract gre

MySQL數據庫的五大約束
  • NOT NULL :非空約束,指定某列不能為空;
    #建表時指定
    create table t2(id int(10) not null,name varchar(5));
    #已存在的表增加約束
    alter table t2 modify name varchar(5) not null;
    #可以設置默認值,即為非空
    alter table t2 constraint test_id default (‘xxx’) for stuname;
    #取消
    alter table t2 modify name varchar(5);
  • UNIQUE : 唯一約束,指定某列或者幾列組合不能重復
    #創建的時候制定
    create table t3(userid int(10) unique,name varchar(10));
    #已存在的表增加
    alter table t3 add constraint t3_id unique(id)
    #關鍵字增加唯一約束
    alter table test4 add unique(id,name,age)
  • PRIMARY KEY :主鍵,指定該列的值可以唯一地標識該列記錄
    #建表時添加
    create table test1(user_id int(10) primary key,name varchar(10));
    #刪除約束
    alter table test1 drop primary key;
    #以多列組合創立主鍵
    create table t4 (id int,name varchar(255),primary key(id,name));
    #已存在的表增加主鍵
    alter table stu add constraint id primary key (id)
  • FOREIGN KEY :外鍵,指定該行記錄從屬於主表中的一條記錄,主要用於參照完整性
    #創建表的時候
    CREATE TABLE `students` (
    `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `Name` varchar(50) NOT NULL,
    PRIMARY KEY (`StuID`),
    KEY `hello_fk` (`Name`),
    CONSTRAINT `hello_fk` FOREIGN KEY (`Name`) REFERENCES `classes` (`Name`)
    ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8
    #已存在的表增加
    alter table students add constraint mage_stu_class_fk foreign key(classid) references classes(classid);
  • CHECK :檢查,指定一個布爾表達式,用於指定對應的值必須滿足該表達式(mysql不支持check約束)

?


?

MySQL數據庫的函數

內置函數

  • 字符串型
    #upper轉換為大寫輸出
    MariaDB [hellodb]> select upper(name) from teachers;
    #lower轉換為小寫輸出
    MariaDB [hellodb]> select lower(name) from teachers;
    #insert替換函數(列名,從第幾位開始,替換幾位,替換的內容)
    MariaDB [hellodb]> select name,insert(phone,4,4,‘****‘) phone from students;
    #substr從第5位開始取,往後一共取3位
    MariaDB [hellodb]> select substr(name,5,3) phone from students;
    #length顯示字段的長度
    MariaDB [hellodb]> select length(name) phone from students;
    #CONCAT(s1,s2...sn) 字符串 s1,s2 等多個字符串合並為一個字符串
    MariaDB [hellodb]> SELECT CONCAT("hello ", "mariadb ", "mysql ", "orcale") AS ConcatenatedString;
    #FIELD(s,s1,s2...)  返回第一個字符串 s 在字符串列表(s1,s2...)中的位置
    MariaDB [hellodb]> SELECT FIELD("c", "a", "b", "c", "d", "e");
    #LEFT(s,n)  返回字符串 s 的前 n 個字符
    MariaDB [hellodb]> SELECT LEFT(‘abcde‘,2);
    #REPEAT(s,n)    將字符串 s 重復 n 次
    MariaDB [hellodb]> SELECT REPEAT(‘mariadb ‘,3);
    #SUBSTRING(s, start, length)    從字符串 s 的 start 位置截取長度為 length 的子字符串
    MariaDB [hellodb]> SELECT SUBSTRING("mariadb", 2, 3) AS ExtractString;
  • 日期函數
    #顯示當前的時間
    MariaDB [hellodb]> select now();
    #DATEDIFF(d1,d2)    計算日期 d1->d2 之間相隔的天數
    MariaDB [hellodb]> SELECT DATEDIFF(‘2001-03-01‘,‘2001-02-02‘);
    #DATE_FORMAT(d,f)   按表達式 f的要求顯示日期 d
    MariaDB [hellodb]> SELECT DATE_FORMAT(‘2011-11-11 11:11:11‘,‘%Y-%m-%d %r‘);
    #DAY(d) 返回日期值 d 的日期部分   
    MariaDB [hellodb]> SELECT DAY("2017-06-15");  
    #DAYNAME(d) 返回日期 d 是星期幾
    MariaDB [hellodb]> SELECT DAYNAME(‘2011-11-11 11:11:11‘);
    #DAYOFMONTH(d)  計算日期 d 是本月的第幾天
    MariaDB [hellodb]> SELECT DAYOFMONTH(‘2011-11-11 11:11:11‘);
    #WEEK(d)    計算日期 d 是本年的第幾個星期
    MariaDB [hellodb]> SELECT WEEK(‘2011-11-11 11:11:11‘);
  • 數字函數
    #取絕對值
    MariaDB [hellodb]> select abs(-20);
    #取模
    MariaDB [hellodb]> select mod(11,3);
    #取不小於X的最小整數
    MariaDB [hellodb]> select ceil(9.2);
    #取不大於X的最大整數
    MariaDB [hellodb]> select floor(3.6);
    #n DIV m    整除,n 為被除數,m 為除數
    MariaDB [hellodb]> SELECT 10 DIV 5;
    #GREATEST(expr1, expr2, expr3, ...) 返回列表中的最大值
    MariaDB [hellodb]> SELECT GREATEST(3, 12, 34, 8, 25);
    MariaDB [hellodb]> SELECT GREATEST("mysql", "mariadb", "linux");

    自定義函數

    #查看所有的函數數列
    MariaDB [hellodb]> show function status\G;
    #創建無參的函數(在centos7支持,6不支持)
    MariaDB [test]> CREATE FUNCTION simple() RETURNS VARCHAR(20) RETURN "Hello World!";
    #調用函數
    MariaDB [test]> select simple();
    #查看指定自定義函數的定義
    MariaDB [mysql]> show create function simple\G;
    #創建帶參的函數
    MariaDB [test]> delimiter // #為了方便書寫把結束符重新定義
    MariaDB [test]> create function addtwo(x int unsigned,y int unsigned) returns int begin declare a,b int unsigned; set a=x,b=y; return a+b; end//
    #刪除自定義函數
    MariaDB [test]> drop function simpleFun;

    ?


?

MySQL數據庫的視圖

#創建視圖
MariaDB [hellodb]> create view viewname as select * from teachers;
#查詢指定視圖
MariaDB [hellodb]> select * from viewname;
#查看所有的視圖信息
select * from information_schema.views\G;
#查看視圖的結構
desc viewname
#刪除視圖
MariaDB [hellodb]> drop view viewname;

不支持做視圖的語句

  • select 子句中的distninct
  • select 子句中的包含函數
  • select 子句中包含group by
  • select 子句中包含union

使用視圖的好處

  • 使用視圖,可以定制用戶數據,聚焦特定的數據。
    例如:有張表裏面有好多個屬性:編號、學號、姓名、性別,生日、手機。。。等等,而且這張表會被經常被使用,但是你只想使用表裏的兩三個屬性,這個時候你可以把你需要的屬性建立成視圖,從視圖裏查詢即可。
  • 使用視圖,可以簡化數據操作。
    例如:你要經常性的寫多表連接,嵌套查詢,這些語句很長,每次書寫很費時間,這個時候你就可以把這些長句子寫進視圖,下次直接在這個試圖查詢即可
  • 使用視圖,基表中的數據就有了一定的安全性。
    例如:視圖實際上是虛擬的,真實不存在的,假如銀行的數據表,不可能給員工把真正表給他們,而是做一個原表的視圖,這樣既保證了員工的誤操作帶來的損失,又可以防止對數據表惡意修改
  • 可以合並分離的數據,創建分區視圖。
    例如:可以把多條數據用union合成一個視圖
    ?

?

MySQL數據庫的索引

使用索引的優點:

  • 所有的MySql列類型(字段類型)都可以被索引,也就是可以給任意字段設置索引
  • 大大加快數據的查詢速度

使用索引的缺點:

  • 創索引和維護索引要耗費時間,並且隨著數據量的增加所耗費的時間也會增加
  • 索引也需要占空間,我們知道數據表中的數據也會有最大上線設置的,如果我們有大量的索引,索引文件可能會比數據文件更快達到上線值
  • 當對表中的數據進行增、刪除、修改時,索引也需要動態的維護,降低了數據的維護速度

索引的使用原則:

  • 對經常更新的表就避免對其進行過多的索引,對經常用於查詢的字段應該創建索引
  • 數據量小的表最好不要使用索引,因為由於數據較少,可能查詢全部數據花費的時間比遍歷索引的時間還要短,索引就可能不會產生優化效果
  • 在一同值少的列上(字段上)不要建立索引,比如在學生表的"性別"字段上只有男,女兩個不同值。相反的,在一個字段上不同值較多可是建立索引
    #創建索引
    MariaDB [m33student]> create index age_index on student(phone);
    #查看索引
    MariaDB [m33student]> show indexes from student\G;
    #創建唯一索引
    create table ti(
                id int not null,
                name char(30) not null,
                unique index uniqidx(id)
            );#對id字段使用了索引,並且索引名字為UniqIdx
    #創建普通索引
    create table book( 
                bookid int not null, 
                bookname varchar(255) not null, 
                authors varchar(255) not null, 
                info varchar(255) null , 
                comment varchar(255) null, 
                year YEAR  not null, 
                index(year) #對屬性年創建索引
            );
    #修改表結構(添加索引)
    MariaDB [hellodb]> alter table teachers add index index_name(name);
    #刪除索引
    MariaDB [hellodb]> drop index [indexn_ame] on teachers; 
    #顯示索引信息
    MariaDB [hellodb]> show index from teachers\G;

    ?


?

MySQL數據庫的觸發器

觸發器是一個特殊的存儲過程,不同的是存儲過程要用來調用,而觸發器不需要調用,也不需要手工啟動,只要當一個預定義的事件發生的時候,就會被MYSQL自動調用。
簡單格式:

create trigger trigger_name
trigger_time
trigger_event on table_name
trigger_stmt
for each row(行級監視,mysql固定寫法,oracle不同)
begin
  sql語句集........(觸發器執行動作,分號結尾)
end;

trigger_name:觸發器的名稱
trigger_time:{ BEFORE | AFTER },表示在事件之前或之後觸發
trigger event::{ INSERT |UPDATE | DELETE },觸發的具體事件
trigger_stmt:觸發器程序體,可以是一句SQL語句,或者用 BEGIN 和 END 包含的多條語句。
實驗:創建一個觸發器,制定一張表,對表增加記錄的時候count加1,則反之

#創建student_info表
MariaDB [hellodb]> create table student_info(stu_id int(11) primary key auto_increment,stu_name varchar(255) default null);
#創建一張計數表
MariaDB [hellodb]> create table student_count( student_count int(11) default 0);
#使計數表置為0
MariaDB [hellodb]> insert into student_count values (0);
#創建觸發器,給student_info表增加記錄,計數表加一
MariaDB [hellodb]> create trigger trigger_student_count_insert after insert on student_info for each row update student_count set student_count=student_count+1;
#創建觸發器,給student_info表刪除記錄,計數表減一
MariaDB [hellodb]> create trigger trigger_student_count_delete after delete on student_info for each row update student_count set student_count=student_count-1;
#開始測試,添加記錄
MariaDB [hellodb]> insert into student_info (stu_id,stu_name) values (123,‘abc‘);
#會看到計數表為1
MariaDB [hellodb]> select * from student_count;
#開始測試,刪除記錄
MariaDB [hellodb]> delete from student_info where stu_id=123;
#會看到計數表為0
MariaDB [hellodb]> select * from student_count;

?


?

MySQL數據庫的用戶管理

  1. 創建用戶
    MariaDB [hellodb]> create user name@host identified by ‘passwd‘;
    #創建全部權限的用戶
    MariaDB [hellodb]> grant all on *.* to name@host identified by ‘passwd‘;
  2. 修改密碼
    #第一種直接利用password函數修改
    MariaDB [hellodb]>set password for name@‘host‘=password("newpasswd");
    #第二種更新用戶表
    MariaDB [hellodb]> update mysql.user password=password("passwd") where host =‘localhost‘
    #第三種關閉MySQL密碼驗證功能,然後第一種第二種
    /etc/my.cnf 關閉密碼認證 skip_grant_tables
  3. 用戶授權
    #給用戶授權使用庫,表,視圖
    MariaDB [hellodb]> grant all on database.(database|table|view) to name@host ;
    #給用戶授權使用命令select,insert
    MariaDB [hellodb]> grant select,insert on database.(database|table|view) to name@host;
    #給用戶授權使用表或視圖裏的屬性
    MariaDB [hellodb]> grant select(屬性) on database.(database|table|view) to name@host;
  4. 查看授權內容
    MariaDB [hellodb]>show grant for name@host;
  5. 回收授權
    MariaDB [hellodb]>revoke commod|all on database.(database|table|view) from name@host; 

MySQL數據庫(二)