當前位置:首頁 » 編程語言 » existsqlserver
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

existsqlserver

發布時間: 2022-07-18 06:14:53

『壹』 sql server 語句中的if exists問題

syscolumns 所有欄位
sysobjects 所有表,View。。。。

你關聯查詢這兩個表就可以判斷你的Table存不存在Apply欄位

『貳』 sqlserver的系統表

1、查看錶和試圖

SELECT * FROM sys.objects WHERE object_id = object_id('表名或視圖名')
在sqlserver中一般可通過查詢sys.objects系統表來得知結果,不過可以有更方便的方法
如下:
if object_id('tb_table') is not null
print 'exist'
else
print'not exist'
如上,可用object_id()來快速達到相同的目的,tb_table就是我將要創建的資源的名稱,所以要先判斷當前資料庫中不存在相同的資源
object_id()可接受兩個參數,第一個如上所示,代表資源的名稱,上面的就是表的名字,但往往我們要說明我們所要創建的是什麼類型的資源,
這樣sql可以明確地在一種類型的資源中查找是否有重復的名字,如下:
if object_id('tb_table','u') is not null
print 'exist'
else
print'not exist'

第二個參數 "u" 就表示tb_table是用戶創建的表,即:USER_TABLE地首字母簡寫
查詢sys.objects中可得到各種資源的類型名稱(TYPE列),這里之舉幾個主要的例子
u ----------- 用戶創建的表,區別於系統表(USER_TABLE)
s ----------- 系統表(SYSTEM_TABLE)
v ----------- 視圖(VIEW)
p ----------- 存儲過程(SQL_STORED_PROCEDURE)
2、查看錶的列名

select * from syscolumns where id=object_id('表名') and name='列名'

3、查看資料庫

select * from sys.databases where name = 'student'

4、查看備份設備

"select * from sys.backup_devices where name ='backupdb'

(添加備份設備:exec sp_admpdevice 'disk','backupdb','d:\\backup\\backupdb.bak')

5、查看數據文件

select name, physical_name dbfile from sys.master_files where database_id=db_id('student')
master資料庫中sysdatabases表(是sqlserver中所有的資料庫的庫名) :
如果你要查詢的是所有資料庫(用戶/系統):
select * from master..sysdatabases
如果你要查詢的是用戶資料庫,則使用:
select * from master..sysdatabases where dbid > 4
如果你要查詢的是系統資料庫,只需要把where字句改為dbid < 4即可。

6、查看執行的sql語句

SELECT cacheobjtype,objtype,usecounts,sql
from sys.syscacheobjects where sql not like'%cach%' and sql not like '%sys.%'

2.對應資料庫中sysobjects表(反應的是相應資料庫中所有的對象):
這個表的用處是最大的,因為它裡面存放的有:表(系統/用戶)、存儲過程(系統/用戶)、視圖、主鍵、外鍵等。
這里就不一一說明了。
比如你sqlserver中有個資料庫名叫 test,如果要查詢該資料庫中的所有表對象:
select * from test..sysobjects where type = 』u』 or type = 』s』
這里的type = 』u』是表示用戶表對象,type = 』s』是系統表對象,怎樣單獨查詢用戶表對象或者系統表對象就不用說了吧。
如果你要查詢的是存儲過程當然也分了系統和用戶了:
這個是查詢資料庫中所有存儲過程
select * from test..sysobjects where type = 』p』
如果你要查詢的是用戶存儲過程則加上 and category <> 2 即可。
查詢系統存儲過程就不用說了吧(category = 2 誰不知道。。。)
查詢視圖與查詢存儲過程一樣,比如:
你查詢的是資料庫中所有視圖
select * from test..sysobjects where type = 』v』
如果你要查詢的是用戶視圖則加上 and category <> 2 即可。
其他的就不說了,就把 它們的type給大家說下:
type = 』 pk』 表示主鍵。
type = 』 d』 外鍵引用。
type = 』uq』 唯一索引。

下面附錄一些常用系統表

名稱 地址 說明
sysaltfiles 主資料庫 保存資料庫的文件
syscharsets 主資料庫 字元集與排序順序
sysconfigures 主資料庫 配置選項
syscurconfigs 主資料庫 當前配置選項
sysdatabases 主資料庫 伺服器中的資料庫
syslanguages 主資料庫 語言
syslogins 主資料庫 登陸帳號信息
sysoledbusers 主資料庫 鏈接伺服器登陸信息
sysprocesses 主資料庫 進程
sysremotelogins主資料庫 遠程登錄帳號

