數據庫方面基礎知識復習
常問小問題;
一、like查詢大小寫問題:
sql查詢結果去重 SELECT distinct name FROM 表;平均數avg
一、like查詢大小寫問題:
①用binary 區分大小寫
select * from blacklist where binary name = 'zhangsan' ;
②在建表的時候,設置好區分大小的。加以標識
create table table_name(
a varchar (20) binary
)
二、like查詢引用索引問題:
①like'王%' 用到索引
②like'%%' 沒用到索引
③like'%%' 沒用到索引
三、數據庫的默認隔離級別(可重復讀(repeatable-read))
讀未提交(read-uncommitted)臟讀
不可重復讀(read-committed)幻讀
可重復讀(repeatable-read) 幻讀
串行化(serializable)
四、數據庫中having使用
HAVING語句通常與GROUP BY語句聯合使用,用來過濾由GROUP BY語句返回的記錄集。
HAVING語句的存在彌補了WHERE關鍵字不能與聚合函數聯合使用的不足。
五、數據庫中exists使用(一般和in作對比)
in只有一個字段去匹配,exist返回多個字段匹配??
例如:select * from A where id in(select id from B) 當B表比較小時候用in
select * from A where id exist (select id from B) 當B表比較小時候用in
六、
七、
1、數據庫優化
在數據庫中查詢語句速度很慢,如何優化?
1.建索引 2.減少表之間的關聯 3.優化sql,盡量讓sql很快定位數據,不要讓sql做全表查詢,應該走索引,把數據 量大的表排在前面 4.簡化查詢字段,沒用的字段不要,已經對返回結果的控制,盡量返回少量數據 5.盡量用PreparedStatement來查詢,不要用Statement,6.對字段類型用到適當,狀態類型(性別)可以用tinyint varchar減少內存
2、觸發器的作用?
觸發器是一中特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。
3、什么是存儲過程?用什么來調用?
存儲過程是一個預編譯的SQL語句,優點是允許模塊化的設計,就是說只需創建一次,以后在該程序中就可以調用多次。如果某次操作需要執行多次SQL,使用存儲過程比單純SQL語句執行要快。 調用: 1)可以用一個命令對象來調用存儲過程。 2)可以供外部程序調用,比如:java程序。
4、存儲過程的優缺點?
優點: 1)存儲過程是預編譯過的,執行效率高。 2)存儲過程的代碼直接存放於數據庫中,通過存儲過程名直接調用,減少網絡通訊。 3)安全性高,執行存儲過程需要有一定權限的用戶。 4)存儲過程可以重復使用,可減少數據庫開發人員的工作量。 缺點:移植性差
5、存儲過程與函數的區別
| 存儲過程 | 函數 |
| 用於在數據庫中完成特定的操作或者任務(如插入、刪除等) | 用於特定的數據(如選擇) |
| 程序頭部聲明用procedure | 程序頭部聲明用function |
| 程序頭部聲明時不需描述返回類型 | 程序頭部聲明時要描述返回類型,而且PL/SQL塊中至少要包括一個有效的return語句 |
| 可以使用in/out/in out 三種模式的參數 | 可以使用in/out/in out 三種模式的參數 |
| 可作為一個獨立的PL/SQL語句來執行 | 不能獨立執行,必須作為表達式的一部分調用 |
| 可以通過out/in out 返回零個或多個值 | 通過return語句返回一個值,且改值要與聲明部分一致,也可以是通過out類型的參數帶出的變量 |
| SQL語句(DML 或SELECT)中不可調用存儲過程 | SQL語句(DML 或SELECT)中可以調用函數 |
6、函數的創建和使用
語法:
Create function 函數名(參數)
Returns 返回值數據類型
as
begin
SQL語句(必須有return 變量或值)
End
直接執行函數 SELECT dbo.函數名('aa') AS result;sql中同樣使用
常用系統存儲過程:
exec sp_databases; --查看數據庫
exec sp_tables; --查看表
exec sp_columns student;--查看列
exec sp_helpIndex student;--查看索引
exec sp_helpConstraint student;--約束
exec sp_stored_procedures;
exec sp_helptext 'sp_stored_procedures';--查看存儲過程創建、定義語句
exec sp_rename student, stuInfo;--修改表、索引、列的名稱
exec sp_renamedb myTempDB, myDB;--更改數據庫名稱
exec sp_defaultdb 'master', 'myDB';--更改登錄名的默認數據庫
exec sp_helpdb;--數據庫幫助,查詢數據庫信息
exec sp_helpdb master;
系統存儲過程使用:
--重命名索引 exec sp_rename N'student.idx_cid', N'idx_cidd', N'index'; exec sp_help 'student';
--自定義存儲過程
create proc | procedure pro_name
[{@參數數據類型} [=默認值] [output],
{@參數數據類型} [=默認值] [output],
....
]
as
SQL_statements
7、內外連接
1.左外左邊主表右邊輔表(或者說左邊不受限制)(實際結果是A表所有數據,B表對應),select * from A Left JOIN B ON A.Aid=B.Bnameid 0
2.右外連接右表是主表(或者說右表不受限制)(實際結果是B表所有數據,A表對應)select * from A Right JOIN B ON A.Aid=B.Bnameid
3.內連接:內連接獲取兩表的公共部分的記錄(實際結果關聯字段為基礎倆表的數據)Select * from A JOIN B ON A.Aid=B.Bnameid
4.意義不大(實際結果 兩張表聯合沒有條件情況下,條數 = 圖1 * 圖2)或者數據行數等於 第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
select * from A where id in(select id from B)
