mysql複習筆記

 --   註釋
//自增插入數據,必須一一對應表的每一個數據列,不可空出來。
CREATE TABLE class(id int PRIMARY KEY auto_increment,
sname VARCHAR(50) not null DEFAULT '');
# 插入改INSERT INTO class(sname) VALUES('豆豆');
INSERT INTO class VALUES(null,'123d ');
INSERT INTO class(name,sex) VALUES('123d ','nan'); //id自增這裏可以省略id項

//提高整體性能  LOW_PRIORITY  插入耗時影響select性能的時候使用
//INSERT LOW_PRIORITY INTO
//單條 INSERT 語句處理多個插入比使用多條 INSERT語句快。


#一次性insert 多行 逗號隔開即可
INSERT INTO class VALUES(null,'我'),(null,'是');
//update     UPDATE class SET id=8,sname ='是我' WHERE id = 7;       where  表達式;  表達式爲真就修改
//delete     delete from  class  where id = 7;   
//# truncate 表名;  delete 區別  前者複製表的結構,刪除舊錶 後者刪行記錄
// SELECT sname,id from class where id = 6;
建表 即聲明字段

//字段類型
數值型
   整型
       Tinyint//爲 1 字節 -128    127
       smallint//2 個字節
       mediumint//一箇中等大小整數,有符號的範圍是-8388608到8388607,無符號的範圍是0到16777215。 一位大小爲3個字節。
       int//一個正常大小整數。有符號的範圍是-2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型數據(所有數字),無符號的範圍是0到4294967295。一位大小爲 4 個字節。
int 的 SQL-92 同義詞爲 integer。
  bigint//從 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型數據(所有數字),無符號的範圍是0到18446744073709551615。一位爲 8 個字節  
//zerofill 必須是unsigned類型      /數據類型(M)zerofill/ M 的解析  補0寬度
 小數(浮點/定點型)    
Float(M,D)    decimal(M,D) // M爲標度 代表小數總位數  D代表精度 代表小數點右邊的位數
//Float(6,2)   -9999.99  9999.99    無符號的話 0   9999.99
//decimal(M,D)  爲定點型 整數小數 分開存儲比float精確 數據過長float會損失精度
字符串  
//char(M)   varchar(M)  text文本類型   blob存圖像音頻等二進制信息防止因爲字符集的問題導致信息丟失
//定長 查找快速 浪費空間   不夠N補空格到N,取出時刪除右側所有空格    利用率<=100%              M 0 255  限制的是字符而不是字節
//變長 相對慢    節約空間   增刪效率低  數據前會有一個標識位1-2byte 標記往後讀幾個字符 利用率<100%     M 0 65535
    
日期類型  date  能存儲1000-01-01 到 9999-12-31  沒有數據可以修爲特殊值 0000-00-00   3byte
時間類型time  20:20:20     3byte          // year  1byte  1901-2155 未填爲0000
日期時間類型datetime  YYYY-mm-dd HH:ii:ss    8byte 
timestamp  和時間類型相同 不賦值的或可以   ts timestamp default CURRENT_TIMESTAMP    4byte

 

增加列
alter table 表名 add 列名 列類型 列參數;    --加的列在表的最後

alter table 表名 add 列名 列類型 列參數 after 某列;
alter table 表名 add 列名 列類型 列參數 first;

刪除列
alter table 表名 drop 列名

修改列的類型參數
alter table 表名 modify 列名 列類型 列參數;

修改列的名字類型番薯
alter table 表名 change 舊列名 新列名 新列類型 新列參數



重命名錶名
ALTER TABLE user10 RENAME TO user11;
RENAME TABLE user11 TO user10;

                                                                               a desc,b asc 先a降序,在b升序排序

select 5種子句                                                  desc   asc升(默認)       2,3   跳過兩條,取接下來的兩條

where 條件,group by 分組,having 篩選,order by排序,limit限制結果條數

order by a,b;
重要的是理解在按多個列排序時,排序的順序完全按規定進行。換句話說,對於上述例子中的輸出,僅在多個行具有相同的prod_price值時才
對產品按prod_name進行排序。如果prod_price列中所有的值都是唯一的,則不會按prod_name排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
 等價於   prod_price,prod_name;

爲什麼要使用IN操作符?其優點爲:
在有很多合法選項時,IN操作符的語法更清楚,更直觀。
在與其他AND和OR操作符組合使用IN時,求值順序更容易管理。
IN操作符一般比一組OR操作符執行得更快(在上面這個合法選項很少的例子中,你看不出性能差異)。
IN的最大優點是可以包含其他SELECT語句,能夠更動態地建立WHERE子句。第 11 課會對此進行詳細介紹。

