A. 關於sql計算累加
--sql 其實很簡單 語法你都會 關鍵是怎麼組合
select year,month,(select sum(membercount) from tablename b where b.year=a.year and b.month<=a.month)
all_membercount from tablename a
--註:year和month 無論什麼數據類型都不影響 把表名換成你的表名(內表外表表名是一樣的) 就可以了
--希望解決了樓主的問題
B. SQL中4個表的連接時怎樣的順序
不知道你採用的是內連接還是外連接,在db2中,多表連接總是先兩個表關聯,然後結果集再和第三個表關聯,以此類推!至於順序,db2優化器會結合cpu,i/o等因素自動考慮誰是內表,誰是外表!正常情況下一般把能過濾掉最大行數的表寫在最左邊,然後依次寫其他的表!
C. sql中in和exist語句的區別
兩者都能實現表功能查詢,主要區別如下:
1、適用表的類型不同。
in是子查詢為驅動表,外面的表為被驅動表,故適用於子查詢結果集小而外面的表結果集大的情況。
exists是外面的表位驅動表,子查詢裡面的表為被驅動表,故適用於外面的表結果集小而子查詢結果集大的情況。
2、子查詢關聯不同。
exists一般都是關聯子查詢。對於關聯子查詢,必須先執行外層查詢,接著對所有通過過濾條件的記錄,執行內層查詢。外層查詢和內層查詢相互依賴,因為外層查詢會把數據傳遞給內層查詢。
in則一般都是非關聯子查詢,非關聯子查詢則必須先完成內層查詢之後,外層查詢才能介入。
3、執行次數不同。
IN 語句:只執行一次,確定給定的值是否與子查詢或列表中的值相匹配。in在查詢的時候,首先查詢子查詢的表,然後將內表和外表做一個笛卡爾積,然後按照條件進行篩選。所以相對內表比較小的時候,in的速度較快。
EXISTS語句:執行次數根據表的長度而定。指定一個子查詢,檢測行的存在。遍歷循環外表,然後看外表中的記錄有沒有和內表的數據一樣的。匹配上就將結果放入結果集中。
D. SQL 創建資料庫和表
CREATE DATABASE 語句
CREATE DATABASE 用於創建資料庫。
SQL CREATE DATABASE 語法:
CREATE DATABASE database_name
SQL CREATE DATABASE 實例:
現在我們希望創建一個名為 my_db 的資料庫。
我們使用下面的 CREATE DATABASE 語句:
CREATE DATABASE my_db
可以通過 CREATE TABLE 來添加資料庫表。
CREATE TABLE 語句
CREATE TABLE 語句用於創建資料庫中的表。
SQL CREATE TABLE 語法:
CREATE TABLE 表名稱
(列名稱1 數據類型,
列名稱2 數據類型,
列名稱3 數據類型,
....)
數據類型(data_type)規定了列可容納何種數據類型。下面的表格包含了SQL中最常用的數據類型:
數據類型
描述
integer(size)
int(size)
smallint(size)
tinyint(size)
僅容納整數。在括弧內規定數字的最大位數。
decimal(size,d)
numeric(size,d)
容納帶有小數的數字。
size 規定數字的最大位數。d 規定小數點右嫌納側的最大位數。
char(size)
容納固定長度的字元串(可容納字母、數字以及特殊字元)。
在括弧中規定慎者缺字元串的長度。
varchar(size)
容納可變長度的字元串(可容納字母、數字以及特殊的字元)。
在括弧中規定字元串的最大長度。
date(yyyymmdd)容納日期。
SQL CREATE TABLE 實例:
本例演示如何創建名為寬辯 Person 的表。
該表包含 5 個列,列名分別是:Id_P、LastName、FirstName、Address 以及 City:
CREATE TABLE Persons
(Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255))
Id_P 列的數據類型是 int,包含整數。其餘 4 列的數據類型是 varchar,最大長度為 255 個字元。
空的 Persons 表類似這樣:
Id_P
LastName
FirstName
Address
City
可使用 INSERT INTO 語句向空表寫入數據。
E. sql查詢效率
我想是這樣的,IN後面的子查詢數據越多,相對EXISTS查詢就會越慢。IN子查詢中的記錄只有幾十條件,那麼應該是效率很高的,因為其只查詢單個欄位,如果這個欄位是被索引過的,會更快
EXISTS相對於查詢子表數據較多的情況。
可以這樣想,EXISTS每個子查詢是一條記錄。而IN子查詢每個子查詢會是多條甚至數萬條記錄。所以,子查詢記錄越多,IN的速度越慢。
但是,EXSITS是能完成IN查詢不能完成的功能的,可以使用更復雜的邏輯表達式進行查詢,可以與子查詢的多欄位進行比較。
結論:
子表或查詢數據記錄較多時,EXISTS會較快,子表數據較少時,使用IN查詢較快。
F. 大數據干貨:SQL優化方案精解十則
一、避免進行null判斷
應盡量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,這里最好不要給資料庫留NULL,盡可能的使用 NOT NULL填充資料庫。
備注、描述、評論之類的可以設置為 NULL,最好不要使用NULL。不要錯誤的認為NULL 不需要空間,如char(100) 型,在欄位建立時,空間就固定了。不管是否插入值(NULL也包含在內),都是佔用 100個字元的空間的,如果是varchar這樣的變長欄位, null 不佔用空間。可以在num上設置默認值0,確保表中num列沒有null值。
二、不要使用select *
使用select *的話會增加解析的時間,另外也會把不需要的數據同時查詢出來,從而延長數據傳輸時間,耗費精力。如text類型的欄位,通常用來保存一些內容比較繁雜的東西,如果使用select *,則會把該欄位也查詢出來。
三、謹慎使用模糊查詢
當模糊匹配以%開頭時,該列索引將失效。若不以%開頭,該列索引有效。
四、不要使用列號
使用列號的話,將會增加不必要的解析時間。
五、優先使用UNION ALL,避免使用UNION
因為UNION 會將各查詢子集的記錄做比較,故比起UNION ALL ,通常速度都會慢上許多。一般來說,如果使用UNION ALL能滿足要求的話,務必使用UNION ALL。還有一種情況,如果業務上能夠確保不會出現重復記錄。
六、在where語句或者order by語句中避免對索引欄位進行計算操作
當在索引列上進行操作之後,索引將會失效。正確做法應該是將值計算好再傳入進來。
七、使用not exist代替not in
如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。
八、exist和in的區別
in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環
再對內表進行查詢。因此,in用到的是外表的索引, exists用到的是內表的索引。如果查詢的兩個表大小相當,那麼用in和exists差別不大。如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。
九、避免在索引列上做如下操作
1.避免在索引列上使用IS NULL和IS NOT NULL。
2.避免在索引列上出現數據類型轉換。(比如某欄位是String類型,參數傳入時是int類型)當在索引列上使用如上操作時,索引將會失效,造成全表掃描。
十、復雜操作可以考慮適當拆成幾步
有時候會有通過一個SQL語句來實現復雜業務的例子出現,為了實現復雜的業務,嵌套多級子查詢。造成SQL性能問題。對於這種情況可以考慮拆分SQL,通過多個SQL語句實現,或者把部分程序能完成的工作交給程序完成。