1. 程式人生 > >數據庫 、 語句查詢、函數

數據庫 、 語句查詢、函數

相加 string 不存在 growth delphi 獲取 耗時 說明 答案

創建數據庫

創建之前判斷該數據庫是否存在 if exists (select * from sysdatabases where name=‘databaseName‘) drop database databaseName go Create DATABASE databasename on primary-- 默認就屬於primary文件組,可省略 ( /*--數據文件的具體描述--*/ name=‘databasename_data’,-- 主數據文件的邏輯名稱 filename=‘‘所存位置:\databasename_data.mdf’, -- 主數據文件的物理名稱 size=數值mb, --主數據文件的初始大小 maxsize=數值mb, -- 主數據文件增長的最大值 filegrowth=數值%--主數據文件的增長率 ) log on ( /*--日誌文件的具體描述,各參數含義同上--*/ name=‘databasename_log‘, -- 日誌文件的邏輯名稱 filename=‘所存目錄:\databasename_log.ldf‘, -- 日誌文件的物理名稱 size=數值mb, --日誌文件的初始大小 filegrowth=數值%--日誌文件的增長值 )

刪除數據庫

drop database databasename

備份

--- 創建備份數據的 device USE master EXEC sp_addumpdevice ‘disk‘, ‘testBack‘, ‘c:\mssql7backup\MyNwind_1.dat‘ --- 開始備份 BACKUP DATABASE pubs TO testBack

創建新表

create table tabname(col1 type1 [not null] [primary key] identity(起始值,遞增量) ,col2 type2 [not null],..)--primary key為主鍵 identity表示遞增數量 根據已有的表創建新表: A:go use 原數據庫名 go select * into 目的數據庫名.dbo.目的表名 from 原表名(使用舊表創建新表) B:create table tab_new as select col1,col2… from tab_old definition only

創建序列

create sequence SIMON_SEQUENCE minvalue 1 -- 最小值 maxvalue 999999999999999999999999999 -- 最大值 start with 1 -- 開始值 increment by 1 -- 每次加幾 cache 20;

刪除表

drop table tabname--這是將表連同表中信息一起刪除但是日誌文件中會有記錄

刪除信息

delete from table_name-這是將表中信息刪除但是會保留這個表

增加列

Alter table table_name add column_name column_type [default 默認值]--在表中增加一列,[]內的內容為可選項

刪除列

Alter table table_name drop column column_name--從表中刪除一列

添加主鍵

Alter table tabname add primary key(col) 說明:刪除主鍵:Alter table tabname drop primary key(col)

創建索引

create [unique] index idxname on tabname(col…。) 刪除索引:drop index idxname on tabname 註:索引是不可更改的,想更改必須刪除重新建。

創建視圖

create view viewname as select statement 刪除視圖:drop view viewname

基本語句

(1) 數據記錄篩選: sql="select * from 數據表 where字段名=字段值 order by字段名[desc]"(按某個字段值降序排列。默認升序ASC) sql="select * from 數據表 where字段名like ‘%字段值%‘ order by 字段名 [desc]" sql="select top 10 * from 數據表 where字段名=字段值 order by 字段名 [desc]" sql="select top 10 * from 數據表 order by 字段名 [desc]" sql="select * from 數據表 where字段名in (‘值1‘,‘值2‘,‘值3‘)" sql="select * from 數據表 where字段名between 值1 and 值2" (2) 更新數據記錄: sql="update 數據表 set字段名=字段值 where 條件表達式" sql="update 數據表 set 字段1=值1,字段2=值2 …… 字段n=值n where 條件表達式" (3) 刪除數據記錄: sql="delete from 數據表 where 條件表達式" sql="delete from 數據表" (將數據表所有記錄刪除) (4) 添加數據記錄: sql="insert into 數據表 (字段1,字段2,字段3 …) values (值1,值2,值3 …)" sql="insert into 目標數據表 select * from 源數據表" (把源數據表的記錄添加到目標數據表) (5) 數據記錄統計函數: AVG(字段名) 得出一個表格欄平均值 COUNT(*;字段名) 對數據行數的統計或對某一欄有值的數據行數統計 MAX(字段名) 取得一個表格欄最大的值 MIN(字段名) 取得一個表格欄最小的值 SUM(字段名) 把數據欄的值相加 引用以上函數的方法: sql="select sum(字段名) as 別名 from 數據表 where 條件表達式" set rs=conn.excute(sql) 用 rs("別名") 獲取統計的值,其它函數運用同上。 查詢去除重復值:select distinct * from table1 (6) 數據表的建立和刪除: CREATE TABLE 數據表名稱(字段1 類型1(長度),字段2 類型2(長度) …… ) (7) 單列求和: SELECT SUM(字段名) FROM 數據表