syscolumns 每個資料庫 列
sysconstrains 每個資料庫 限制
sysfilegroups 每個資料庫 文件組
sysfiles 每個資料庫 文件
sysforeignkeys 每個資料庫 外部關鍵字
sysindexs 每個資料庫 索引
sysmenbers 每個資料庫 角色成員
sysobjects 每個資料庫 所有資料庫對象
syspermissions 每個資料庫 許可權
systypes 每個資料庫 用戶定義數據類型
sysusers 每個資料庫 用戶

『叄』 求sql server2008 xml類型查詢條件怎麼寫

/*
sql xml 入門:
--by jinjazz
--http://blog.csdn.net/jinjazz

1、xml: 能認識元素、屬性和值

2、xpath: 定址語言,類似windows目錄的查找(沒用過dir命令的話就去面壁)

語法格式,這些語法可以組合為條件:
"."表示自己,".."表示父親,"/"表示兒子,"//"表示後代,
"name"表示按名字查找,"@name"表示按屬性查找

"集合[條件]" 表示根據條件取集合的子集,條件可以是
數 值:數字,last(),last()-數字 等
布爾值:position()<數字,@name='條件',name='條件'
條件是布爾值的時候可以合並計算:and or

3、xquery: 基於xpath標的准查詢語言,sqlserver xquery包含如下函數
exist(xpath條件):返回布爾值表示節點是否存在
query(xpath條件):返回由符合條件的節點組成的新的xml文檔
value(xpath條件,數據類型):返回指定的標量值,xpath條件結果必須唯一
nodes(xpath條件): 返回由符合條件的節點組成的一行一列的結果表
*/

『肆』 急求,在oracle中有沒有像sqlserver 中的 if exists()用法的函數,下面是我的sqlserver 中的語句

oracle 中 是 有的。

參考語法如下:

SELECT 1 FROM DUAL WHERE EXISTS (SELECT 1 FROM DUAL WHERE 1 = 1);

『伍』 SqlServer中in和exists的區別效率問題

in和exists
in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。

如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
not in 和not exists如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。

in 與 =的區別
select name from student where name in ('zhang','wang','li','zhao');與
select name from student where name='zhang' or name='li' or
name='wang' or name='zhao'
的結果是相同的。

『陸』 sqlserver的exists()問題,下面兩句是等價為什麼,重要的是分析下第一個語句的執行過程。

exists()就是去判斷後面的查詢是否能查詢出來數據,是否存在數據,select 1就是表示如果存在數據就顯示1,這樣不顯示欄位,是為了提高速度。
而in,是先執行in裡面的語句,外面的語句再把裡面的數據作為基礎進行比較,所以exsits比in的效率高。

『柒』 SQLSERVER語句 in和exists哪個效率高本人測試證明

例如下面兩個SQL語句

1 SELECT OrderNo, SiteCode, AreaCode
2 FROM SchelingProgram
3 WHERE AreaCode IN ( 'P', 'M' ) AND SiteCode IN ( SELECT SiteCode
4 FROM EnvBasicInfo
5 WHERE cityiD = 31 ) AND OrderNo NOT IN (
6 SELECT OrderNo
7 FROM KK_DeliveryinfoTmp )

上面SQL語句IN裡面有IN和NOT IN

1 SELECT OrderNo, SiteCode, AreaCode
2 FROM SchelingProgram
3 WHERE ( AreaCode IN ( 'P', 'M' ) AND SiteCode IN ( SELECT SiteCode
4 FROM EnvBasicInfo
5 WHERE cityiD = 31 )
6 ) AND NOT EXISTS ( SELECT OrderNo
7 FROM KK_DeliveryinfoTmp
8 WHERE KK_DeliveryinfoTmp.OrderNo = SchelingProgram.OrderNo )

上面的SQL語句IN裡面又有NOT EXISTS

這樣的情況很難測試同等條件下IN語句和EXISTS語句的效率

還有一個非SARG運算符

在《SQLSERVER企業級平台管理實踐》的第424頁里提到:

SQLSERVER對篩選條件(search argument/SARG)的寫法有一定的建議

對於不使用SARG運算符的表達式,索引是沒有用的,SQLSERVER對它們很難使用比較優化的做法。非SARG運算符包括

NOT、<>、NOT EXISTS、NOT IN、NOT LIKE和內部函數,例如:Convert、Upper等

所以當您的表中有索引並且SQL語句包含非SARG運算符,那麼當測試SQL語句的執行時間的時候肯定相差很大,

因為有些SQL語句走索引,有些SQL語句不走索引

建表腳本

注意:兩個表中都有索引!!

CT_FuelingData表