子查詢的SELECT語句只能查詢單個列。企圖檢索多個列將返回錯誤

 

    where    列不變   計算分組別名,列可能改變      having                       order排序limit

表----->滿足條件的行---------------------------->結果集-------->最終結果集-------------->    

and ||  優先級比  or &&高      in   not !        between...and包括邊界值              列爲變量

!=   <>      字段 as 別名

  like  xx%      _匹配一個   %多個    '[JM]%'   J或M開頭  用 ^否定   '[^JM]%'
                                     僅sqlserver支持 

where只對表中的數據起作用,爲表達式,不能對查詢結果起作用必須用having

例如 select user as name from test where name = ‘xxx’;        錯    誤

使用COUNT(*)對錶中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值。
使用COUNT(column)對特定列中具有值的行進行計數,忽略NULL值。

文本數據時,MIN()返回該列排序後最前面的行MAX同
DISTINCT  ALL
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';
DISTINCT 不能用於 COUNT(*)
如果指定列名,則DISTINCT只能用於COUNT()。DISTINCT不能用於COUNT(*)。類似地,DISTINCT必須使用列名,不能用於計算或表達式。
TOP和TOP PERCENT。
GROUP  BY與統計函數  
max()        文本數據時返回最後一行    函數忽略列值爲 NULL 的行
 min()        文本數據時返回第一行   函數忽略列值爲 NULL 的行
sum()                                 函數忽略列值爲 NULL 的行
avg()       函數忽略列值爲 NULL 的行
count(*)    絕對行數 ,(列名)字段不統計null


 只包含不同的值,指定 DISTINCT 參數  不指定 DISTINCT ,則假定爲 ALL

select AVG(DISTINCT  prices) from goods where id = 100;
DISTINCT 只能用於 COUNT()  不能用於 COUNT(*)  類似地, DISTINCT 必須使用列名

select id,sum(prices )from goods group by id  ;         id有多少組

GROUP  BY a,b,c; select中查詢的字段一般而言只能從abc中選擇

1.求平均分,並且掛科兩門以上的學生  表名result   name,score,course

select name,avg(score) from result group by name;

select name,course,score,score<60 as guake from result;

select name,avg(score),sum(score<60) as g from result group by name having g>=2

字符串拼接  concat(str1,str2,...)   若有一個爲空,則查詢爲空

     concat_ws(separator,str1,str2,...)   用分隔符分開  分隔符爲NULL,則返回結果爲
NULL ,參數中存在NULL,則會被忽略

      ifnull(str,設定)  str爲空則用設定的值代替    
      rtrim(),ltrim()  去左右空格    

SUBSTRING()  
CONVERT()數據類型轉換   
CURDATE()     
UPPER()  
LOWER()    
LENGTH() 
Locate() 找出串的子串
LEFT(str,n)  左邊數n個字符   RIGTH(str,n)  
SELECT  sname FROM student where SOUNDEX(sname) = SOUNDEX('小')
   Soundex() 是一個將任何文本串轉換爲描述其語音表示的字母數字模式的算法

sname   中發音類似   小  的

SELECT order_num
FROM Orders
WHERE YEAR(order_date) = 2012;    year()取年

Abs()  返回一個數的絕對值
Cos()  返回一個角度的餘弦
Exp()  返回一個數的指數值
Mod()  返回除操作的餘數
Pi()  返回圓周率
Rand()  返回一個隨機數
Sin()  返回一個角度的正弦
Sqrt()  返回一個數的平方根
Tan()  返回一個角度的正切

 

AddDate()  增加一個日期(天、周等)
AddTime()  增加一個時間(時、分等)
CurDate()  返回當前日期
CurTime()  返回當前時間
Date()  返回日期時間的日期部分
DateDiff()  計算兩個日期之差
Date_Add()  高度靈活的日期運算函數
Date_Format()  返回一個格式化的日期或時間串
Day()  返回一個日期的天數部分
DayOfWeek()  對於一個日期,返回對應的星期幾
Hour()  返回一個時間的小時部分
Minute()  返回一個時間的分鐘部分
Month()  返回一個日期的月份部分
Now()  返回當前日期和時間
Second()  返回一個時間的秒部分
Time()  返回一個日期時間的時間部分
Year()  返回一個日期的年份部分
等值聯結( equijoin )也稱爲內聯結( inner join )   聯結的表越多,性能下降越厲害
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;

SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;
自聯結( self-join )  用自聯結而不用子查詢
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM Customers AS c1, Customers AS c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';

