SQL語句基礎學習函數是怎樣的
既然數據庫中有許多資料都是已數字的型態存在,一個很重要的用途就是要能夠對這些數字做一些運算,例如將它們總合起來,或是找出它們的平均值。
SQL 有提供一些這一類的函數。它們是: AVG (平均) COUNT (計數) MAX (最大值) MIN (最小值) SUM (總合) 運用函數的語法是: SELECT "函數名"("欄位名") FROM "表格名" 舉例來說,若我們要由我們的示范表格中求出 Sales 欄位的總合 Store_Information 表格 store_namesalesdate Los Angeles$1500jan-05-1999 San Francisco$300jan-08-1999 Boston$700jan-08-1999 我們就打入 SELECT SUM(Sales) FROM Store_Information 結果: SUM(Sales) $2750 $2750 代表所有 Sales 欄位的總合: $1500 + $250 + $300 + $700。
除了函數的運用外,SQL 也可以做簡單的數學運算,例如加(+)和減(-)。對于文字類的資料,SQL 也有好幾個文字處理方面的函數,例如文字相連 (concatenation),文字修整 (trim),以及子字串 (substring)。
不同的數據庫對這些函數有不同的語法,所以最好是參考您所用數據庫的信息,來確定在那個數據庫中,這些函數是如何被運用的。
SQL語句的幾個常用函數
1、sql中sum和count的區別 ----sql聚合函數 (1)首先,sum是對一個字段求和,hive中字段的類型一般是string或者是int,如果是int當然沒有問題,如果是string類型但是全部是數字也沒有問題,但是如果string類型中包含一個字母,sum的結果將會是0 例如如下的表:user_id string shop_id string1234 hello1234 1234 那么sum(user_id)的結果就是2468,sum(shop_id)的結果就是0.如果沒有符合的條件的記錄,sum的返回值就是Null,如:sum(case when user_id但是有些時候我們希望sum的結果如果沒有符合的記錄就返回0,可以用coalesce(shop_id, 0)解決這個問題。
(2)count是對數據記錄的條數進行統計,有一條符合的記錄就是1,沒有就是0.2、 case when then end用法示例: -----sql流程控制函數 case value when compare-value then result when compare-value then result …… else result end 例如:select case when 1>0 then 'yes' else 'no' end;+----------------------------------------+ | case when 1>0 then 'yes' else 'no' end |+----------------------------------------+ | yes |+----------------------------------------+3、row_number( ) over用法: -------sql分析函數 row_number() OVER ( PARTITION BY COL1 ORDER BY COL2) 表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的). 4、if()函數 ----------sql流程控制函數 (1) if(expr1, expr2, expr3) 如果expr1返回真, 則該表達式返回expr2,否則返回expr3 e.g. mysql> select if(strcmp('test','test'),'no','yes');+--------------------------------------+ | if(strcmp('test','test1'),'no','yes') |+--------------------------------------+ | yes |+--------------------------------------+ 說明:strcmp(expr1, expr2)這個函數在expr1小于expr2時,返回-1,相等時返回0,其余情況返回1.在上面的例子中,strcmp返回-1,所以上例輸出返回yes (2) ifnull(expr1, expr2) 該函數在expr1為NULL時,返回expr2,否則,返回expr1. (3) nullif(expr1, expr2) 如果expr1=expr2,則返回NULL,否則,返回expr15、max()函數 和min()函數 ------sql聚合函數 語法:MIN(e1)、MAX(e1) 參數:e1為一個字符型、日期型或數值類型的表達式。若e1為字符型,則根據ASCII碼來判斷最大值與最小值。
返回:根據e1參數的類型,返回對應類型的數據。作用:MIN(e1)返回e1表達式指定的列中最小值;MAX(e1)返回e1表達式指定的列中最大值;說明:max函數可以使用于numeric、char、varchar、money、smallmoney、或datetime列,但不能用于bit列。
不允許使用聚合函數和子查詢。e.g.查詢TEACHER表中教師的最大年齡。
實例代碼:SELECT MAX (AGE) AS MAXAGE FROM TEACHER 運行結果如下圖所示:圖1TEACHER表中教師的最大年齡 然而,在實際應用中得到這個結果并不是特別有用,因為經常想要獲得的信息是具有最大年齡的教師的教工號、姓名、性別等信息。然而SQL不支持如下的SELECT語句: SELECT TNAME, DNAME, TSEX, MAX (AGE) FROM TEACHER 因為聚合函數處理的是數據組,在本例中,MAX函數將整個TEACHER表看成一組,而TNAME、DNAME和TSEX的數據都沒有進行任何分組,因此SELECT語句沒有邏輯意義。
同樣的道理,下面的代碼也是無效的:SELECT TNAME, DNAME, TSEX,SAL ,AGE FROM TEACHER WHERE AGE=MAX (AGE) 解決這個問題的方法,就是在WHERE子句中使用子查詢來返回最大值,然后再基于這個返回的最大值,查詢相關信息。下例在WHERE子句中使用子查詢返回最大值:查詢TEACHER表中年紀最大的教師的教工號、姓名、性別等信息。
實例代碼:SELECT TNAME, DNAME, TSEX, SAL, AGE FROM TEACHER WHERE AGE=(SELECT MAX (AGE) FROM TEACHER) 運行結果如下圖所示:。
請告訴我sql語言的函數
常用T-SQL語言命令函數集(1)數據記錄篩選: sql="select*from數據表where字段名=字段值orderby字段名[desc]" sql="select*from數據表where字段名like'%字段值%'orderby字段名[desc]" sql="selecttop10*from數據表where字段名orderby字段名[desc]" sql="select*from數據表where字段名in('值1','值2','值3')" sql="select*from數據表where字段名between值1and值2" (2)更新數據記錄: sql="update數據表set字段名=字段值where條件表達式" sql="update數據表set字段1=值1,字段2=值2……字段n=值nwhere條件表達式" (3)刪除數據記錄: sql="deletefrom數據表where條件表達式" sql="deletefrom數據表"(將數據表所有記錄刪除) (4)添加數據記錄: sql="insertinto數據表(字段1,字段2,字段3…)values(值1,值2,值3…)" sql="insertinto目標數據表select*from源數據表"(把源數據表的記錄添加到目標數據表) (5)數據記錄統計函數: AVG(字段名)得出一個表格欄平均值 COUNT(*|字段名)對數據行數的統計或對某一欄有值的數據行數統計 MAX(字段名)取得一個表格欄最大的值 MIN(字段名)取得一個表格欄最小的值 SUM(字段名)把數據欄的值相加 引用以上函數的方法: sql="selectsum(字段名)as別名from數據表where條件表達式" setrs=*(sql) 用rs("別名")獲取統的計值,其它函數運用同上。
(5)數據表的建立和刪除: CREATETABLE數據表名稱(字段1類型1(長度),字段2類型2(長度)……) 例:CREATETABLEtab01 (namevarchar (50), datetimedefaultnow ()) DROPTABLE數據表名稱(永久性刪除一個數據表) ======================================================================================= ======================================================================================= 添加、刪除、修改使用*e(Sql)命令執行操作 ╔----------------╗ ☆ 數據記錄篩選 ☆ ╚----------------╝ 注意:單雙引號的用法可能有誤(沒有測式) Sql = "Select Distinct 字段名 From 數據表" Distinct函數,查詢數據庫存表內不重復的記錄 Sql = "Select Count(*) From 數據表 where 字段名1>#18:0:0# and 字段名1< #19:00# " count函數,查詢數庫表內有多少條記錄,“字段名1”是指同一字段 例: set rs=*e("select count(id) as idnum from news") * rs("idnum") sql="select * from 數據表 where 字段名 between 值1 and 值2" Sql="select * from 數據表 where 字段名 between #2003-8-10# and #2003-8-12#" 在日期類數值為2003-8-10 19:55:08 的字段里查找2003-8-10至2003-8-12的所有記錄,而不管是幾點幾分。 select * from tb_name where datetime between #2003-8-10# and #2003-8-12# 字段里面的數據格式為:2003-8-10 19:55:08,通過sql查出2003-8-10至2003-8-12的所有紀錄,而不管是幾點幾分。
Sql="select * from 數據表 where 字段名=字段值 order by 字段名 [desc]" Sql="select * from 數據表 where 字段名 like '%字段值%' order by 字段名 [desc]" 模糊查詢 Sql="select top 10 * from 數據表 where 字段名 order by 字段名 [desc]" 查找數據庫中前10記錄 Sql="select top n * form 數據表 order by newid()" 隨機取出數據庫中的若干條記錄的方法 top n,n就是要取出的記錄數 Sql="select * from 數據表 where 字段名 in ('值1','值2','值3')" ╔----------------╗ ☆ 添加數據記錄 ☆ ╚----------------╝ sql="insert into 數據表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)" sql="insert into 數據表 valuess (值1,值2,值3 …)" 不指定具體字段名表示將按照數據表中字段的順序,依次添加 sql="insert into 目標數據表 select * from 源數據表" 把源數據表的記錄添加到目標數據表 ╔----------------╗ ☆ 更新數據記錄 ☆ ╚----------------╝ Sql="update 數據表 set 字段名=字段值 where 條件表達式" Sql="update 數據表 set 字段1=值1,字段2=值2 …… 字段n=值n where 條件表達式" Sql="update 數據表 set 字段1=值1,字段2=值2 …… 字段n=值n " 沒有條件則更新整個數據表中的指定字段值 ╔----------------╗ ☆ 刪除數據記錄 ☆ ╚----------------╝ Sql="delete from 數據表 where 條件表達式" Sql="delete from 數據表" 沒有條件將刪除數據表中所有記錄) ╔--------------------╗ ☆ 數據記錄統計函數 ☆ ╚--------------------╝ AVG(字段名) 得出一個表格欄平均值 COUNT(*|字段名) 對數據行數的統計或對某一欄有值的數據行數統計 MAX(字段名) 取得一個表格欄最大的值 MIN(字段名) 取得一個表格欄最小的值 SUM(字段名) 把數據欄的值相加 引用以上函數的方法: sql="select sum(字段名) as 別名 from 數據表 where 條件表達式" set rs=*(sql) 用 rs("別名") 獲取統的計值,其它函數運用同上。 ╔----------------------╗ ☆ 數據表的建立和刪除 ☆ ╚----------------------╝ CREATE TABLE 數據表名稱(字段1 類型1(長度),字段2 類型2(長度)。
如何在SQL語句中使用FUNCTION
1、function是SQL的函數
是由一個或多個 Transact-SQL 語句組成的子程序,可用于封裝代碼以便重新使用。Microsoft? SQL Server? 并不將用戶限制在定義為 Transact-SQL 語言一部分的內置函數上,而是允許用戶創建自己的用戶定義函數。
可使用 CREATE FUNCTION 語句創建、使用 ALTER FUNCTION 語句修改、以及使用 DROP FUNCTION 語句除去用戶定義函數。每個完全合法的用戶定義函數名 (database_*_*on_name) 必須唯一。
必須被授予 CREATE FUNCTION 權限才能創建、修改或除去用戶定義函數。不是所有者的用戶在 Transact-SQL 語句中使用某個函數之前,必須先給此用戶授予該函數的適當權限。若要創建或更改在 CHECK 約束、DEFAULT 子句或計算列定義中引用用戶定義函數的表,還必須具有函數的 REFERENCES 權限。
在函數中,區別處理導致刪除語句并且繼續在諸如觸發器或存儲過程等模式中的下一語句的 Transact-SQL 錯誤。在函數中,上述錯誤會導致停止執行函數。接下來該操作導致停止喚醒調用該函數的語句。
用戶定義函數的類型
2、Procedure是SQL的存儲過程
存儲過程是由流控制和SQL語句書寫的過程,這個過程經編譯和優化后存儲在數據庫服務器中,應用程序使用時只要調用即可。在ORACLE中,若干個有聯系的過程可以組合在一起構成程序包。
存儲過程是利用SQL Server所提供的Transact-SQL語言所編寫的程序。Transact-SQL語言是SQL Server提供專為設計數據庫應用程序的語言,它是應用程序和SQL Server數據庫間的主要程序式設計界面。它好比Oracle數據庫系統中的PL-SQL和 Informix的數據庫系統結構中的Informix- 4GL語言。這類語言主要提供以下功能,讓用戶可以設計出符合引用需求的程序:
1)、變量說明
2)、ANSI兼容的SQL命令(如Select,Update….)
3)、一般流程控制命令(if…else…、while….)
4)、內部函數