1 USE [GPOSDB]
2 GO
3 /****** 對象: Table [dbo].[CT_FuelingData] 腳本日期: 08/24/2013 11:00:34 ******/
4 SET ANSI_NULLS ON
5 GO
6 SET QUOTED_IDENTIFIER ON
7 GO
8 SET ANSI_PADDING ON
9 GO
10 CREATE TABLE [dbo].[CT_FuelingData](
11 [RecordNO] [int] IDENTITY(1,1) NOT NULL,
12 [I_FD_StationNo] [int] NOT NULL,
13 [VC_FD_No] [varchar](50) NOT NULL,
14 [VC_FD_Cardno] [varchar](50) NOT NULL,
15 [I_FD_CardStatus] [int] NULL,
16 [LI_FD_CTC] [bigint] NOT NULL,
17 [I_FD_TypeCode] [int] NULL,
18 [I_FD_PumpID] [int] NOT NULL,
19 [VC_FD_OilType] [varchar](50) NULL,
20 [DE_FD_Volume] [decimal](18, 2) NULL,
21 [DE_FD_Price] [decimal](18, 2) NULL,
22 [DE_FD_Amount] [decimal](18, 2) NULL,
23 [I_FD_Point] [decimal](10, 2) NULL,
24 [D_FD_DateTime] [datetime] NOT NULL,
25 [VC_FD_GroupNo] [varchar](50) NULL,
26 [D_FD_GroupDate] [datetime] NULL,
27 [DE_FD_CardAmount] [decimal](18, 2) NULL,
28 [DE_FD_VolumeTotals] [decimal](18, 2) NULL,
29 [DE_FD_AmountTotals] [decimal](18, 2) NULL,
30 [I_FD_ISSend] [int] NULL,
31 [VC_FD_CardMoneyauthFile] [varchar](50) NULL,
32 [D_Month] [datetime] NULL,
33 CONSTRAINT [PK_CT_FuelingData_1] PRIMARY KEY CLUSTERED
34 (
35 [VC_FD_No] ASC
36 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
37 ) ON [PRIMARY]
38
39 GO
40 SET ANSI_PADDING OFF

CT_InhouseCard表
1 USE [GPOSDB]
2 GO
3 /****** 對象: Table [dbo].[CT_InhouseCard] 腳本日期: 08/24/2013 10:59:58 ******/
4 SET ANSI_NULLS ON
5 GO
6 SET QUOTED_IDENTIFIER ON
7 GO
8 SET ANSI_PADDING ON
9 GO
10 CREATE TABLE [dbo].[CT_InhouseCard](
11 [RecordNO] [int] IDENTITY(1,1) NOT NULL,
12 [VC_IC_CardNO] [varchar](50) NOT NULL,
13 [VC_IC_PhysicalNO] [varchar](50) NULL,
14 [I_IC_CardType] [int] NULL,
15 [VC_IC_UserName] [varchar](50) NULL,
16 [VC_IC_JobNO] [varchar](50) NULL,
17 [VC_IC_UserID] [varchar](50) NULL,
18 [VC_IC_Password] [varchar](50) NULL,
19 [DE_IC_CardAmount] [decimal](18, 2) NULL,
20 [DE_IC_AppendAmount] [decimal](18, 2) NULL,
21 [DE_IC_ConsumerAmount] [decimal](18, 2) NULL,
22 [I_IC_ISLost] [int] NULL,
23 [D_IC_UsedDateTime] [datetime] NULL,
24 [D_IC_UselifeDateTime] [datetime] NULL,
25 [I_IC_IssueStationNO] [int] NULL,
26 [VC_IC_IssuerNO] [varchar](50) NULL,
27 [D_IC_IssueDateTime] [datetime] NULL,
28 [D_IC_LastUpdateDateTime] [datetime] NULL,
29 [I_IC_CardStatus] [int] NULL,
30 [VC_IC_Remark] [varchar](256) NULL,
31 CONSTRAINT [PK_CT_InhouseCard] PRIMARY KEY CLUSTERED
32 (
33 [VC_IC_CardNO] ASC
34 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
35 ) ON [PRIMARY]
36
37 GO
38 SET ANSI_PADDING OFF

『捌』 SQLServer多表聯查!

其實道理是相通的,你只要會二表查詢,你還怕五表嗎?
好多多表查詢的方法,只要你試過了,就發現它們並不是想像中的那麼難
多表查詢 :內聯接,外聯接,子查詢,單行查詢等等,其他查詢(exist查詢啊,case查詢啊)
其實並不多,這些就已經包含好多了,加油
相信你都會搞定的,努力哦

『玖』 sqlserver問題 exist的使用

select * from Table1 where Exists(select* from Table2 where Table1.姓名=Table2.姓名)