SELECT cust_id, cust_name, cust_contact
FROM Customers
WHERE cust_name = (SELECT cust_name
FROM Customers
WHERE cust_contact = 'Jim Jones');   找到jim工作公司,找到公司的所有人

自然連接    自然聯結排除多次出現,使每個列只返回一次
通過MySql自己的判斷完成連接過程,不需要指定連接條件。MySql會使用表內的,相同的字段,作爲連接條件
select * from student natural join paper;
select * from student natural left join paper;

SELECT c.*,o.id,o.num from cus as c,order as o where c.id = o.id and o.name = 'xx';


外聯結( outer join )
全連接(全外連接)
MySQL目前不支持此種方式,可以用其他方式替代解決
 
left join是以A表的記錄爲基礎的,A可以看成左表,B可以看成右表,left join是以左表爲準的.  
換句話說,左表(A)的記錄將會全部表示出來,而右表(B)只會顯示符合搜索條件的記錄(例子中爲: 
A.aID = B.bID).  B表記錄不足的地方均爲NULL.  
右同理

select * from a_table as a left join b_table as b on a.a_id = b.b_id;
#並( union )或 複合查詢( compound query )
UNION 用於合併兩個或多個 SELECT 語句的結果集,並消去表中任何重複行。
SELECT column_name FROM table1
UNION ALL
SELECT column_name FROM table2

1、UNION 結果集中的列名總是等於第一個 SELECT 語句中的列名
2、UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,
   每條 SELECT 語句中的列的順序必須相同

如果不想去掉重複的行,可以使用union all。
如果子句中有order by,limit,需用括號()包起來。推薦放到所有子句之後,即對最終合併的結果來排序或篩選。
(select * from a order by id) union (select * from b order id)

 複製表

1.複製表結構及數據到新表
    create table 新表 select * from 舊錶 
2.只複製表結構到新表
方法1:(低版本的mysql不支持,mysql4.0.25 不支持,mysql5已經支持了)
    create table 新表 like 舊錶 
方法2:
    create table 新表 select * from 舊錶 limit 0
方法3:
    create table 新表 select * from 舊錶 where 不成立條件
3.複製舊錶的數據到新表
1、(假設兩個表結構一樣)
    insert into 新表 select * from 舊錶 
2、(假設兩個表結構不一樣)
    insert into 新表(字段1,字段2,…….) select 字段1,字段2,…… from 舊錶
更新表
UPDATE Customers                    //若一行出現錯誤整個 UPDATE 操作被取消
SET cust_contact = 'Sam Roberts',
cust_email = '[email protected]'
WHERE cust_id = '1000000006';

UPDATE IGNORE Customers                //若一行出現錯誤忽略繼續修改後面的行
SET cust_contact = 'Sam Roberts',
cust_email = '[email protected]'
WHERE cust_id = '1000000006';




刪除表
DELETE FROM Customers
WHERE cust_id = '1000000006';
                                    truncate table
表中刪除所有行,不要使用DELETE。可使用TRUNCATE TABLE語句,它完成相同的工作,而速度更快(因爲不記錄數據的變動)。           刪除原來的表並重新創建一個表 而不是逐行刪除表中的數據


CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL DEFAULT ‘’,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc text NULL
);
     LIKE 匹配整個串而 REGEXP 匹配子串 
正則表達式    可以用   |   &  連接多個表達式
select * from dept where dname regexp ‘正則表達式’;

select * from dept where dname regexp BINARY ‘正則表達式’;  //使用BINARY區分大小寫

 [1|2|3] Ton  =  [123] Ton   =[1-3] Ton    
 .   代表任一字符   查找‘ . ’  需要用轉義符號    \\. 

[:alnum:]  任意字母和數字(同[a-zA-Z0-9])
[:alpha:]  任意字符(同[a-zA-Z])
[:blank:]  空格和製表(同[\\t])
[:cntrl:]  ASCII控制字符(ASCII 0到31和127)
[:digit:]  任意數字(同[0-9])
[:graph:]  與[:print:]相同,但不包括空格
[:lower:]  任意小寫字母(同[a-z])
[:print:]  任意可打印字符
[:punct:]  既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:]  包括空格在內的任意空白字符(同[\\f\\n\\r\\t\\v])
[:upper:]  任意大寫字母(同[A-Z])
[:xdigit:]  任意十六進制數字(同[a-fA-F0-9])

*  0個或多個匹配
+  1個或多個匹配(等於{1,})
?  0個或1個匹配(等於{0,1})
{n}  指定數目的匹配
{n,}  不少於指定數目的匹配
{n,m}  匹配數目的範圍(m不超過255)