最新語句

編輯 查詢數據庫中含有同一這字段的表: select name from sysobjects where xtype = ‘u‘ and id in(select id from syscolumns where name = ‘s3‘) 根據出生日期可以算出年齡: select datediff(year,scrq,‘2013‘) as 年齡 from page_shsjgrgl 根據當前年份自動算出年齡 select datediff(year,csny,cast(YEAR(GETDATE()) as char)) 年 select year(djsj) from page_shsjgrgl 月 select month(djsj) from page_shsjgrgl 日 select day(djsj) from page_shsjgrgl 在同一數據庫中復制表結構: select * into a from b where 1<>1 當 IDENTITY_INSERT 設置為 OFF 時,不能為表 ‘aa‘ 中的標識列插入顯式值。 set identity_insert aa ON----設置打開, 批量插入: insert into aa(Customer_ID, ID_Type, ID_Number) select Customer_ID, ID_Type, ID_Number from TCustomer; set identity_insert aa OFF---關閉 不同數據庫之間的復制: 復制結構: select * into test.dbo.b from GCRT.dbo.page_shsjgrgl where 1<>1 復制內容: insert into test.dbo.b(xm,ssdq) select xm,ssdq from GCRT.dbo.page_shsjgrgl 查看數據庫中所有的數據表表名: select name from SysObjects where type=‘u‘ 查看數據庫中所有表含有同一字段的表: select name from sysobjects where xtype = ‘u‘ and id in(select id from syscolumns where name = ‘同一字段‘) 查看數據表中的所有字段: select name from Syscolumns where id=object_id(‘表名‘) 查詢數據庫時前10條記錄: select top 10 * from td_areacode order by newid() 修改字段類型: ALTER TABLE 表名 ALTER COLUMN 字段名 varchar(30) NOT NULL use ZHJIANGJGYL declare @temp nvarchar(30) set @temp = ‘ZWI4‘ select hllx from page_yljg_zyry where hllx not in( select case @temp when ‘‘ then ‘‘ else b1 end from ( select * from TD_Code where page_en=‘page_yljg_zyry‘ and B2=‘ZWI‘ ) s where s.b1 != case @temp when ‘‘ then ‘‘ else @temp end ) 更改數據庫表字段類型: alter table page_shsjgrgl alter column s1 int

高級查詢

A:UNION運算符 UNION 運算符通過組合其他兩個結果表(例如TABLE1 和TABLE2)並消去表中任何重復行而派生出一個結果表。當 ALL 隨UNION 一起使用時(即UNION ALL),不消除重復行。兩種情況下,派生表的每一行不是來自TABLE1 就是來自TABLE2。 B: EXCEPT運算符 EXCEPT 運算符通過包括所有在TABLE1 中但不在TABLE2 中的行並消除所有重復行而派生出一個結果表。當ALL 隨EXCEPT 一起使用時(EXCEPT ALL),不消除重復行。 C:INTERSECT運算符 INTERSECT 運算符通過只包括TABLE1 和TABLE2 中都有的行並消除所有重復行而派生出一個結果表。當ALL 隨INTERSECT 一起使用時(INTERSECT ALL),不消除重復行。 註:使用運算詞的幾個查詢結果行必須是一致的。

外連接

A、left outer join: 左外連接(左連接):結果集既包括連接表的匹配行,也包括左連接表的所有行。 SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right outer join: 右外連接(右連接):結果集既包括連接表的匹配連接行,也包括右連接表的所有行。 C:full outer join: 全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。

判斷對象

編輯 判斷數據庫是否存在 if exists (select*fromsysdatabaseswherename= ‘數據庫名‘) dropdatabase[數據庫名] 判斷表是否存在 if not exists (select * from sysobjects where [name] = ‘表名‘ and xtype=‘U‘) begin --這裏創建表 end 判斷存儲過程是否存在 if exists (select*fromsysobjectswhereid = object_id(N‘[存儲過程名]‘) and OBJECTPROPERTY(id, N‘IsProcedure‘) = 1) dropprocedure[存儲過程名] 判斷臨時表是否存在 if object_id(‘tempdb..#臨時表名‘)isnot null droptable#臨時表名 判斷視圖是否存在 --SQL Server 2000 IF EXISTS (SELECT*FROMsysviewsWHEREobject_id = ‘[dbo].[視圖名]‘ --SQL Server 2005 IF EXISTS (SELECT*FROMsys.viewsWHEREobject_id = ‘[dbo].[視圖名]‘ 判斷函數是否存在 if exists (select*fromdbo.sysobjectswhereid = object_id(N‘[dbo].[函數名]‘) and xtype in (N‘FN‘, N‘IF‘, N‘TF‘)) dropfunction[dbo].[函數名] 獲取創建信息 SELECT[name],[id],crdateFROMsysobjectswherextype=‘U‘ /* xtype 的表示參數類型,通常包括如下這些 C =CHECK約束 D = 默認值或DEFAULT約束 F =FOREIGNKEY約束 L =日誌FN =標量函數IF = 內嵌表函數 P =存儲過程PK =PRIMARYKEY約束(類型是K) RF = 復制篩選存儲過程 S = 系統表 TF = 表函數 TR =觸發器U = 用戶表 UQ =UNIQUE約束(類型是K) V = 視圖 X = 擴展存儲過程 */ 判斷列是否存在 if exists(select*fromsyscolumnswhereid=object_id(‘表名‘) andname=‘列名‘) altertable表名dropcolumn列名 判斷列是否自增列 if columnproperty(object_id(‘table‘),‘col‘,‘IsIdentity‘)=1 print ‘自增列‘ else print ‘不是自增列‘ SELECT*FROMsys.columnsWHEREobject_id=OBJECT_ID(‘表名‘) AND is_identity=1 判斷表中是否存在索引 if exists(select*fromsysindexeswhereid=object_id(‘表名‘) andname=‘索引名‘) print ‘存在‘ else print ‘不存在 查看數據庫中對象 SELECT*FROMsysobjectsWHEREname=‘對象名‘ select * from table(所要查詢的表名) where coloum(條件)

一、數據庫、表的基本操作

1.首先數據庫的基本操作:

[sql] view plain copy 技術分享圖片技術分享圖片
  1. create database hpu --創建名為 hpu的數據庫
  2. use hpu --更改當前數據庫為 hpu,即接下來的操作是基於 hpu數據庫的
  3. drop hpu --刪除數據庫 hpu
2.然後對表操作:

(1)表的創建

車很普及了在今天,很多人都要考駕照,本人還沒拿到手,心疼。。。

以車牌號為例建個表命名為 vehicle

[sql] view plain copy 技術分享圖片技術分享圖片
  1. create table vehicle
  2. (
  3. number_id varchar(11), --車牌
  4. brand varchar(11), --品牌
  5. color varchar(11), --顏色
  6. makedate date --出廠日期
  7. )

(2)表的刪除

[sql] view plain copy 技術分享圖片技術分享圖片
  1. drop table vehicle --刪除表中數據,同時刪除該表
  2. delete vehicle --刪除表中數據

-------------------------------- Second --------------------------------

二、字段的操作及記錄的增刪改查

(1)字段的操作

[sql] view plain copy 技術分享圖片技術分享圖片
  1. alter table vehicle add carowner varchar(20) --增加字段(列)
  2. alter table vehicle alter column carowner int --修改字段類型
  3. alter table vehicle alter column carowner varchar(15)
  4. sp_rename ‘vehicle.carowner‘,‘carmaster‘,‘column‘ --修改列名
  5. alter table vehicle drop column carmaster --刪除表 vehicle的字段 carmaster

(2)基本的增刪改查是最簡單、最基本也是最常用的 sql語句

[sql] view plain copy 技術分享圖片技術分享圖片
  1. insert into vehicle(number_id,brand,makedate) values(‘豫HPU579‘,‘紅旗‘,getdate())
  2. insert into vehicle values(‘豫HPU33U‘,‘大眾‘,‘銀灰色‘,getdate())
  3. insert into vehicle values(‘豫HPU123‘,‘紅旗‘,‘黑色‘,getdate()-365*2)
  4. delete vehicle where number_id = ‘豫HPU23U‘<span style="white-space:pre"> </span>--按條件刪除
  5. delete vehicle<span style="white-space:pre"> </span>--刪除表中全部記錄
  6. update vehicle set color = ‘紅色‘ where brand = ‘紅旗‘<span style="white-space:pre"> </span>--按條件更新車的顏色
  7. update vehicle set makedate = getdate()<span style="white-space:pre"> </span>--更新表中全部記錄的出廠日期為當前時間
  8. select number_id,makedate from vehicle where brand = ‘紅旗‘<span style="white-space:pre"> </span>--按條件查找所需字段的數據
  9. select top 2 * from vehicle<span style="white-space:pre"> </span>--查詢表中的前兩條記錄
  10. select * from vehicle

-------------------------------- Third --------------------------------

三、約束

約束從字面上理解就是存在一種或多種規則,條件來規範字段、數據。約束用於維護數據庫完整性,通過表中的列定義約束可以有效防止將錯誤的數據插入表中,也可以保證表之間數據的一致性。

常用的約束有:

1.Primary key主鍵約束

2.Foreign key外鍵約束

3.Unique唯一約束

4.Check檢查約束

5.Default默認約束

6.Not null不為空

例如對上表 vehicle創建時設置約束

[sql] view plain copy 技術分享圖片技術分享圖片
  1. create table vehicle
  2. (
  3. number_id varchar(11) primary key, --設為主鍵
  4. brand varchar(11) not null, --數據不為空
  5. color varchar(11) default ‘黑色‘, --默認顏色為黑色
  6. makedate date not null --出廠日期
  7. )

測試約束:

[sql] view plain copy 技術分享圖片技術分享圖片
  1. insert into vehicle(number_id,brand,makedate) values(‘豫HPU579‘,‘紅旗‘,getdate()) --插入成功;顏色默認值為 ‘黑色‘
  2. insert into vehicle(number_id,brand,makedate) values(‘豫HPU579‘,‘大眾‘,getdate()) --插入失敗:主鍵唯一,已存在主鍵為 ‘豫HPU579‘的記錄不能再插入
  3. insert into vehicle values(‘豫HPU123‘,‘大眾‘,‘蘋果綠‘,getdate()) --插入成功;
  4. insert into vehicle values(‘豫HPU678‘,null,‘蘋果綠‘,getdate()) --插入失敗;不能將值 NULL 插入列 ‘brand‘,列不允許有 Null 值
執行查詢語句結果如下:

技術分享圖片

就像上面如果沒有將約束寫在表的創建語句裏,而表已經創建好的情況下。該怎麽修改呢?

修改語句實例如下:

[delphi] view plain copy 技術分享圖片技術分享圖片
  1. alter table vehicle alter column number_id varchar(11) not null --設置字段不為空
  2. alter table vehicle alter column brand varchar(11) not null
  3. alter table vehicle alter column makedate date not null
  4. alter table vehicle add constraint PK_number_id primary key(number_id) --修改字段 number_id為主鍵
  5. alter table vehicle add constraint DF_color Default(‘灰色‘) for color --設置默認值
  6. alter table vehicle add constraint CK_makedate check(makedate < getdate()) --核查生產日期應該小於今天
其他修改語句相似。

-------------------------------- Fourth--------------------------------

四、函數

數據庫語句也有函數,上面的例子中已經用到一個函數 getdate()得到當前時間。

rand()隨機函數;

sin(),cos(),tan()三角函數;

sum(),avg(),max(),min(),len()等求和,求平均數,最大最小值球長度函數;

datediff(),getdate(),dateadd()日期函數;

cast(),str(),char()數據轉換函數;

substring(),left(),right(),ltrim()截取字符串函數等。

下面寫個例子簡單說明函數的使用:(利用函數生成一個長度為49的字符串,計算程序運行所需時間)

[sql] view plain copy 技術分享圖片技術分享圖片
  1. print(‘當前時間:‘)
  2. print(getdate()) --得到當前時間
  3. declare @i int , @c varchar(50),@date1 datetime,@date2 datetime
  4. set @i = 0
  5. set @c = ‘‘
  6. set @date1 = getdate()
  7. while @i < 49
  8. begin
  9. set @c = @c + char(round(rand()*26+65,0)) <span style="white-space:pre"> </span>--隨機函數,保證生成的數字是隨機的,對應的字符不全相同
  10. set @i = @i + 1
  11. end
  12. set @date2 = getdate()
  13. print @c
  14. print ‘答案的長度為: ‘+cast(len(@c) as varchar(10)) <span style="white-space:pre"> </span>--len()的結果為整型,cast轉換為字符串類型
  15. print(‘運行時間為:‘+cast(datediff(ms,@date1,@date2) as varchar(10))+‘ms‘)--datediff計算兩個給定的時間差,單位為毫秒
運行結果如下:

技術分享圖片

-------------------------------- Fifth--------------------------------

五、視圖與索引

1.視圖創建與刪除

[sql] view plain copy 技術分享圖片技術分享圖片
  1. create view testview as select * from vehicle --創建視圖
  2. select * from testview
  3. select * from vehicle
  4. drop view testview --刪除視圖
在sql server2012下執行查詢表與查詢視圖的結果如下:

技術分享圖片

技術分享圖片

視圖的查詢結果與普通的查詢表記錄得到的結果相同。兩者的區別是視圖查詢的結果是邏輯結果,直接查詢表獲取的是實際數據。視圖防止了對表數據的誤刪等操作。不知道我說的對不對,如果有錯誤或不規範請告訴我。謝謝^_^。

視圖的作用:

(1)隱藏了數據的復雜性

(2)有利於控制用戶對表中某些列的訪問

(3)使用戶查詢變得簡單。

2.索引的創建與使用

[sql] view plain copy 技術分享圖片技術分享圖片
  1. create index testindex on vehicle(number_id) --創建索引
  2. select * from vehicle where number_id = ‘豫HPU579‘
  3. drop index vehicle.testindex --刪除索引
(1)索引的創建,使數據的查詢變得很快,大大減少了查詢時間,在數據總量較少的情況下看不出來,測試插入 200,000條記錄到表 vehicle中,通過 getdate()函數計算出創建索引前隨機的查詢表中的一條記錄耗時56毫秒,創建索引後用時3毫秒。

技術分享圖片

技術分享圖片

技術分享圖片

(2)索引描述:

用戶對數據庫最頻繁的操作是進行數據查詢。一般情況下,數據庫在進行查詢操作時需要對整個表進行數據搜索。當表中的數據很多時,搜索數據就需要很長的時間,這就造成了服務器的資源浪費。為了提高檢索數據的能力,數據庫引入了索引機制用戶對數據庫最頻繁的操作是進行數據查詢。

-------------------------------- Sixth--------------------------------

六、觸發器

1.觸發器的創建與刪除

[sql] view plain copy 技術分享圖片技術分享圖片
  1. create trigger testtri on vehicle for insert,update,delete as
  2. begin
  3. print(‘你對表 vehicle 進行了操作‘)
  4. end --創建觸發器
  5. drop trigger testtri --刪除觸發器

此時在執行刪除插入或更新操作,控制臺會輸出提示語句。觸發器的創建實現了對表記錄的操作進行監聽。

效果如下:

技術分享圖片

觸發器就是可以在執行某操作前或某個事件觸發而執行的操作。

2.觸發器的作用

百度給出的作用:

(1)可在寫入數據表前,強制檢驗或轉換數據

(2)觸發器發生錯誤時,異動的結果會被撤銷

(3)部分數據庫管理系統可以針對數據定義語言(DDL)使用觸發器,稱為 DDL觸發器

(4)可依照特定的情況,替換異動的指令

數據庫 、 語句查詢、函數