– 索引:
(在某種程度上可以把數據庫看做是一本書,吧索引看做是書的目錄,通過目錄查找書中的信息,比沒有目錄的書方便快捷)**
索引一旦創立,將由數據庫自動管理和維護;
須知:在sql中語法格式的一些約定符號:
- 尖括號<>中的內容爲必選項;
- 中括號[]中的內容爲任選項;
- [,…]的意思是等等;
- 大括號{}與豎線 | 表明此處爲選擇項,在所列出的各項中僅需選擇一項;
索引分爲:
--普通索引和唯一索引;
--單列索引和組合索引;
--全文索引;
--空間索引;
組合索引,是指在表的多個字段創建的索引;
全文索引,允許在這些索引列中插入重複值和空值,全文索引可以在char,varchar,或者text類型的列上創建;mysql中只有MyISAM存儲引擎支持全文索引;
創建索引的注意事項:
當給表創建unique約束時,mysql會自動創建唯一索引;
索引的名稱必須符合mysql的命名規範,且必須是表中唯一
可以在創建表時創建想索引,或是給現存表創建索引;
只有表的所有者才能給表創建索引;
創建唯一索引時,應保證創建索引的列不包括重複的數據(兩個爲null的也算重複值),如果有這種數據,必須現將其刪除,否者索引不能被成功創建;
-------------------------------
創建索引基本格式1:[unique|fulltext|spatial]<index|key> [索引名](屬性名[(長度)][asc|desc][,...])
創建索引基本格式2:create [unique|fulltext|spatial] index <索引名> on <表名> (屬性名[(長度)][asc|desc][,...]);
刪除索引基本格式:drop index<索引名> on <表名>;
-------------------------------
-- 在創建表的時候創建索引;
create table student(
...
unique index id_sno(sno) desc
);
------------------------------
-- 在現有表中創建索引:
----------------------------------
-- 刪除索引:
drop index id_name on student;
– 視圖
提示:保存視圖的時候,實際上保存的就是select查詢.保存的是視圖的定義而不是select查詢的結果;
注意:創建視圖時,注意編碼要保持一直,不然會報1267的error.出現亂碼現象;
-- sql語句創建視圖(創建視圖是不要用 阿拉伯數字命名 ,刪除時好像有語法錯誤):
create View view_name [(Column[,...n])]
as <select語句>
[with check option]
說明:with check option:強制所有通過視圖修改的數據瞞住select語句中指定的選擇條件;
----------------------
事例:
create view v_name
as
select A.sno,sname,cname,degree
from student A,course B,sc C
where A.sno and B.cno=C.cno and cname='數據庫';
----------------------
視圖定義後,可以像基本表一樣進查詢.例如:
select * from v_name;
-- 視圖的使用:
注意:修改視圖,會同時修改基表;
注意:如果視圖中有下面所述屬性,則插入,更新或者刪除操作將失敗 :
-1-視圖定義中的from子句包含兩個或者多個表,且select選擇列表達式中的列包含來自多個表的列;
-2-視圖的列是從集合函數派生的;
-3-視圖中的select語句包含group by 子句或distinct選項;
-4-視圖的列是從常量或表達式派生的;
-- 視圖的修改:
alter View View_name [(column[,...n])]
as <select語句>
-- 如果在創建視圖的時使用了with check option,則在alter中也必須使用;
[with check option]
--視圖的刪除
drop View <視圖名> --可同時刪除多個,多個時用 , 分開;
– SQL語言基礎(存儲過程和函數):
1.常量8種;
-- 字符串常量,十進制常量,十六進制常量,日期常量,實型常量,位字段值,布爾常量,null常量;
2.變量;
-- 變量名不能和命令和函數名相同;
-- 在mysql中存在三種類型的變量:系統變量,用戶變量,局部變量;其中系統變量有分爲全局變量和會話變量兩種;
-- 1.全局變量和回話變量.全局變量在mysql啓動時由服務器自動將他們初始化爲默認值,這些默認值可以通過my.ini文件來更改;
-- 會話變量在每次創建新的連接的時候,由mysql來初始化,mysql會將當前所有全局變量的值複製一份作爲會話變量;
-- 大多數的系統變量應用於其他sql產品保持一致,某些特定的系統變量是要省略 @@ 的,如:current_date,current_user;
-- 可以使用系統全局變量@@version查看當前使用的mysql的版本信息和當前日期,sql語句如下:
select @@version as '當前系統版本',current_date;
-- 圖片如下 -- 圖1:
——————
-- a.顯示系統清單:
show [global|session] variables [like '字符串'];
其中,global表示全局變量,session爲會話變量.默認爲會話變量;
-- 例:
表示以 a 開頭的所有系統變量的值:show variables like 'a%';
圖片如下 -- 圖2:
—————–
--b.修改系統變量的值:
形如:
set system_var_name = expression
set_system_var_name爲系統變量名,名稱前面可以添加,global或session等關鍵字;
-- 注意: 1.要想更改全局變量的值,需要擁有super權限;
2.有些系統變量不可以改變,如:系統版本,系統日期;
-- 用戶變量:
定義和初始化一個用戶變量可以使用set或select語句,其語法格式如下:
set @user_variable[:] = expression1 [,user_variable = expression2,...]
或
set @user_variable:=expression [,user_variable:= expression2,...];
-- 說明:對於set語句,可以使用 = 或 := 作爲分配符.也可以用select 語句代替set語句來爲用戶變量分配一個值,在這種情況下,分配符必須爲 := ,而不能是 = ,因爲在非set語句中 = 被視爲比較操作符;
-- 例如:創建用戶變量name並賦值爲 王小強;
set @name = '王小強';
或
select @name := '王小強';
注意:1. @ 符號必須放在一個用戶變量的前面, 便於與列名區分開,如果給name重新賦不同類型的
2.在group by,order by,having中不能使用select中的用戶變量,因爲在select中,表達式發送
到客戶端後才進行計算;
-- 局部變量:
局部變量的作用範圍實在begin...end語句塊中,可以使用declare 語句進行定義,局部變量不用 @ ;
局部變量與begin...end語句塊,流程控制語句只能用於函數,存儲過程,觸發器和事務的定義中;
基本語法:declare var_name [,...] type [default value]
例子:declare myvar int default 10;
賦值: set myvar = 100;
--3.sql流程控制語句:
--注:流程控制語句必須和存儲過程和存儲過程配合
---------------
begin
...
end
----------------
if ... then
...
else if ... then ...
else ...
end if;
-- 注意:如果邏輯表達式中有select語句必須用括號把select括起來;
-----------------
-- 這個語句運行好像不對:
if (select office from department where deptname = '計算機工程系') is null then
begin
select '辦公地點不像' as 辦公地點;
select * from department where deptname = '計算機工程系';
end;
else
select office from department where deptname = '計算機工程系';
end if;
----------------------
case分支語句:
基本格式:case input_expression
when when_expression then result_repression;
[...n]
[else else_result_expression];
end case;
說明:1.input_expression:使用case語句時所計算的表達式,可以是任何有效的表達式.
2.when_expression:用來和input_expression表達式作比較的表達式,
input_expression和每個when_expression表達式的數據類型必須相同,或者可以隱形轉換;
3.result_expression:指當input_expression=when_expression的取值爲true時,需要返回
的表達式.
4.else_result_expression:指當input_expression=when_expression的取值爲false時,
需要返回的表達式;
例子:
declare dj int default 0;
select count(*) into dj from sc where degree<60;
case
when dj>=100 then select '不及格門數' as 檔次;
when dj>=50 and dj<100 then select '不及格門數一般' as 檔次;
when dj>=1 and dl<50 then select '不及格門數' as 檔次;
else select '沒有及格的' as 檔次;
end case;
---------------------
循環語句:
基本格式:while 布爾值 do
{leave begin_lable;}
{iterate begin_label;}
end while;
說明:leave begin_label:用與退出while循環;
iterate begin_label:用與跳出本次循環,直接進入下一次循環;
例子:
set @i=,@sum=0;
while @i <= 100 DO
begin
set @sum = @sum+@i;
set @i = @i + 1;
end;
end while;
select @sum;
-----------------------
註釋:
在mysql中支持三種註釋:#,/* */,--;
-----------------------
mysql常用的函數:
遊標:
(以上內容有空就去看看,老師沒有講到;)
-----------------------
存儲過程和存儲函數:
-----------------------------------
1.創建存儲過程:
基本格式: -- 可一有參數,也可以不傳入參數,如: in param_name char(10)
create procedure 存儲過程名 (<[in|out|inout] 參數名 type參數類型>)
[characteristic[,...]]
語句體(可以使用:
begin
...語句體
end;
)
關於characteristic的具體介紹看下面 -- 圖3:
例子:
use gradem;
delimiter $ -- 這個在命令行界面中要用,在查詢中可以不用;
create procedure pro()
reads sql data
begin
select sno,sname,classno,saddress from student
where saddress like '%青島%' order by sno;
end; -- 在命令行中是要把 ; 換成上面定義的 $ ,在查詢中不需要;
delimiter; -- 在查詢中不需要這個語句,命令行中需要
執行存儲過程的語句: call pro();
-------------------------------
2.創建存儲函數:
基本格式:create function 函數名稱([function_parammeter[,...]])
returns type;
[character[,...]]
語句體(說明:這裏可以用begin ... end 語句體)
說明:function_parameter和存儲過程中相同;
returns指定返回值的類型;
例子:
create function func_name(class_no varchar(8))
returns varchar(8)
begin
return (select header from class
where classno = class_no);
end;
執行存儲函數:select func_name('20060101');
3.查看存儲過程和函數:
基本格式:1.show {procedure|function} status [like '函數名'];
2.show create [procedure|function] name;
說明:show ... status語句只能查看儲存過程或函數是操作哪一個數據庫,存儲過程或函數的名稱、
類型、誰定義的、創建和修改時間、字符編碼等信息.但是這個語句不能查詢存儲過程或函數的具體定
義.若要查看具體定義要用 show create語句;
也可以從information_schema.Routines表中查看存儲過程和函數的具體信息;
4.修改存儲過程和函數:
基本格式:alter {procedure|function} 名稱 [characteristic ...];
說明:characteristic 的說明見上面--圖3;
例子:
alter function func_name -- 修改;
MODIFIES sql data sql-- 訪問數據的全限;
SECURITY INVOKER -- 修改安全類型;
COMMENT '0000'; -- 修改函數註釋;
5.刪除存儲過程和函數:
drop {procedure|function} [if exists] 要刪除的名稱;
說明:其中if exists是mysql的擴展,如果函數和存儲過程不存在,它可以防止發生錯誤,產生一個show
warning的警告;
– 觸發器
說明:觸發器是一種特殊的存儲過程,它與表緊密相連,可以是表定義的一部分;觸發器是基於一個表建立的;
在表的數據做了任何修改時,觸發器會自動執行,觸發器可以通過數據庫中的相關表進行層疊修改;觸發器可以強制限制,這些比用check約束所定義的更復雜;
1.創建觸發器:
基本格式:CREATE trigger trigger_name trigger_time trigger_event
ON table_name FOR EACH ROW trigger_statement;
說明:trigger_time:指定觸發器觸發的時機.可以指定爲 after 或者 before;
trigger_event:指明觸發的程序的語句類型:1.insert 2.update 3.delete
FOR EACH ROW:行級觸發和語句級觸發兩種;不加 for each row爲語句級觸發;
麗姐講的比較通俗的理解:
分析:
監視誰: table_name;
監視動作: trigger_event;
出發時間:trigger_time;
觸發事件: trigger_statement;
關於new和old的總結:
總結:
new在before觸發器中賦值,取值;在after觸發器中取值。
new是新插入的數據,old是原來的數據
insert只會有new,代表着要插入的新記錄
delete只會有old,代表着要刪除的記錄
例子1:
create trigger t
after
insert
on student
for each row
begin
insert into class(classno) value(new.sno);
end;
例1的說明:創建名爲t的觸發器,當在student表中執行插入操作後,在class表中插入classno爲
新插入的sno的值;
例子2:
create trigger t2
after update on student for each row
begin
if new.sno!=old.sno then
update sc set sno=new.sno where sno = old.sno;
end if;
end;
例2的說明:創建名爲t2的觸發器,當在student表中執行更新操作後,先判斷所更新的那行的sno的新
舊的值,是否一樣,不一樣就更新表sc中的相應數據;
2.查看觸發器:
語句1:show trigger;
語句2:select * from information_schema.triggers;
語句3(精確查詢):
select * from information_schema.triggers where trigger_name='觸發器名稱';
注意:觸發器的名稱要用單引號,括起來;
3.刪除觸發器:
語句:drop trigger [dbname] trigger_name;
注意:dbname爲數據庫的名稱,默認值爲當前的數據庫,也可以這樣用:
use db_name;
drop trigger trigger_name;