① 怎麼學習sql語句
創建資料庫
創建之前判斷該資料庫是否存在 if exists (select * from sysdatabases where name='databaseName') drop database 'databaseName' go Create DATABASE database-name
刪除資料庫
drop database dbname
備份sql server
--- 創建 備份數據的 device USE master EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 開始 備份 BACKUP DATABASE pubs TO testBack
創建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根據已有的表創建新表: A:create table tab_new like tab_old (使用舊表創建新表) B:create table tab_new as select col1,col2… from tab_old definition only
刪除新表
drop table tabname
增加一個列
Alter table tabname add column col type 註:列增加後將不能刪除。DB2中列加上後數據類型也不能改變,唯一能改變的是增加varchar類型的長度。
添加主鍵
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
幾個簡單的基本的sql語句
選擇:select * from table1 where 范圍 插入:insert into table1(field1,field2) values(value1,value2) 刪除:delete from table1 where 范圍 更新:update table1 set field1=value1 where 范圍 查找:select * from table1 where field1 like 』%value1%』 (所有包含『value1』這個模式的字元串)---like的語法很精妙,查資料! 排序:select * from table1 order by field1,field2 [desc] 總數:select count(*) as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1[separator]
幾個高級查詢運算詞
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: 全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
② 很有意思的SQL查詢題目,看看大家如何解決
兩個難點:
1、如何讓Sql Server取到字元串中的數字,比如1、2、4和11、12、4雖然都是三位數字,但前者只有個位,後者含有十位和個位,用substring肯定是不行了。
2、如果取出了數字,還要依次遍歷整張表,循環取ID,並去除重復ID
總得說來第一條智能取數比較折磨人。
標記一下,看有無高人進來
--------------------------------
仔細思考了下,還是做出來了,真的很折磨人。
下面的語句全部一下執行就可以看到結果了。
其中@strIn就是需要查找的字元串,如果要查看其他數據,修改這個值就可以了。
思路是把一個欄位值變成多行數據,把','變為' union all'拼接語句實現。
--建立測試變數表@T,並賦值
declare @T table(id int,strnum varchar(50))
insert into @T
select 1,'1,2,4,5,8,9'
union all
select 2,'1,3,5,6,7,8,9,11'
union all
select 3,'3,4,5,6,7'
union all
select 4,'1,5,7,8,9'
union all
select 5,'3,5,6,9,11,12'
union all
select 6,'2,3,4,5,7'
union all
select 7,'3,4,5,6,7,8'
union all
select 8,'1,2,3,4,5,6,7,8,9,10'
union all
select 9,'1,7,8,9'
--@strIn查找的字元串
declare @strIn varchar(1000)
set @strIn = '1,11,12'
declare @strtable table(strSql varchar(4000))
insert into @strtable
Select 'select '''+cast(id as varchar(3))+''' as id,'''+replace(strnum,',',''' as num Union all Select ' + ''''+cast(id as varchar(3))+''' as id, ''') + ''' as num'
from @T
declare @comtable table(strSql varchar(4000))
insert into @comtable
select 'select '''+replace(@strIn,',',''' as num Union all Select ''' )+ ''' as num'
declare @textsql varchar(4000)
set @textsql = ''
Select @textsql=@textsql+strSql+' Union all ' from @strtable
set @textsql = substring(@textsql,1,len(@textsql)-10)
declare @comsql varchar(4000)
set @comsql = ''
Select @comsql=@comsql+strSql+' Union all ' from @comtable
set @comsql = substring(@comsql,1,len(@comsql)-10)
set @textsql = 'declare @Rtexttable table(id int,num varchar(3)) insert into @Rtexttable '+@textsql+
' declare @Rcomtable table(num varchar(3)) insert into @Rcomtable '+@comsql+' select distinct id from @Rtexttable a join @Rcomtable b on a.num = b.num'
exec (@textsql)
-------------------------
看了WHITE_WIN的,醍醐灌頂,豁然開朗。本人不喜歡用函數就改成存儲過程了
declare @T table(id int,strnum varchar(50))
insert into @T
select 1,'1,2,4,5,8,9'
union all
select 2,'1,3,5,6,7,8,9,11'
union all
select 3,'3,4,5,6,7'
union all
select 4,'1,5,7,8,9'
union all
select 5,'3,5,6,9,11,12'
union all
select 6,'2,3,4,5,7'
union all
select 7,'3,4,5,6,7,8'
union all
select 8,'1,2,3,4,5,6,7,8,9,10'
union all
select 9,'1,7,8,9'
declare @strIn varchar(100)
set @strIn = '1,11,12'
declare @RT table (strnum varchar(30))
while charindex(',',@strIn)>0
begin
insert into @RT select left(@strIn,charindex(',',@strIn)-1)
set @strIn = substring(@strIn,charindex(',',@strIn)+1,len(@strIn))
end
If(len(@strIn)>0)
begin
insert into @RT select @strIn
end
select a.id from @T a, @RT b where ','+a.strnum+',' like '%,'+b.strnum+',%'
group by a.id
order by a.id
③ 使用SQL語句創建並測試資料庫的難點和注意事項是什麼
首先說說怎麼用SQL語句創建資料庫,創建資料庫的語句有如下幾種:
1. CREATE TABLE(創建新表)
2. CREATE INDEX(增加索引)
3. DROP INDEX(刪除索引)
4. CONSTRAINT(約束語句)
5. ALTER TABLE(修改表)
6. DROP TABLE(刪除表)
CREATE TABLE語句:
在資料庫中生成新表,表中欄位的類型能夠為:INTEGER(整型)、LONG(長整型)、 SINGLE(單精度浮點數)、DOUBLE(雙精度浮點數)、DATETIME(日期型,也能夠寫成DATE)、BIT(布爾型)、 TEXT(字元串型,最大255個位元組)、MEMO(字元串型,最大可達1.2G位元組)、 COUNTER(自動遞增長整型,可確定記錄的唯一性)、CURRENCY(貨幣型,精確到小數點左邊15位,右邊4位)、 BINARY(位元組型,最大255個)、LONGBINARY(用於OLE對象)、GUID(全局唯一標識符)。
生成表NewTable,該表有文本欄位Field1和整型欄位Field2,表名和欄位名能夠隨便您取,不區分大小寫,但是,有些保留字不能用作表名欄位名,比如Number
CREATE TABLE NewTable(Field1 TEXT(30), Field2 INTEGER);
CREATE INDEX語句:
INDEX是為了加快查找記錄的速度,或是為了增加欄位約束關系而配置的。
創建索引語句執行前表中能夠有記錄,但存在的記錄必須滿足該索引語句的約束關系,否則語句不能執行,另外要注意的是在同一個資料庫中(而不但僅是在同一個表中),索引名不能相同,否則語句也會失敗。
生成欄位Field1的索引欄位NewIndex,兩條語句作用相同
生成後Field1欄位能夠有相同的值,能夠有空值(NULL)
CREATE INDEX NewIndex ON NewTable (Field1);
CREATE INDEX NewIndex ON NewTable (Field1) WITH IGNORE NULL;
生成欄位Field1的索引欄位NewIndex,注意,每個表裡只能有一個主索引(PRIMARY)。生成後Field1欄位不能有相同的值,不能有空值(當然,假如是TEXT類型,能夠有一個空串,但是空串不是空值)
CREATE INDEX NewIndex ON NewTable(Field1) WITH PRIMARY;
欄位Field1不能有相同的值,但能夠有空值(兩個空值不算相同的值)
CREATE UNIQUE INDEX NewIndex ON NewTable(Field1);
欄位Field1能夠有相同的值,但不能有空值
CREATE INDEX NewIndex ON NewTable(Field2) WITH DISALLOW NULL
能夠在索引語句中加入ASC(升序)或DESC(降序)來控制記錄排列順序假如不使用順序字,SQL則默認使用ASC順序
CREATE INDEX NewIndex ON NewTable(Field1 ASC, Field2 DESC);
DROP INDEX語句:
刪除表NewTable中的索引NewIndex,語句執行前索引NewIndex必須存在
DROP INDEX NewIndex ON NewTable;
CONSTRAINT語句:
CONSTRAINT子句用於創建資料庫完整性的索引,他和INDEX語句作用相同,有些地方能夠互相替代,他能夠使用PRIMARY KEY(主關鍵字),UNIQUE(唯一)和FOREIGN KEY(外部關鍵字),和INDEX相比不能使用IGNOR NULL和DISALLOW NULL,但多了FOREIGN KEY(這也是他最強大的地方)。另外, CONSTRAINT語句必須和CREATE TABLE或ALTER TABLE語句一起使用。
生成表NewTable,主關鍵欄位是Field1,主索引是NewPK
CREATE TABLE NewTable(Field1 LONG CONSTRAINT NewPK PRIMARY KEY, Field2 MEMO, Field3 DATETIME);
生成索引為NewUK的表NewTable,Field1不能有相同值,能夠有空值
CREATE TABLE NewTable(Field1 INTEGER CONSTRAINT NewUK UNIQUE);
生成多列的主索引,兩條記錄的Field1和Field2不能全部相同,也不能為空值
CREATE TABLE NewTable(Field1 INTEGER, Field2 CURRENCY, CONSTRAINT NewPK PRIMARY KEY(Field1, Field2));
生成多列的UNIQUE索引,兩條記錄的Field1和Field2不能全部相同注意,假如兩條記錄其中一個欄位相同而另一個欄位都是空值,那也算兩個欄位不同
CREATE TABLE NewTable(Field1 INTEGER, Field2 CURRENCY, CONSTRAINT NewUK UNIQUE(Field1, Field2));
要在幾個不同的表之間建立聯系,就要使用FOREIGN KEY REFERENCES子句,他能夠限定某個表的欄位內容必須存在於另外一個表中。
第一個例子:
首先,生成主關鍵欄位為Field1的表NewTable1
CREATE TABLE NewTable1(Field1 INTEGER CONSTRAINT NewPK PRIMARY KEY);
然後,再生成外部索引,兩個表的Field1必須類型相同,並且第一個表的Field1是主關鍵欄位或UNIQUE欄位。生成外部索引後,表NewTable2要增加記錄,他的Field1欄位值必須已存在於表NewTable1的Field1欄位中。
下面兩條語句作用相同,因為Field1是NewTable1的主關鍵欄位,能夠省略不寫
CREATE TABLE NewTable2(Field1 INTEGER CONSTRAINT NewFK REFERENCES NewTable1);
CREATE TABLE NewTable2(Field1 INTEGER CONSTRAINT NewFK REFERENCES NewTable1(Field1));
第二個例子:
首先,生成主關鍵欄位為Field1和Field2的表NewTable1
CREATE TABLE NewTable1(Field1 INTEGER, Field2 TEXT(20), CONSTRAINT NewPK PRIMARY KEY(Field1, Field2));
然後,生成多列外部索引
CREATE TABLE NewTable2(Field1 INTEGER, Field2 TEXT(20), CONSTRAINT NewFK FOREIGN KEY(Field1, Field2) REFERENCES NewTable1(Field1, Field2));
ALTER TABLE語句:
在表生成之後,假如想修改表的結構,就使用這條語句,他能增加或刪除欄位連同約束關系。
給表NewTable增加日期型欄位Field3,語句執行前表NewTalbe必須沒有欄位Field3
ALTER TABLE NewTable ADD COLUMN Field3 DATE;
刪除表NewTable中的欄位Field3,語句執行前欄位Field3必須存在表NewTable中
ALTER TABLE NewTable DROP COLUMN Field3;
給表NewTable增加NewUK約束關系
ALTER TABLE NewTable ADD CONSTRAINT NewUK UNIQUE(Field1,Field2);
刪除表NewTable的NewUK約束關系
ALTER TABLE NewTable DROP CONSTRAINT NewUK;
DROP TABLE語句:
刪除表NewTable,語句執行前表NewTable必須存在
DROP TABLE NewTable;
④ 學資料庫的難點在那裡呢
資料庫有很多種,如ACCESS、SQL等,首先先弄清楚你要達到什麼要求,然後開始學習,簡單的先學習ACCESS,弄清,資料庫里包含的表,弄清楚每個表的欄位,還要弄清楚SQL語言,學會用資料庫進行查詢、統計等功能。總而言之,先易後難,相信你很快能掌握一些常用資料庫的。
⑤ 學sql server是不是要先學sql語言難不難學有啥要求嗎
不算難,主要是弄清楚存儲過程,許可權,索引,這些稍微難點,其他就相對比較簡單,T-SQL語句之類的都比較簡單