程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 搞定linux上MySQL編程(三):MySQL高級語法

搞定linux上MySQL編程(三):MySQL高級語法

編輯:MySQL綜合教程

搞定linux上MySQL編程(三):MySQL高級語法


本節介紹Mysql高級語法,包括試圖、存儲過程、索引等,通過使用試圖、觸發器等來優化數據庫設計和查詢技術,提高數據處理能力與效率。 視圖操作: 視圖是一個虛擬表,內容由查詢定義。視圖並不在數據庫中以存儲的數據值集形式存在,行和列數據來源於定義視圖的查詢所引用的表,且在引用試圖時動態生成。從數據庫系統外部來看,視圖就如同一張表一樣,對表能夠進行的一般操作的哦可以應用於視圖,例如查詢、插入、修改、刪除等。

視圖是存儲在數據庫中的用於查詢的sql語句,使用視圖可使復雜的查詢易於理解和使用,且可以隱藏一些數據,保證安全。視圖一經定義便存儲在數據庫中,與其相對應的數據並沒有想表那樣又在數據庫中再存儲一份,通過視圖看到的數據只是存放在基本表中的數據。對 視圖所見數據修改或基本表數據發生變化時,都會反映到基本表或視圖中。
使用視圖有如下好處: 1.視點集中,視圖集使用戶只關心感興趣的某些特定數據和他們所負責的特定任務。 2.簡化操作,每次執行相同操作查詢時,不必重新寫這些復雜的查詢語句,只要一條簡單的查詢視圖語句即可。 3. 定制數據,視圖可以讓不同用戶以不同方式看到不同的數據集,這在許多不同級別用戶共享同一數據庫時十分重要。 4.合並分割數據。 5.安全,通過視圖用戶只能查看和修改他們所能看到的數據,其他數據庫或表既不可見也不可以訪問。

創建視圖語法: CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] select_statement是一種SELECT語句,它給出了視圖的定義。該語句可從基表或其他視圖進行選擇。視圖屬於數據庫。在默認情況下,將在當前數據庫創建新視圖。要想在給定數據庫中明確創建視圖,創建時,應將名稱指定為db_name.view_name 。表和視圖共享數據庫中相同的名稱空間,因此,數據庫不能包含具有相同名稱的表和視圖。
例如創建包含id和最last_login的視圖:
mysql> create view db_users.v_idlogin as select userid, last_login as login_date  from tb_users where birth < '1980-1-1';
Query OK, 0 rows affected (0.04 sec)
mysql> show tables;
+--------------------+
| Tables_in_db_users |
+--------------------+
| tb_users           |
| v_idlogin          |
+--------------------+
2 rows in set (0.00 sec)
mysql> select * from v_idlogin;
+--------+------------+
| userid | login_date |
+--------+------------+
|  10003 | 2014-09-20 |
|  10004 | 2015-02-10 |
+--------+------------+
2 rows in set (0.02 sec)
刪除視圖如下:
mysql> drop view if exists v_idlogin;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+--------------------+
| Tables_in_db_users |
+--------------------+
| tb_users           |
+--------------------+
1 row in set (0.00 sec)
存儲過程: 一個良好的數據庫都會用到存儲過程。存儲過程是一組為了完成特定功能的sql語句集,經過編譯後存儲在數據庫中。存儲過程的實質就是部署在數據庫端的一組定義代碼以及SQL,將常用的或很復雜的工作預先用sql語句寫好並用一個指定的名稱存儲起來,那麼以後要讓數據庫提供與已定義好的存儲過程的功能相同的服務時,只需調用即可自動完成命令。 存儲過程增強了sql語言的功能和 靈活性。存儲過程可以用流控制語句編寫,完成復雜的運算,有很強的靈活性。 存儲過程保證了數據的安全性和完整性,通過存儲過程可以使沒有權限的用戶在控制之下間接地存取數據庫,從而保證數據的安全。 存儲過程語法: CREATE PROCEDURE sp_name ([ proc_parameter[,...]]) [ characteristic ...] routine_body 句創建存儲子程序。要在MySQL 5.1 中創建子程序,必須具有CREATE ROUTINE權限,並且ALTER ROUTINE和EXECUTE權限被自動授予它的創建者。如果二進制日志功能被允許,你也可能需要SUPER 權限,默認地,子程序與當前數據庫關聯。要明確地把子程序與一個給定數據庫關聯起來,可以在創建子程序的時候指定其名字為db_name.sp_name。
存儲子程序可以使用BEGIN ... END復合語句來包含多個語句。 [ begin_label :] BEGIN [ statement_list] END [end_label] statement_list 代表一個或多個語句的列表。statement_list之內每個語句都必須用分號(;)來結尾。 下面創建一個簡單的存儲過程:
mysql>
mysql> delimiter $
mysql> create procedure get_one_user(
    -> in id int)
    -> begin
    -> select * from tb_users where userid>id;
    -> end;
    -> $
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
調用存儲過程使用call語句:
mysql> call get_one_user(10005)
    -> ;
