- 創建數據庫表
1 create table person 2 ( 3 FName varchar(20), 4 FAge int, 5 FRemark varchar(20), 6 primary key(FName) 7 )
- 基本sql語句
1 --查詢 2 select * from person where FAge<18; 3 --刪除 4 delete from person where FRemark='名譽總裁'; 5 --插入 6 insert into person(FAge,FRemark)values(19,'新員工') 7 --更新 8 update person set FRemark='總經理'where FRemark='名譽總裁' or position='副經理';
- 一次插入數據
View CodeINSERT INTO T_ Person(FName,FAge,FRemark) VALUES('Jim',20,'USA'); INSERT INTO T_ Person(FName,FAge,FRemark) VALUES('Lili',22,'China'); INSERT INTO T_ Person(FName,FAge,FRemark) VALUES('XiaoWang',17,' China’);
insert 語句中的順序可以是任意的,語句中的列的順序不會影響插入的結果,但是values后面的字段值要和前面的字段值對應.可以忽略某些字段的插入
View Codeinsert into T_person(FAge,FName)values(22,'LXF')
- 不指定插入的列
View Codeinsert into T_person values('lurenl',23,'China')
如果不指定要插入的列,values后面的字段要按照數據庫定義的字段順序插入
- 非空約束對數據插入的影響.
如果對一個字段添加了非空約束,是不能向字段中插入null值的,比如T_Debt表的FAmount字段有非空約束.
insert into t_debt(FAmount,Fperson)values(null,'jim')
會報錯:不能將值NULL插入列’FAmount',表’dbo.T Debt';列不允許有空值。INSERT失敗
- 主鍵對數據插入的影響
-
主鍵是在同一張表中必須是唯一的,如果在進行數據插入的時候指定的主鍵與表中己有
的數據重復的話則會導致違反主鍵約束的異常。insert into t_debt(FNumber,FAmount,FPerson)values('1',300,'Jim')
會報錯:不能在對象dbo.T Debt中插入重復鍵
- 數據的刪除
刪除person表里面的所有數據
delete from person;
delete刪除的是表中的數據.drop刪除數據的同時連表的結構都刪除了
drop table person
delete執行完成之后還能查詢,只是表是空的數據,drop執行完成之后再select,就會提示"數據表person不存在"
- 給列起別名
別名的定義規則(列名 AS 別名)
View Codeselect FName as name from person
也可以省略as
View Codeselect FName name from person
- 按照條件過濾
SELECT FName FROM T_ Employee WHERE FSalary<5000
- 聚合(最)
- MAX查詢年齡大於25歲的員工的最高工資
View Codeselect Max(FSalary) from person where FAge>25
- 也可以為聚合函數的結構取別名
View CodeSELECT MAX(FSa工ary) as MAX-SALARY FROM T_ Emp工oyee WHERE FAge>25
- AVG求平均值
View CodeSELECT AVG(FAge) FROM T_ Emp工oyee WHERE FSalary>3800 - SUM求總數
View CodeSELECT SUM(FSa工ary) FROM T_ Emp工oyee
- MIN最小值與MAX一起使用
View CodeSELECT MIN(FSalary),MAX(FSalary) FROM T_ Emp工oyee
- Count計算數據總條數
View CodeSELECT COUNT(*),COUNT(FNumber)FROM T_ Employee
- 排序Order By
- order by位於select 語句的末端(asc代表升序,可以省略:desc是降序,不能省略)
View CodeSELECT * FROM T_ Employee ORDER BY FAge ASC
按照年齡從大到小排序,如果年齡相同則按照
之類的排序功能
View CodeSELECT * FROM T_ Employee ORDER BY FAge DESC,FSalary DESC
- ORDER BY子句完全可以與WHERE子句一起使用(ORDER BY子句要放到WHERE子句之后,不能顛倒它們的順序)
View CodeSELECT * FROM FAge>23 BY FAge T_ Emp工oyee WHERE ORDER by FAge DESC,FSalary DESC
- 通配符過濾
- like,_
- _(單個通配符)
View CodeSELECT * FROM T_ Employee WHERE FName LIKE '_erry'
以任意字符開頭,剩余部分為“erry"
- 要檢索長度為4、第3個字符為“n ",其他字符為任意字符
View CodeSELECT * FROM T_ Employee WHERE FName LIKE,'__n_'
- %(多字通配符)
View CodeSELECT * FROM T_ Employee WHERE FName LIKE’T%’
以“T”開頭,長度任意。
- 姓名中包含字母"n”的員工信息
View CodeSELECT * FROM T_ Employee WHERE FName LIKE’%n%’
-
單字符匹配和多字符匹配還可以一起使用。
View CodeSELECT * FROM T_ Employee WHERE FName LIKE’%n_'上面表示:最后一個字符為任意字符、倒數第_個字符為“n " ,長度任意的字符串。
- 集合匹配[](表示匹配集合中的任意一個)(只有MSSQLServer支持)
View CodeSELECT * FROM T_Employee WHERE FName LIKE '[SJ]%'
上面代表:以“S”或者“J“開頭長度,長度任意
- 否定符"^"(用來對集合取反)(只有MSSQLServer支持)
View CodeSELECT * FROM T_Employee WHERE FName LIKE '[^SJ]%'
上面表示:不以“S”或者“J“開頭,長度任意。
- is null和is not null(空值檢測)
View CodeSELECT * FROM T_Employee WHERE FNAME IS NOT NULL AND FSalary <5000上面表示:查詢所有姓名已知且工資小於5000的員工信息
- "!","<>","not"(反義運算符)
View CodeSELECT * FROM T_Employee WHERE FAge<>22 AND FSALARY !=2000
上面表示:所有年齡不等於22歲並且工資不等於2000元”.(!=和<>)
View CodeSELECT * FROM T_Employee WHERE NOT(FAge=22) AND NOT(FSALARY<2000)
上面表示:檢索所有年齡不等於22歲並且工資不小於2000元(not)
- where...or...和in(),(多值運算)
View CodeSELECT FAge,FNumber,FName FROM T_Employee WHERE FAge=21 OR FAge=22 OR FAge=25; SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge IN (21,22,25)
上面兩句結果完全一樣,都是要把21,22,25的所有信息查詢出來
- 范圍值查詢(between...and...)
View CodeSELECT * FROM T_Employee WHERE FAGE>=23 AND FAGE <=27; SELECT * FROM T_Employee WHERE FAGE BETWEEN 23 AND 27
上面結果完全一樣,檢索所有年齡介於23歲到27歲之間的員工信息
- group by(分組)
View CodeSELECT FAge FROM T_Employee WHERE FSubCompany = 'Beijing' GROUP BY FAge
GROUP BY子句必須放到SELECT語句的之后,如果SELECT語句有WHERE子句,則GROUP BY子句必須放到WHERE語句的之后。
雖然GROUP BY子句常常和聚合函數一起使用,不過GROUP BY子句並不是不能離開聚合函
數而單獨使用的,GROUP BY子句中可以指定多個列,只需要將多個列的列名用逗號隔開即可。 -
數據分組與聚合函數
View CodeSELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge
上面表示:查看每個年齡段的員工的人數
- count(*)是會對每個分組統計總數
- having(對部分數組盡心篩選)
View Code--這是錯誤的(語法錯誤) SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge WHERE COUNT(*)>1
上面報錯是因為:聚合函數不能在where語句中使用,必須要用having字句來代替.比如下面
View CodeSELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1
HAVING語句中也可以像WHERE語句一樣使用復雜的過濾條件:檢索人數為1個或者3個的年齡段
View CodeSELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) =1 OR COUNT(*) =3
也可以使用IN操作符來實現上面的功能
View CodeSELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) IN (1,3)
- where 和having(使用where的時候group by要位於where之后,使用having的時候group by要位於having之前)
View Code--這句是錯的 SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee HAVING COUNT(*) IN (1,3) GROUP BY FAge
需要特別注意,在HAVING語句中不能包含未分組的列名,例如
View Code--這句是錯的 SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING FName IS NOT NULL
執行的時候數據庫系統會提示類似如下的錯誤信息:
HAVING 子句中的列 'T_Employee.FName' 無效,因為該列沒有包含在聚合函數或 GROUP BY 子句中。
需要用WHERE語句來代替HAVING,修改后的SQL語句如下:
View CodeSELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee WHERE FName IS NOT NULL GROUP BY FAge
- 限制結果集行數:在進行數據檢索的時候有時候需要只檢索結果集中的部分行
- MySql(MYSQL中提供了LIMIT關鍵字用來限制返回的結果集,LIMIT放在SELECT語句的最后位置)(語法:“LIMIT 首行行號,要返回的結果集的最大數目”。)
View Codeselect * from person order by age desc limit 2,5;
上面表示:返回按照年齡降序的從第二行開始(行號從0開始)的最多5條記錄;
View CodeSELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 0,5
上面表示:按照工資降序排列的前五條記錄
- MSSQLServer 2000(提 供 了 TOP 關 鍵 字 用來 返回 結 果 集 中的 前 N條 記錄)
View Codeselect top 5 * from T_Employee order by FSalary Desc
上面表示:檢索工資水平排在前五位(按照工資從高到低)的員工信息.
View CodeSELECT top 3 * FROM T_Employee WHERE FNumber NOT IN(SELECT TOP 5 FNumber FROM T_Employee ORDER BY FSalary DESC)ORDER BY FSalary DESC
上面表示:
檢索按照工資從高到低排序檢索從第六名開始一共三個人的信息;
-
MSSQLServer2005(容幾乎所有的MSSQLServer2000的語法,另外提供ROW_NUMBER()幫助更好的限制結果集行數的功能)(ROW_NUMBER()函數可以計算每一行數據在結果集中的行號(從1開始計數))<語法:
ROW_NUMBER OVER(排序規則)
>
View Codeselect ROW_NUMBER() OVER(order by FSalary),FNumber,FName,FSalary,FAge from T_Employee
會輸出如下圖
如果想得到第3行到第5行的數據:下面的是錯的
View Code--代碼是錯的 SELECT ROW_NUMBER() OVER(ORDER BY FSalaryDESC),FNumber,FName,FSalary,FAge FROM T_Employee WHERE (ROW_NUMBER() OVER(ORDER BY FSalary DESC))>=3 AND (ROW_NUMBER() OVER(ORDER BY FSalary DESC))<=5
運行時會報錯:開窗函數只能出現在 SELECT 或 ORDER BY 子句中::也就是說ROW_NUMBER()不能用在WHERE語句中.
View Codeselect * from (select row_number()over(order by fsalary desc)as rownum,fname,fname,fsalary,fage from t_employee) as a where a.rownum>=3 and a.rownum<=5
上面的結果就是想要的結果
- Oracle(Oracle中支持窗口函數ROW_NUMBER(),其用法和MSSQLServer2005中相同)(orace中定義別名的時候不能用as)
View Codeselect * from(select row_number() over(order by fsalary desc) row_num,fnumber,fname,fsalary,fage from t_employee) a where a.row_num>=3 and a.row_num<=5
不過oracle提供了更方便的特性,用來計算行號,oracle為每個結果集都默認增加了一個默認的表示行號的列,這個列的名稱為rownum(從1開始計數)
View CodeSELECT * FROM T_Employee WHERE rownum<=6 ORDER BY FSalary Desc
上面表示:按工資從高到底排序的前6名員工的信息;
當進行檢索的時候,對於第一條數據,其rownum為1,因為符合“WHERE rownum<=6”
所以被放到了檢索結果中;當檢索到第二條數據的時候,其rownum為2,因為符合“WHERE
rownum<=6”所以被放到了檢索結果中……依次類推,直到第七行。
View Code---這是錯誤的代碼 SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee WHERE rownum BETWEEN 3 AND 5 ORDER BY FSalary DESC
當進行檢索的時候,對於第一條數據,其rownum為1,因為不符合“WHERE rownum
BETWEEN 3 AND 5”,所以沒有被放到了檢索結果中;當檢索到第二條數據的時候,因為第
一條數據沒有放到結果集中,所以第二條數據的rownum仍然為1,而不是我們想像的2,所以因
為不符合“WHERE rownum<=6”,沒有被放到了檢索結果中;當檢索到第三條數據的時候,
因為第一、二條數據沒有放到結果集中,所以第三條數據的rownum仍然為1,而不是我們想像的3,所以因為不符合“WHERE rownum<=6”,沒有被放到了檢索結果中…… - DB2也支持row_number(),語法跟mssql和oracle一樣,還提供了fetch關鍵字用來提取前N行..語法為:fetch first 條數 rows only
View Codeselect * from t_employee order by fsalary desc fetch first 6 rows only --必須注意:fetch字句要放在order by語句后面
上面表示:
按工資從高到底排序的前6名員工的信息
View Codeselect * from t_employee where fnumber not in(select fnumber from t_employee order by fsalary desc fetch first 5 rows only) order by fsalary desc fetch first 3 rows only
上面表示:檢索按照工資從高到低排序檢索從第六名開始一共三個人的信息
- 數據庫分頁
假設頁面上有首頁,尾頁,上一頁,下一頁.每頁顯示條數為PageSize,當前頁數(從0開始)為CurrentIndex,那么只要查詢從第PageSize*CurrentIndex開始的PageSize條數據,得到的就過就是當前頁的數據;點擊[上一頁],將currentindex設置為currentindex-1;點擊[下一頁],將currentindex設置為currentindex+1;點擊[首頁],將currentindex設置為0;點擊[尾頁],將currentindex設置為 "總條數/PageSize"(如果有余,再加1).
-
抑制數據重復
當我們做數據檢索的時候,如果一列的數據有重復的,這不是我們想要的,比如,我們檢索公司人元列表的時候,很多部門名稱是相同的,這不是我們想要的,我門想要的就是把重復的部門只留下一個,distinct關鍵字是用來進行重復數據抑制的最簡單的功能,而且所有的數據庫都支持distinct.distinct語法只需要在select之后增加distinct即可
View Codeselect fdepartment from t_employee
效果是這樣的

View Codeselect distinct fdepartment from t_employees
加了distinct之后的效果

- DISTINCT是對整個結果集進行數據重復抑制的,而不是針對每一個列
View Codeselect distinct fdepartment,fsubcompany from t_employees
檢索結果中不存在fdepartment和fsubcompany列都重復的數據行,但卻存在fdepartment列重復的數據行,這就說明DISTINCT是對整個結果集進行數據重復抑制的
-
字符串的拼接