select * from dept where dname regexp  ‘\\([0-9] sticks?\\)’;
[0-9] 匹配任意數字 
 ? 匹配它前面的任何字符的0次或1次出現   sticks?   ->  s出現0次或1次

select * from dept where dname regexp  ‘[[:digit:]]{4}’; 
    匹配連在一起的任意4位數字 出現4次 如:1000    =  [0-9][0-9][0-9][0-9]

^  文本的開始     ^[0-9\\.]  搜索以 一個數字 或 .   開頭
$  文本的結尾
[[:<:]]  詞的開始
[[:>:]]  詞的結尾



外鍵(foreign key) 外鍵爲某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關係.
    1.供應商信息不重複,從而不浪費時間和空間;
    2.如果供應商信息變動,可以只更新 vendors 表中的單個記錄,相
      關表中的數據不用改動;
    3.由於數據無重複,顯然數據是一致的,這使得處理數據更簡單。
MyISAM 和 InnoDB    
    前者支持全文本搜索,而後者不支持           搜索不區分大小寫 除非使用 BINARY 方式
    使用兩個函數 Match() 和 Against() 執行全文本搜索
     Match(note_text)  指示MySQL針對指定的列進行搜索
         Match() 的值必須與FULLTEXT() 定義中的相同指定多個列必須列出而且次序正確
     Against('rabbit') 指定詞 rabbit 作爲搜索文本由於有兩行包含詞 rabbit ,這兩個行被返回

    SELECT 可與 Match() 和 Against() 一起使用
啓用全文本索引
    create table productnotes
    {
        note_id int not null auto_increament,
        note_text text null,
        primary key(note_id),
        fulltext(note_text)    //啓用 全文本搜索
    }engine=MyISAM;

select note_text,match(note_text) against('rabbit') as rank from productnotes;

兩個行都包含詞 rabbit ,但包含詞 rabbit 作爲第3個詞的行的等級比作爲第20個詞的行高    
  等級的行先返回

指定多個搜索項,則包含多數匹配詞的那些行先返回


查詢擴展,能找出可能相關的結果   表中的行越多查詢擴展返回的結果越好
select note_text  from productnotes 
where match(note_text) against('rabbit' with query expansion) ;


布爾文本搜索   沒有 FULLTEXT 索引也可以使用  非常緩慢
select note_text  from productnotes 
where match(note_text) against('rabbit -rope*' in boolean mode) ;
搜索包含rabbit 不包含 rope-  開頭的行

+  包含,詞必須存在
-  排除,詞必須不出現
>  包含,而且增加等級值
<  包含,且減少等級值
()  把詞組成子表達式(允許這些子表達式作爲一個組被包含、
排除、排列等)
~  取消一個詞的排序值
*  詞尾的通配符
""  定義一個短語(與單個詞的列表不一樣,它匹配整個短語以
便包含或排除這個短語)

select note_text  from productnotes 
where match(note_text) against('+rabbit +rope' in boolean mode) ;
包含 rabbit和rope

select note_text  from productnotes 
where match(note_text) against('rabbit rope' in boolean mode) ;
包含 rabbit或rope

select note_text  from productnotes 
where match(note_text) against('"rabbit rope"' in boolean mode) ;
包含rabbit rope


以下是幾個需要知道的引擎:        // 外鍵不能跨引擎
 InnoDB 是一個可靠的事務處理引擎(參見第26章),它不支持全文
本搜索;
 MEMORY 在功能等同於 MyISAM ,但由於數據存儲在內存(不是磁盤)
中,速度很快(特別適合於臨時表);
  MyISAM 是一個性能極高的引擎,它支持全文本搜索(參見第18章),
但不支持事務處理

視圖

重用SQL語句。
  1.簡化複雜的SQL操作。在編寫查詢後,可以方便地重用它而不必
知道它的基本查詢細節。
   2.使用表的組成部分而不是整個表。
   3.保護數據。可以給用戶授予表的特定部分的訪問權限而不是整個
表的訪問權限。
   4.更改數據格式和表示。視圖可返回與底層表的表示和格式不同的
數據。



1.與表一樣,視圖必須唯一命名(不能給視圖取與別的視圖或表相
同的名字)。
 2.對於可以創建的視圖數目沒有限制。
 3. 爲了創建視圖,必須具有足夠的訪問權限。這些限制通常由數據
庫管理人員授予。
  4. 視圖可以嵌套,即可以利用從其他視圖中檢索數據的查詢來構造
一個視圖。
  5. ORDER BY 可以用在視圖中,但如果從該視圖檢索數據 SELECT 中也