+--------+----------+------------+------------+
| userid | username | birth      | last_login |
+--------+----------+------------+------------+
|  10007 | Hamilton | 1988-07-07 | 2014-11-16 |
|  10008 | Johnson  | 1986-06-07 | 2015-01-23 |
|  10009 | James    | 1989-08-17 | 2013-12-23 |
|  10010 | james    | 1984-12-30 | 2014-12-23 |
|  10011 | Gay      | 1987-02-03 | 2014-12-23 |
|  10012 | Kaman    | 1981-04-04 | 2010-01-13 |
|  10006 | Wade     | 1982-03-04 | 2012-05-19 |
+--------+----------+------------+------------+
7 rows in set (0.04 sec)

Query OK, 0 rows affected (0.04 sec)
索引: 索引是對數據庫表中一列或多列的值進行排序的一種結構,是某個表中一列或多列值得集合和相應的指針向表中物理標識這些值得數據頁的邏輯指針清單。 創建索引可以大大提高系統性能,若果沒有索引,執行查詢是mysql必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄,表裡面記錄越多,這個操作的代價就越高。但如果作為搜索條件的列上已經創建了索引,mysql無需掃描任何記錄即可迅速地得到目標記錄所在位置。 創建索引語法為: create [unicode | fulltext | spatial] index index_name [using index_type] on tbl_name (index_col_name, ...) mysql提供以下幾種索引類型選擇:普通索引(create index)、唯一性索引(create unique index)、主鍵(primary key)、全文索引(fulltext)。其中普通索引、唯一性索引和主鍵也可以在創建或修改表時指定。 以唯一性索引為例,直接創建唯一索引語法如下:
mysql> select * from tb_users;
+--------+----------+------------+------------+
| userid | username | birth      | last_login |
+--------+----------+------------+------------+
|  10000 | Allen    | 1981-01-01 | 2014-02-02 |
|  10001 | Ben      | 1982-04-02 | 2014-04-30 |
|  10002 | Curry    | 1985-08-12 | 2014-01-17 |
|  10003 | Davis    | 1978-07-12 | 2014-09-20 |
|  10004 | Ellis    | 1979-09-02 | 2015-02-10 |
|  10005 | Faried   | 1984-02-05 | 2014-12-01 |
|  10007 | Hamilton | 1988-07-07 | 2014-11-16 |
|  10008 | Johnson  | 1986-06-07 | 2015-01-23 |
|  10009 | Jackson  | 1989-08-17 | 2013-12-23 |
|  10010 | James    | 1984-12-30 | 2014-12-23 |
|  10011 | Gay      | 1987-02-03 | 2014-12-23 |
|  10012 | Kaman    | 1981-04-04 | 2010-01-13 |
|  10006 | Wade     | 1982-03-04 | 2012-05-19 |
+--------+----------+------------+------------+
13 rows in set (0.00 sec)

mysql> create unique index idx_name on tb_users(username(5));
Query OK, 13 rows affected (0.13 sec)
Records: 13  Duplicates: 0  Warnings: 0

mysql> 
主鍵是一種特殊的唯一索引,不允許有空值,一般在創建表時同時創建主鍵索引。一個表只能有一個主鍵。
一般來說應該在這些列上創建索引: 經常需要搜索的列(加快搜索速度)、經常用於連接的列(加快連接速度)、經常需要根據范圍進行搜索的列、經常需要排序的列、經常使用在where子句中的列上。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved