A. sql語句講解
select 欄位 from 表 where 條件
//這就是基本的查詢語句,根據where條件,從指定表中,查詢出指定的欄位值的集合,比如select userName from user where ID=1,就是從user表中找出ID是1的用戶名字
獲取欄位集合
如:select a.Song_Name,B.Art_Name,a.Create_date
from Songset a
left join on artset b on a.art_code=b.artcode
//這個是一個連表查詢,關鍵詞是left join,你可以去查下它的相關信息。
//把Songet視為a表,把artset視為b表,select出a表的Song Name、b表的Art_Name、a表的Create_date,條件是a表的artcode=b表的artcode
B. SQL多表連接查詢實例分析(詳細圖文)
新建兩張表:
表1:student
截圖如下:
表2:course
截圖如下:
(此時這樣建表只是為了演示連接SQL語句,當然實際開發中我們不會這樣建表,實際開發中這兩個表會有自己不同的主鍵。)
一、外連接
外連接可分為:左連接、右連接、完全外連接。
1、左連接
left
join
或
left
outer
join
SQL語句:select
*
from
student
left
join
course
on
student.ID=course.ID
執行結果:
左外連接包含left
join左表所有行,如果左表中某行在右表沒有匹配,則結果中對應行右表的部分全部為空(NULL).
註:此時我們不能說結果的行數等於左表數據的行數。當然此處查詢結果的行數等於左表數據的行數,因為左右兩表此時為一對一關系。
2、右連接
right
join
或
right
outer
join
SQL語句:select
*
from
student
right
join
course
on
student.ID=course.ID
執行結果:
右外連接包含right
join右表所有行,如果左表中某行在右表沒有匹配,則結果中對應左表的部分全部為空(NULL)。
註:同樣此時我們不能說結果的行數等於右表的行數。當然此處查詢結果的行數等於左表數據的行數,因為左右兩表此時為一對一關系。
3、完全外連接
full
join
或
full
outer
join
SQL語句:select
*
from
student
full
join
course
on
student.ID=course.ID
執行結果:
完全外連接包含full
join左右兩表中所有的行,如果右表中某行在左表中沒有匹配,則結果中對應行右表的部分全部為空(NULL),如果左表中某行在右表中沒有匹配,則結果中對應行左表的部分全部為空(NULL)。
二、內連接
join 或
inner
join
SQL語句:select
*
from
student
inner
join
course
on
student.ID=course.ID
執行結果:
inner
join
是比較運算符,只返回符合條件的行。
此時相當於:select
*
from
student,course
where
student.ID=course.ID
三、交叉連接
cross
join
1.概念:沒有
WHERE
子句的交叉聯接將產生連接所涉及的表的笛卡爾積。第一個表的行數乘以第二個表的行數等於笛卡爾積結果集的大小。
SQL語句:select
*
from
student
cross
join
course
執行結果:
如果我們在此時給這條SQL加上WHERE子句的時候比如SQL:select
*
from
student
cross
join
course
where
student.ID=course.ID
此時將返回符合條件的結果集,結果和inner
join所示執行結果一樣。
四、兩表關系為一對多,多對一或多對多時的連接語句
當然上面兩表為一對一關系,那麼如果表A和表B為一對多、多對一或多對多的時候,我們又該如何寫連接SQL語句呢?
其實兩表一對多的SQL語句和一對一的SQL語句的寫法都差不多,只是查詢的結果不一樣,當然兩表也要略有改動。
比如表1的列可以改為:
Sno
Name
Cno
表2的列可以改為:
Cno
CName
這樣兩表就可以寫一對多和多對一的SQL語句了,寫法和上面的一對一SQL語句一樣。
下面介紹一下當兩表為多對多的時候我們該如何建表以及些SQL語句。
新建三表:
表A:
student
截圖如下:
表B:
course
截圖如下:
表C:
student_course
截圖如下:
一個學生可以選擇多門課程,一門課程可以被多個學生選擇,因此學生表student和課程表course之間是多對多的關系。
當兩表為多對多關系的時候,我們需要建立一個中間表student_course,中間表至少要有兩表的主鍵,當然還可以有別的內容。
SQL語句:select
s.Name,C.Cname
from
student_course
as
sc
left
join
student
as
s
on
s.Sno=sc.Sno
left
join
course
as
c
on
c.Cno=sc.Cno
執行結果:
此條SQL執行的結果是學生選課的情況。
C. 工作中碰到一條sql語句不是明白,求詳細講解下。
很普通的一個SQL,兩個表連接的方式使用的是標準的SQL語法,可能你沒看懂,和下面的SQL效果是一樣的,最後一個字元串連接肯定是要動態替換的變數
"selectf.*
fromDRAWING_QUESTIONq,
oyb_FILE_DATAf
wheref.BIZ_ID=q.CSM_DRAWING_QUESTION_ID
andf.APP_VERSION=1
andq.BATCH_ID="+options.batchId+"";
D. SQL語句講解
DECLARE @dtDate DATETIME //定義日期型的局部變數
SET @dtDate = DateAdd(dd, -50 , GetDate() ) //對剛定義好的局部變數賦值。
1. 當前系統日期、時間
select getdate()
2. dateadd 在向指定日期加上一段時間的基礎上,返回新的 datetime 值
例如:向日期加上2天
select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.000
3. datediff 返回跨兩個指定日期的日期和時間邊界數。
select datediff(day,'2004-09-01','2004-09-18') --返回:17
4. datepart 返回代表指定日期的指定日期部分的整數。
SELECT DATEPART(month, '2004-10-15') --返回 10
5. datename 返回代表指定日期的指定日期部分的字元串
SELECT datename(weekday, '2004-10-15') --返回:星期五
6. day(), month(),year() --可以與datepart對照一下
E. sql語句 問題如圖 求講解
一種方式是用自定義函數,像xtwwz寫的那樣。但有個缺點,就是數據量大的時候速度比較慢。
另一個思路是使用forxmlpath,僅適用於SQLserver2005及以上版本。
--測試數據
with
t1(code)as(
select'1'unionall
select'1,2'unionall
select'1,2,3'unionall
select'4'),
t2(code,name)as(
select'1','A'unionall
select'2','B'unionall
select'3','C'unionall
select'4','D')
--用charindex和forxmlpath實現批量替換的功能
selectstuff((
select','+t2.namefromt2
wherecharindex(','+t2.code+',',','+t1.code+',')>0
orderbyt2.code
forxmlpath('')
),1,1,'')namefromt1
結果如下:
F. SQL語句到底是怎麼執行的
下面先給出上面的SQL語句的執行順序,然後進行講解:
(8)select
(9)distinct
(11)top 1
(6) Table1.id,COUNT(Table1.name) as nameCount
(1)from Table1
(3)inner join Table2
(2)on Table1.id=Table2.id
(4)where Table1.id<4
(5)group by Table1.id
(7)having Table1.id<3
(10)order by Table1.id desc
紅色序號給出了執行的順序:
(1)from:對Table1和Table2執行笛卡爾積,也就是兩個表的行的各種組合,共5*5=25行,生成虛擬表VT1
(2)on:選擇VT1中的那些Table1.id=Table2.id的所有行,生成虛擬表VT2。
(3)inner join:這里是內部連接,直接就是VT2,如果是outer join,如left join、right join、full join,那麼還需要按照外部連接的規則,把VT1中沒有匹配的行添加到VT2,生成VT3.
(4)where:選出VT3中Table1.id<4的表格,給虛擬表VT4.
(5)group by:按照Table1.id進行分組。
(6)COUNT:執行聚合函數,選出對應Table1.id的行數,生成的結果給虛擬表VT5
(7)having:選擇VT5中Table1.id<3的所有結果,給虛擬表VT6
(8)select:選擇VT6中相應的列,給虛擬表VT7
(9)distinct:將VT7中重復的行去除,生成VT8
(10)order by:將VT8的結果按照Table1.id進行排序,這里沒有生成一個新的表VT9,而是生成游標VC9。
(11)top:從游標VC9的開始處選擇指定的行數,這里是1行,生成虛擬表VT10.
經過上面的過程,最終的SQL語句將VT10返回給用戶使用。
所以以後再寫SQL語句的時候,可以按照上面的順序寫SQL語句了,讀SQL語句也可以按照上面的順序去讀,做到心裡明白。
G. 解釋SQL語句功能 越詳細越好
就是創建一個新的資料庫,自己看看幫助很簡單的!
語法
CREATE DATABASE database_name
[ ON
[ < filespec > [ ,...n ] ]
[ , < filegroup > [ ,...n ] ]
]
[ LOG ON { < filespec > [ ,...n ] } ]
[ COLLATE collation_name ]
[ FOR LOAD | FOR ATTACH ]
< filespec > ::=
[ PRIMARY ]
( [ NAME = logical_file_name , ]
FILENAME = 'os_file_name'
[ , SIZE = size ]
[ , MAXSIZE = { max_size | UNLIMITED } ]
[ , FILEGROWTH = growth_increment ] ) [ ,...n ]
< filegroup > ::=
FILEGROUP filegroup_name < filespec > [ ,...n ]
參數
database_name
新資料庫的名稱。資料庫名稱在伺服器中必須唯一,並且符合標識符的規則。database_name 最多可以包含 128 個字元,除非沒有為日誌指定邏輯名。如果沒有指定日誌文件的邏輯名,則 Microsoft® SQL Server™ 會通過向 database_name 追加後綴來生成邏輯名。該操作要求 database_name 在 123 個字元之內,以便生成的日誌文件邏輯名少於 128 個字元。
ON
指定顯式定義用來存儲資料庫數據部分的磁碟文件(數據文件)。當後跟以逗號分隔的用以定義主文件組的數據文件的 <filespec> 項列表時,該關鍵字是必需的。主文件組的文件列表後可跟以逗號分隔的 <filegroup> 項列表(可選),<filegroup> 項用以定義用戶文件組及其文件。
n
佔位符,表示可以為新資料庫指定多個文件。
LOG ON
指定顯式定義用來存儲資料庫日誌的磁碟文件(日誌文件)。該關鍵字後跟以逗號分隔的用以定義日誌文件的 <filespec> 項列表。如果沒有指定 LOG ON,則會自動創建一個日誌文件,其名稱由系統生成,大小為下列兩個值中的較大者:0.5 MB 和資料庫中所有數據文件大小總和的 25%。
FOR LOAD
支持該子句是為了與早期版本的 Microsoft SQL Server 兼容。資料庫在打開 dbo use only 資料庫選項的情況下創建,並且將其狀態設置為正在裝載。SQL Server 7.0 版中不需要該子句,因為 RESTORE 語句可以作為還原操作的一部分重新創建資料庫。
FOR ATTACH
指定從現有的一組操作系統文件中附加資料庫。必須有指定第一個主文件的 <filespec> 條目。至於其它 <filespec> 條目,只需要與第一次創建資料庫或上一次附加資料庫時路徑不同的文件的那些條目。必須為這些文件指定 <filespec> 條目。附加的資料庫必須使用與 SQL Server 相同的代碼頁和排序次序創建。應使用 sp_attach_db 系統存儲過程,而不要直接使用 CREATE DATABASE FOR ATTACH。只有必須指定 16 個以上的 <filespec> 項目時,才需要使用 CREATE DATABASE FOR ATTACH。
如果將資料庫附加到的伺服器不是該資料庫從中分離的伺服器,並且啟用了分離的資料庫以進行復制,則應該運行 sp_removedbreplication 從資料庫刪除復制。
collation_name
指定資料庫的默認排序規則。排序規則名稱既可以是 Windows 排序規則名稱,也可以是 SQL 排序規則名稱。如果沒有指定排序規則,則將 SQL Server 實例的默認排序規則指派為資料庫的排序規則。
有關 Windows 和 SQL 排序規則名稱的更多信息,請參見 COLLATE。
PRIMARY
指定關聯的 <filespec> 列表定義主文件。主文件組包含所有資料庫系統表。還包含所有未指派給用戶文件組的對象。主文件組的第一個 <filespec> 條目成為主文件,該文件包含資料庫的邏輯起點及其系統表。一個資料庫只能有一個主文件。如果沒有指定 PRIMARY,那麼 CREATE DATABASE 語句中列出的第一個文件將成為主文件。
NAME
為由 <filespec> 定義的文件指定邏輯名稱。如果指定了 FOR ATTACH,則不需要指定 NAME 參數。
logical_file_name
用來在創建資料庫後執行的 Transact-SQL 語句中引用文件的名稱。logical_file_name 在資料庫中必須唯一,並且符合標識符的規則。該名稱可以是字元或 Unicode 常量,也可以是常規標識符或定界標識符。
FILENAME
為 <filespec> 定義的文件指定操作系統文件名。
'os_file_name'
操作系統創建 <filespec> 定義的物理文件時使用的路徑名和文件名。os_file_name 中的路徑必須指定 SQL Server 實例上的目錄。os_file_name 不能指定壓縮文件系統中的目錄。
如果文件在原始分區上創建,則 os_file_name 必須只指定現有原始分區的驅動器字母。每個原始分區上只能創建一個文件。原始分區上的文件不會自動增長;因此,os_file_name 指定原始分區時,不需要指定 MAXSIZE 和 FILEGROWTH 參數。
SIZE
指定 <filespec> 中定義的文件的大小。如果主文件的 <filespec> 中沒有提供 SIZE 參數,那麼 SQL Server 將使用 model 資料庫中的主文件大小。如果次要文件或日誌文件的 <filespec> 中沒有指定 SIZE 參數,則 SQL Server 將使文件大小為 1 MB。
size
<filespec> 中定義的文件的初始大小。可以使用千位元組 (KB)、兆位元組 (MB)、千兆位元組 (GB) 或兆兆位元組 (TB) 後綴。默認值為 MB。指定一個整數,不要包含小數位。size 的最小值為 512 KB。如果沒有指定 size,則默認值為 1 MB。為主文件指定的大小至少應與 model 資料庫的主文件大小相同。
MAXSIZE
指定 <filespec> 中定義的文件可以增長到的最大大小。
max_size
<filespec> 中定義的文件可以增長到的最大大小。可以使用千位元組 (KB)、兆位元組 (MB)、千兆位元組 (GB) 或兆兆位元組 (TB) 後綴。默認值為 MB。指定一個整數,不要包含小數位。如果沒有指定 max_size,那麼文件將增長到磁碟變滿為止。
說明 在磁碟即將變滿時,Microsoft Windows NT® S/B 系統日誌會警告 SQL Server 系統管理員。
UNLIMITED
指定 <filespec> 中定義的文件將增長到磁碟變滿為止。
FILEGROWTH
指定 <filespec> 中定義的文件的增長增量。文件的 FILEGROWTH 設置不能超過 MAXSIZE 設置。
growth_increment
每次需要新的空間時為文件添加的空間大小。指定一個整數,不要包含小數位。0 值表示不增長。該值可以 MB、KB、GB、TB 或百分比 (%) 為單位指定。如果未在數量後面指定 MB、KB 或 %,則默認值為 MB。如果指定 %,則增量大小為發生增長時文件大小的指定百分比。如果沒有指定 FILEGROWTH,則默認值為 10%,最小值為 64 KB。指定的大小舍入為最接近的 64 KB 的倍數。
注釋
使用一條 CREATE DATABASE 語句即可創建資料庫以及存儲該資料庫的文件。SQL Server 分兩步實現 CREATE DATABASE 語句:
SQL Server 使用 model 資料庫的復本初始化資料庫及其元數據。
然後,SQL Server 使用空頁填充資料庫的剩餘部分,除了包含記錄資料庫中空間使用情況以外的內部數據頁。
因此,model 資料庫中任何用戶定義對象均復制到所有新創建的資料庫中。可以向 model 資料庫中添加任何對象,例如表、視圖、存儲過程、數據類型等,以將這些對象添加到所有資料庫中。
每個新資料庫都從 model 資料庫繼承資料庫選項設置(除非指定了 FOR ATTACH)。例如,在 model 和任何創建的新資料庫中,資料庫選項 select into/bulk 都設置為 OFF。如果使用 ALTER DATABASE 更改 model 資料庫的選項,則這些選項設置會在創建的新資料庫中生效。如果在 CREATE DATABASE 語句中指定了 FOR ATTACH,則新資料庫將繼承原始資料庫的資料庫選項設置。
一台伺服器上最多可以指定 32,767 個資料庫。
有三種類型的文件用來存儲資料庫:
主文件包含資料庫的啟動信息。主文件還可以用來存儲數據。每個資料庫都包含一個主文件。
次要文件保存所有主要數據文件中容納不下的數據。如果主文件大到足以容納資料庫中的所有數據,就不需要有次要數據文件。而另一些資料庫可能非常大,需要多個次要數據文件,也可能使用多個獨立磁碟驅動器上的次要文件,以將數據分布在多個磁碟上。
事務日誌文件保存用來恢復資料庫的日誌信息。每個資料庫必須至少有一個事務日誌文件(盡管可以有多個)。事務日誌文件最小為 512 KB。
每個資料庫至少有兩個文件,一個主文件和一個事務日誌文件。
盡管 'os_file_name' 可以是任何有效的操作系統文件名,但如果使用以下建議的擴展名,則可以更加清楚地反映文件的用途。
文件類型 文件擴展名
主要數據文件 .mdf
次要數據文件 .ndf
事務日誌文件 .ldf