含有 ORDER BY ,那麼該視圖中的 ORDER BY 將被覆蓋。
  6.視圖不能索引,也不能有關聯的觸發器或默認值。
  7. 視圖可以和表一起使用。例如,編寫一條聯結表和視圖的 SELECT
語句。


CREATE VIEW  創建
SHOW CREATE VIEW viewname   查看創建視圖的語句
DROP VIEW viewname
CREATE OR REPLACE VIEW 更新視圖

create view as select name,id,sex from class where class.id=dept.id;


視圖定義中有以下操作,則不能進行視圖的更新
  分組(使用 GROUP BY 和 HAVING );
  聯結;
  子查詢;
  並;
  聚集函數( Min() 、 Count() 、 Sum() 等);
  DISTINCT;
  導出(計算)列。

存儲過程

1.簡化複雜的操作
2.不要求反覆建立一系列處理步驟,這保證了數據的完整性  防止錯誤保證了數據的一致性
3.簡化對變動的管理 如果表名、列名或業務邏輯(或別的內容)有變化,只需要更改存儲過程的代碼
  安全性 限制對基礎數據的訪問減少了數據訛誤
4.提高性能。因爲使用存儲過程比使用單獨的SQL語句要快
5.存在一些只能用在單個請求中的MySQL元素和特性存儲過程可以使用它們來編寫功能更強更靈活的代碼

create procedure productpricing()     //存儲過程名productpricing
begin
    select avg(prod_price) as priceaverage
    from product;
end;

調用
call  productpricing();

刪除
drop procedure productpricing;


create procedure productpricing(out p1 deciaml(8,2),out p1 deciaml(8,2))    
begin
    select min(prod_price) into p1
    from product;
    select max(prod_price) into p2
    from product;
end;

call  productpricing(@p1,@p2);

select @p1,@p2;

//pl 存儲產品min價格   p2 存儲產品max價格
//關鍵字 OUT 指出相應的參數用來從存儲過程傳出一個值(返回給調用者)
// IN (傳遞給存儲過程) OUT (從存儲過程傳出,如這裏所用)  INOUT (對存儲過程傳入和傳出)
//  COMMENT 註釋    SHOW PROCEDURE STATUS  (like )'存儲過程名' 的結果中顯示
//IF   THEN   ELSEIF 和 ELSE 

觸發器

只有表才支持觸發器,視圖、臨時表 不支持   每個表最多支持6個觸發器

觸發器是MySQL響應以下任意語句 自動執行的一條MySQL語句
  DELETE ;
  INSERT ;
  UPDATE 

  唯一的觸發器名;
  觸發器關聯的表;
  觸發器應該響應的活動( DELETE 、 INSERT 或 UPDATE );
  觸發器何時執行(處理之前或之後)。

create trigger newproduct after insert on products
for each row select 'Product added';
//  創建名爲 newproduct 的新觸發器        after insert 在 INSERT 語句成功執行後執行
// for each row 對每個插入行執行
// select 'Product added'  顯示 Product added 消息

如果 BEFORE 觸發器失敗,不執行請求的操作              BEFORE 用於數據驗證和淨化
BEFORE 觸發器或語句本身失敗,不執行 AFTER 觸發器

//使用虛擬表
create trigger newproduct after insert on products
for each row select NEW.pname;

create trigger updatevendor before update on vendors
for each row set NEW.vend_state = Upper(NEW.vend_state)
//每次更新一個行時 NEW.vend_state 中的值(將用來更新錶行的值)都用 Upper(NEW.vend_state) 替換

刪除
drop trigger newproduct;



事務管理

來維護數據庫的完整性  不能回退 CREATE 或 DROP 操作

  事務( transaction )指一組SQL語句;
  回退( rollback )指撤銷指定SQL語句的過程;
  提交( commit )指將未存儲的SQL語句結果寫入數據庫表;
  保留點( savepoint )指事務處理中設置的臨時佔位符(place-
holder),你可以對它發佈回退(與回退整個事務處理不同)

start transaction;
rollback;  //只能在一個事務處理內使用
commit;    //僅在不出錯時寫出更改  第一條 DELETE 起作用,但第二條失敗,DELETE 不會提交

//當 COMMIT 或 ROLLBACK 語句執行後動關閉(將來的更改會隱含提交)。

savepoint name;
rollback to name;
//保留點在事務處理完成(執行一條 ROLLBACK 或COMMIT )後自動釋放可以用 RELEASE SAVEPOINT


//更改默認的提交行爲    
//autocommit標誌決定是否自動提交更改 0 (假)不自動提交更改直到 autocommit 被設置爲真爲止
//autocommit針對每個連接  而不是服務器
set autocommit = 0;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章