SQL必知必会读书笔记
《SQL必知必會》
1、SQL概述(概念、優點、數據庫術語)
* 日常生活中的數據庫案例舉例(例如在網站搜索東西;登錄賬號密碼;取錢;)
*
數據庫概念:數據庫database(以一種有組織的方式存儲的數據集合或容器。例如一個文件柜); 數據庫管理系統(DBMS)也叫數據庫軟件,和數據庫的概念不是相同的。表:一種結構化的文件,用來存儲特定類型的數據。模式(schema):關于數據庫和表的布局以及特性的信息。列:表中的一個字段,表由一個或者多個列組成。數據類型:所允許的數據的類型。作用:可限定列中的數據類型,同時幫助正確分類數據,優化磁盤的使用。行:表中的一個記錄。主鍵(primary key):一列,其值能夠唯一標識表中的每一行。作用:沒有主鍵更新或刪除表困難,不能保證只涉及相關的行。便于數據庫的操作和管理。
*
作為主鍵的條件:1、任意兩行都不具有相同的主鍵值;2、每一行都必須具有一個主鍵值(主鍵值列不允許null值);3、主鍵列中的值不允許修改或更新;4、主鍵值不能重用(若某行的從表中刪除,其主鍵不能賦予給新的行。);可以是一列,也可以是聯合主鍵,同時聯合主鍵時,上述條件必須應用到其中,所有列值的組合必須是唯一的(但單個的值可以不唯一)。
*
SQL 英語為structured query language ,譯為結構化查詢語言,專門用于與數據庫溝通的語言。SQL優點:1、使用廣泛:可以應用到以下數據庫管理系統(DBMS):Apache Open Office Base ;IBM DB2 ;Microsoft SQL ;Microsoft Access; Maria DB;MYSQL;Oracle;Postgresql;SQLite;2、簡單易學;3、強有力的語言,可進行復雜高級的數據庫操作。標準SQL由ANSI標準委員會管理;稱為ANSI SQL;
2、檢索數據
*
關鍵字:SQL是由關鍵字組成的語言,用于執行SQL操作的特殊詞匯。在命名數據庫、表、列和其他數據庫對象時,一定不要使用這些關鍵字,必須保留。——附錄E內容《SQL必知必會》。注意以下幾點: 關鍵字隨不同的DBMS而變化,并非下面的所有關鍵字都被所有DBMS采用。 許多DBMS擴展了SQL保留字,使其包含專門用于實現的術語。多數DBMS專用的關鍵字未列在下面。 為保證以后的兼容性和可移植性,應避免使用這些保留字,即使它們不是你使用的DBMS的保留字。
SELECT 語句
* 檢索單個列;select prod_name from products;輸出結果為沒有排序的數據;
3、排序檢索數據(order by、asc、desc)
*
使用order by 對一個或多個列進行排序;select prod_id from products; select prod_id, prod_price,prod_name from products order by prod_id ,prod_name; order by 字句的位置應該保證它是select 語句中最后一條字句,否則將會出現錯誤信息。同時還可以用列名制定排序順序:select prod_id ,prod_name, prod_price from products order by 2,3;指定的是列的相對位置而不是列名——好處:不用重新輸出列名;壞處:不明確指定列名會造成錯用列名排序,同時在對select清單進行更改時容易錯誤地對數據進行排序,最后排序的列不在select清單中則無法使用這項技術。
*
指定排序方向:使用desc或者asc ; select prod_id ,prod_name, prod_price from products order by prod_price desc;
*
對多個列指定排序,必須對每一列指定desc關鍵字。desc 是descending的縮寫;默認是asc升序;
4、過濾數據(where過濾檢驗相等、不相等、大于小于以及 null值的范圍)
*
只檢索所需要數據需要指定搜索條件,也叫過濾條件。SQL通過where字句中指定的搜索條件進行過濾。where字句放在from字句之后:select prod_name,prod_price from products where prod_price=3.49;
*
注意:當出現order by 和where字句時,應該讓orderby 位于前面,否則錯誤。
*
where字句操作符(見下圖)包括檢查單個值、不匹配檢查(!= 、<>" " )、范圍值檢查(between and )、空值檢查(NULL)、
如果將值與字符串進行比較,就需要限定引號。用來與數值進行比較的就不用限定引號。
*
null:無值(no value)與字段為0、空字符串、或者僅僅包含空格不同。where字句:select prod_name from products where prod_price is null;用來判斷具有null值的列;
5、高級數據過濾(or/and/not/in)
*
組合where子句,使用and或者or方式使用;
*
要通過不止一個列進行過濾,可以使用and操作符給where子句添加附加條件。select prod_id, prod_price,prod_name from products where vend_id="DLL01" and prod_price <=4;
*
or操作符指示DBMS檢索匹配任一條件的行。select prod_name,prod_price from products where vend_id =“DLL01” or vend_id=“BRS01”;
*
or 和and 在組合使用時會優先求and的值,解決方法是使用圓括號對操作符進行明確分組。select prod_name,prod_price from products where (vend_id="DLL01" or vend_id ="BRS01") AND prod_price>=10;使用圓括號可以消除歧義。
*
in操作符用于指定范圍,范圍中的每一個條件都可以進行匹配。select prod_name, prod_price from products where vend_id in ("DLL01","BRS01")order by prod_name; In操作符后跟由逗號分隔的合法值,這些值必須在圓括號中。in操作符完成了與or相同的功能。
*
為什么使用in操作符?優點如下:1、在有很多合法選項時,in操作符的語法更清楚、直觀;2、在與其他and和or操作符組合使用時,求值順序更容易管理;3、in操作符一般比or操作符執行的更快;4、最大的優點就是它包含其他select語句,能夠更動態地建立where子句。
*
not 操作符用于否定其后所跟的任何條件,不單獨使用,與其他操作符一起使用。select prod_name from products where not vend_id="DLL01" order by prod_name; NOT否定跟在其后的條件。也可以使用<>來表示。
6、用通配符進行過濾(在where子句中使用通配符)
*
通配符:用來匹配值的一部分的特殊字符。
*
搜索模式:由字面值、通配符或組合構成的搜索條件。SQL支持幾種通配符,為在搜索子句中使用通配符,必須使用like操作符。
*
當操作符作謂詞時不是操作符;通配符搜索只能用于文本字段,非文本數據類型字段不能使用通配符搜索。
*
百分號%通配符:表示任何字符出現任意次數,例如,找出所有以“fish”起頭的產品id 和名字:select prod_id,prod_name from products where prod_name like"Fish%";“Fish%”即搜索模式;
*
下劃線_ 通配符,注意后面的空格;_和%的用途一樣,但是_只匹配單個字符,而不是多個字符。而%能匹配多個字符。
*
方括號[]通配符,用來指定一個字符集,但只能指定字符集中法單個字符
*
通配符使用技巧:不要過度使用;盡量不要放在開始處;注意通配符的位置。
7、創建計算字段
*
字段拼接(concat函數);rtrim()函數用于去掉值右邊空格;別名用as關鍵字賦予;
*
SQL算術操作符(下圖);
select語句為測試、檢驗、計算函數提供很好的方法:例如select now 會返回當前日期和時間。
8、函數
*
SQL支持以下類型的函數:1、文本字符串處理函數;2、數值計算函數;3、日期處理函數;
*
常用的文本處理函數(如下圖源于《SQL必知必會》)
*
select cust_name,cust_contact from customers where soundex(cust_contact)=soundex("michaelgreen");——soundex函數用于搜索匹配所有發音類似于字符串。
常用數值處理函數如下:
9、匯總數據
*
5個聚集函數(aggregate function)對某些行運行的函數,計算并返回一個值。
select avg(prod_price) as avg_price from products; avg用于對表中行數計數并計算其列值的和,求得該列的平均值。AVG忽略值為null的行;為了獲得多個列的平均值,必須使用多個avg函數。
*
count()用于計數:對表中行的數目進行計數,不管是空值(null)還是非空值;使用count(column)對特定列中具有的值的行進行計數,忽略null值。count函數指定列名就會忽略指定列值為空的行,如果是count(*)則不忽略。
*
max()用于返回指定列中最大的值,要求指定列名。忽略列值為null的行。max要求指定列名。在用于文本數據的時候,max返回該列排序后的最后一行。
*
min()函數同上相反,忽略列值為null的行;
*
sum()用于返回指定列值的和(總計);忽略列值為null的行
*
這些函數在同一列上進行計算稱為聚合,同一行不同列的值之間的計算為細節表達式。對所有行執行計算,指定all參數或不指定參數,因為all是默認行為。只包含不同的值,指定distinct參數。如果不指定distinct參數,則假定為all。
*
如果指定列名,則DISTINCT只能用于COUNT()。DISTINCT不能用于COUNT(*)。類似地,DISTINCT()必須使用列名,不能用于計算或表達式。
*
組合聚集函數:包含多個聚集函數。
10、分組函數(將數據分為多個邏輯組,對每一個組進行聚集計算)
*
groupby 函數用于分組 mysql> select vend_id,count(*) as num_prods from products group by vend_id;
*
使用groupby 的一些重要規定:1、可以包含任意數目的列,因而可以對分組進行嵌套,更細致地進行數據分組;2、在group by子句中嵌套了分組,數據將在最后指定的分組上進行匯總。3、groupby 子句中列出的每一列都必須是檢索列或有效的表達式(但不是聚集函數)4、大多數SQL實現不允許groupby 列帶有長度可變的數據類型(如文本或備注型字段);5、除聚集計算語句外,select語句中的每一列都必須在groupby 子句中 給出。 6、分組列中有null指的行,則null將作為一個分組返回,如果有多行null ,則他們將分為一組。7、groupby 子句必須出現在where子句之后,orderby 子句之前。
*
過濾分組:having:用于過濾分組,而where 用來過濾行。并且having 支持所有where 操作符。
*
having 和where 的區別;where 在數據分組前過濾,having在數據分組后進行過濾。where排除的行不包括在分組中。使用having 時應該結合group by子句,而where子句用于標準的行級過濾。
*
同時使用的例子——select vend_id,count(*) as num_prods from products where prod_price >=4 group by vend_id having count(*)>=2;表示查詢具有兩個以上產品且價格大于等于4 的供應商。where子句用于過濾所有prod-price至少為4的行,然后按照vend-ID進行分組,having子句過濾計數為2或2以上的分組。
*
分組和排序的差別:order by 與group by 的差別。(功能、使用范圍、必要性)
查詢包含3個以上物品的訂單號和訂購物品的數目,并進行排序——select order_num,count(*) as items from orderitems group by order_num having count(*) >=3 order by items,order_num;
*
select子句順序:
11、子查詢(subquery:嵌套在其他查詢中的查詢;用于過濾和計算列)使用子查詢進行過濾
*
訂單編號、客戶ID、訂單日期——order表 ;customer表存儲顧客信息;各訂單物品存儲在相關的orderitems表中
*
題目:出訂購物品RGAN01的所有顧客——Select cust_id,cust_name from customers where cust_id in (select cust_id from orders where order_num in (select order_num from orderitems where prod_id ="RGAN01"));
*
子查詢總是由內向外處理;作為子查詢的select語句只能查詢單個列;
使用子查詢計算字段
*
完全限定列名:用一個句點分隔表名和列名,在有可能混淆列名時必須使用這種語法。如下:select cust_name,cust_state,(select count(*)from orders where orders.cust_id=customers.cust_id)as order_num from customers order by cust_name;
*
子查詢常用于where子句的in操作符中,以及用來填充計算列。
12、聯結表(join表)邏輯:關系表-聯結-創建聯結(where、內聯結兩種)-多個表聯結 (和子查詢差不多,不過性能不同 )
*
關系數據庫設計的基礎:相同的數據不能多次出現。應該是把信息進行分解成多個表,一類數據一個表,各表通過某些共同的值互相關聯,這才叫關系型數據庫。關系型數據庫可以有效地存儲,方便地處理。其可伸縮性比非關系型數據庫要好。
*
可伸縮性:能夠適應不斷增加的工作量而不失敗,設計良好的數據庫或應用程序稱為可伸縮性好(scale well).
*
供應商表vendors; 產品表products;vendor表的主鍵將vendors和products 表相互關聯,利用主鍵能從供應商表中找出相應供應商的詳細信息;
*
當數據存儲在多個表的時候,怎樣用一條select語句檢索出數據?——使用聯結,聯結是一種機制,用來在一條select語句中關聯表,因此稱為聯結。使用特殊的語法,可以聯結多個表返回一組輸出,聯結在運行時關聯表中正確的行。
*
引用完整性表示dbms強制實施數據完整性規則,一般由提供了界面的DBMS管理。
*
創建聯結:非常簡單,指定要聯結的所有表以及關聯他們的方式——select vend_name,prod_name,prod_price from vendors,products where vendors.vend_id=products.vend_id;并且完全限定了列名。
*
where子句建立聯結,作為過濾條件,只包含那些匹配給定的條件。聯結即將第一個表中的每一行與第二個表中的每一行配對。
*
笛卡爾積(Cartesian product)由沒有聯結條件的表關系返回的結果為笛卡爾積,檢索出的行的數目將是第一個表的行數乘以第二個表中的行數。要保證所有聯結都有where子句,否則DBMS將返回比想要的數據多得多的數據。同時要保證where子句的正確性。
*
叉聯結;返回笛卡爾積的聯結,也稱為叉聯結。(cross join);
*
內聯結:也叫等值聯結,是基于兩個表之間的相等測試。select vend_name,prod_price,prod_name from vendors inner join products on vendors.vend_id=products.vend_id;和上面語句返回的同樣的結果,在使用這種語法時,聯結條件用特定的on子句而不是where子句給出,傳遞給on的實際條件與傳遞給where的相同。
13、創建高級聯結(其他聯結、使用表別名、對聯結的表使用聚集函數的使用方式)
*
SQL除了可以對列名和計算字段使用別名,還允許給表名起別名,理由如下:縮短SQL語句;允許一條select語句中多次使用相同的表;表別名只在查詢執行中使用,與列表名不一樣,表別名不返回到客戶端。
*
其他聯結:自聯結(self join)\自然聯結(natural join)\外聯結(outer 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";假如要給與jim jones同一公司的所有顧客發送一封郵件。也可以使用子查詢的方式。表c1與表c2是同一個表,但對這個表的引用具有歧義,因此需要使用表別名。where首先聯結兩個表,然后按第二個表中的cust_contact 過濾數據,返回所需要的數據。
*
自聯結通常作為外部語句,用來替代從相同表中檢索數據的使用子查詢。雖然結果差不多,但許多DBMS處理聯結遠比處理子查詢快得多。
*
自然聯結:背景:標準的聯結返回所有數據,相同的列甚至多次出現,自然聯結排除多次出現,使每一列只返回一次。如何實現:由自己實現,通過只能選擇那些唯一的列,一般通過對一個表使用通配符(select*),而對其他表多列使用明確的子集來完成。select c.*,o.order_num,o.order_date,oi.prod_id,oi.quantity,oi.item_price from customers as c,orders as o,orderitems as oi where c.cust_id=o.cust_id and oi.order_num=o.order_num and prod_id = "rgan01";在這個例子中,通配符只對第一個表使用,所有其他列明確列出 ,所以沒有重復的列被檢索出來。事實上,我們迄今為止建立的每個內聯結都是自然聯結。
*
外聯結:聯結包含了那些在相關表中沒有關聯的行,這種聯結成為外聯結。例如:列出所有產品以及訂購數量,包含那些至今尚未下訂單的顧客;select customers.cust_id,orders.order_num from customers left outer join orders on customers.cust_id=orders.cust_id;在使用 外聯結時,必須使用right或left關鍵字指定包括所有行的表,right是指的是outer join右邊的表,反之;二者的區別就在于所關聯的表的順序,換句話說,調整from或where子句中表的順序,左外聯結可以轉換為右外聯結。因此兩種聯結可以互為轉換。
*
全外聯結:(fullouterjoin)包含兩個表的不關聯的行,它檢索兩個表中的所有行并關聯那些可以關聯的行。語法如下:select customers.cust_id,orders.order_num from orders FULL OUTER JOIN customers on orders.cust_id =customers.cust_id;
*
使用帶聚集函數的聯結;select customers.cust_id,count(orders.order_num)as num_order from customers inner join orders on customers.cust_id=orders.cust_id group by customers .cust_id; inner join 將兩個表互相關聯,函數count對每個顧客的訂單進行計數,group by分組數據。
*
使用聯結和聯結條件,注意要點:1、注意所使用的聯結類型,一般使用內聯結;保證使用正確的聯結條件,否則錯誤;應該總是提供聯結條件,否則會得出笛卡爾積;在一個聯結中可以包含多個表,甚至可以對每個聯結采用不同的聯結類型,應該在一起測試他們之前分別測試每個聯結,這樣會使故障排除更為簡單。
14、組合查詢(union)
*
背景:SQL允許執行多個查詢(多條select語句),并將結果作為一個查詢結果集返回。這些組合查詢通常稱為并(union)或復合查詢(compound query).
*
使用組合查詢的情況:1、在一個查詢中從不同的表返回結構數據;2、對一個表執行多個查詢,按照一個查詢返回數據;多個where條件都可以作為一個組合查詢。
*
創建和使用組合查詢——union:union將兩個語句連接:select cust_name,cust_contact,cust_email from customers where cust_name="fun4all" union select cust_name,cust_contact,cust_email from customers where cust_state in("il","in","mi");也可以使用where來檢索數據——select cust_name,cust_contact,cust_email from customers where cust_state in ("il","in","mi") or cust_name="fun4all";
*
使用union需要注意幾條規則:1、union必須由兩條及以上的select語句組成,語句之間用關鍵詞union分隔;2、union中的每個查詢必須包含相同的列、表達式或聚集函數;3、列數據類型必須兼容,類型不必完全相同,但必須是DBMS可以隱含轉換的類型。
*
union從查詢結果中自動去除了重復的行,重復行被自動取消,這時union的默認行為,如果愿意也可以改變它自動取消,可以使用union all 實現。select cust_name,cust_contact,cust_email from customers where cust_name="fun4all" union all select cust_name,cust_contact,cust_email from customers where cust_state in("il","in","mi");
*
對組合查詢的結果進行排序:只能使用一條order by子句,并且必須要位于最后一條select語句之后,對于結果集不存在用一個方式排序一部分,另一種方式排序另一部分的情況,因此不允許使用多條orderby子句。
*
某些DBMS還支持另外兩種union:except有時稱為minus,可以用來檢索只在一個表中存在,而在第二個表中不存在的行;而intersect用來檢索兩個表中都存在的行。
15、插入數據(insert)
*
insert用于將行插入(或添加)到數據庫表,插入有幾種方式;1:插入完整的行;2、插入行的一部分;3、插入某些查詢的結果。
*
插入完整的行:insert into customers values("100000006","toy land","123 any street","new york","ny","11111","usa",null,null);這種插入方式高度依賴于表中列的定義次序,以及次序信息。這樣的SQL語句很不安全。
*
16、更新和刪除數據(update、delete)
* 更新數據:update用于更新(修改)表中的數據,有兩種使用方式:1、更新表中的特定行;2、更新表中的所有行。注意:不要省略where子句。* 使用update語句可能需要特殊的安全權限,應該保證自己有足夠的安全權限。* update語句組成部分:1、要更新的表;2、列名和他們的新值;3、確定要更新那些行的過濾條件。update customers set cust_email="kim@thetoystore.com"where cust_id="100000005";set用于將新值賦予被更新的列,沒有where子句將更新customers表中所有的行。在更新多個列的時候只需要使用一條set命令,每一“列“等于值對之間用逗號分隔(最后一列之后不用逗號)。要刪除某個列的值,可以將它設置為null值,null表示沒有值,而空字符串表示是一個值。update語句中可以使用子查詢。使得能夠用select語句檢索出的數據更新列數據。* 刪除數據:delete用于從表中刪除特定的行;從表中刪除所有的行。不要省略where語句。delete不需要列名或通配符,delete是刪除行而不是刪除列,要刪除指定的列,使用update 語句。同時delete是刪除表的內容而不是表。如果想要刪除所有的行,可以使用truncate table 語句,速度更快。* 使用update或delete時需要遵循的重要原則:1、一定要使用帶where的子句;2、保證每個表都有主鍵 3、在update或delete使用where子句之前,先用select進行測試,保證過濾的是正確的記錄,以防編寫的where子句不正確。4、使用強制實施引用完整性的數據庫,DBMS不允許刪除其數據與其他表相關聯的行。5、有的DBMS允許數據庫管理員施加約束,防止執行不帶where子句的更新或刪除操作,若是SQL沒有undo按鈕,應該小心地使用更新或刪除操作,否則會發現錯誤。17、創建和操縱表
*
創建表——create table 加表名。SQL要求首先手工刪除該表,然后在重建它,而不是簡單地用創建語句覆蓋。
*
null值 ,允許null值的列也允許在插入改行時不給出該列的值,不允許null值的列不接受沒有列值的行,也就是在插入或更新行時,該列必須有值。只有不允許null的值的列可以作為主鍵,允許null的值的列不能作為 唯一標識。null值是沒有值,空字符串“ ”在notnull中是允許的,表示0.
*
用default 加值;表示默認值,default current_date()表示將系統日期表示時間。
*
不同DBMS獲得系統日期的語法:
使用default而不是null值。
*
使用alter table 語句來更新表定義,使用注意事項如下:1、理想情況下,不要在表中包含數據時對其進行更新;2、所有的DBMS都允許給現有的表增加列,不過對所增加列的數據類型有所限制;3、許多DBMS不允許刪除或更改表中的列;4、多數DBMS允許重新命名表中的列,對未填有的數據的列幾乎 沒有限制。
*
alter table 更改表結構,需要給出下面的信息:1、在alter table之后 給出要更改的表名,該表必須存在,列出要做那些更改。alter table vendors add vend_phone char(20);
*
復雜的表結構更改一般需要手動刪除的過程,涉及如下步驟:1、用新的列布局創建一個新表;2、使用insert select語句從舊表復制到新表,有必要的話,可以使用轉換函數和計算字段;3、檢驗包含所需數據的新表;4、重命名舊表(如果確定,可以刪除它);5、用舊表原來的名字重命名新表;6、根據需要,重新創建觸發器、存儲過程、索引和外鍵。
*
小心使用alter table,應該在進行改動前進行完整的備份(包括表的結構和數據的備份)。因為操作都是永久性的。
*
刪除表:drop table 加表名。許多DBMS使用關系規則防止意外刪除。
*
重命名表——rename。
18、視圖
*
視圖:虛擬的表,與包含數據庫的表不一樣,視圖只包含使用時動態檢索數據的查詢,不包含數據。查詢的封裝。
*
視圖的常見應用:1、重用SQL;2、簡化復雜的SQL操作;3、使用表的一部分而不是整個表;4、保護數據,授予用戶訪問用戶訪問表的特定部分的權限;5、更改數據格式和表示;
*
創建和使用視圖的規則:1、與表一樣,視圖必須唯一命名;對于可以創建的視圖數目沒有限制;創建視圖必須有足夠的訪問權限,視圖可以嵌套,可以利用從其他視圖中枷鎖數據的查詢來構造視圖;許多DBMS禁止在視圖查詢中使用order by子句,視圖不能索引,也不能有關聯的觸發器或者默認值;有些視圖作為只讀的查詢,表示可以從視圖 檢索數據,但不能把數據寫會底層表;
*
creat view語句來創建視圖,只能用于創建不存在的視圖;
*
刪除視圖:drop biew viewname;
19、存儲
*
存儲過程就是為以后使用而保存的一條或多條SQL語句
*
為什么使用存儲過程:1、簡化復雜的操作;2、保證數據的一致性;3、簡化對變動的管理;4、‘提高性能;
*
執行存儲過程:exeute 加存儲名字;
*
創建存儲過程:create+
20、事務管理
*
事務:事務處理是一種機制,用來管理必須成批執行的SQL操作,保證數據庫不包含不完整的操作結果,可以保證一組操作不會中途停止,要么完全執行,要么完全不執行。
*
事務:一組SQL語句;
*
回退:撤銷指定SQL語句的過程;
*
提交:將未存儲的SQL語句結果寫入數據庫表;
*
保留點:指事務處理中設置的臨時占位符;
21、游標
*
是一個存儲在DBMS服務器上的數據庫查詢,它不是一條select語句,而是被該語句檢索出來的結果集。
*
創建游標表:declare custcursor cursor
*
使用游標:open cursor ……close ……
22、高級SQL特性
*
約束
*
主鍵
*
外鍵
*
唯一約束
*
檢查約束
*
索引
*
觸發器
*
數據庫安全:需要保護的操作:1、對數據庫管理功能;2、對特定數據庫或表的訪問;3、訪問的類型;4、僅僅通過視圖或存儲過程對表進行訪問;5、創建多層次的安全措施,從而允許多種基于登錄的訪問和控制;6、限制管理用戶賬號的能力。
總結
以上是生活随笔為你收集整理的SQL必知必会读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用微软提供的TCHAR.H头文件?
- 下一篇: 无语:SEGA开发尿尿游戏 仅供男性专用