SQL中的XML,XPath,XQuery查詢方法

2021-05-25 04:39:30 字數 4589 閱讀 7807

/*

sql xml 入門:

--by 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條件): 返回由符合條件的節點組成的一行一列的結果表

*/declare

@data

xmlset

@data='

everyday italian

giada de laurentiis

2005

30.00

harry potter

j k. rowling

2005

29.99

xquery kick start

james mcgovern

per bothner

kurt cagle

james linn

vaidyanathan nagarajan

2003

49.99

learning xml

erik t. ray

2003

39.95'--

測試語句,如果不理解語法請參考上面的xpath規則和xquery函式說明

--1、文件

select

@data

--2、任意級別是否存在price節點

select

@data

.exist(

'//price')

--3、獲取所有book節點

select

@data

.query(

'//book')

--4、獲取所有包含lang屬性的節點

select

@data

.query(

'//*[@lang]')

--5、獲取第乙個book節點

select

@data

.query(

'//book[1]')

--6、獲取前兩個book節點

select

@data

.query(

'//book[position()<=2]')

--7、獲取最後乙個book節點

select

@data

.query(

'//book[last()]')

--8、獲取price>35的所有book節點

select

@data

.query(

'//book[price>35]')

--9、獲取category="web"的所有book節點

select

@data

.query(

'//book[@category="web"]')

--10、獲取title的lang="en"的所有book節點

select

@data

.query(

'//book/title[@lang="en"]')

--11、獲取title的lang="en"且 price>35的所有book節點

select

@data

.query(

'//book[./title[@lang="en"] or price>35 ]')

--12、獲取title的lang="en"且 price>35的第一book的(第乙個)title

select

@data

.query(

'//book[./title[@lang="en"] and price>35 ]

').value(

'(book/title)[1]',

'varchar(max)')

--13、等價於12

select

@data

.value(

'(//book[./title[@lang="en"] and price>35 ]/title)[1]',

'varchar(max)')

--14、獲取title的lang="en"且 price>35的第一book的(第乙個)title的lang屬性

select

@data

.value(

'((//book[@category="web" and price>35 ]/title)[1]/@lang)[1]',

'varchar(max)')

--15、獲取第一本書的title

select

tab.col.value(

'(book/title)[1]',

'varchar(max)')

astitle

from

@data

.nodes(

'bookstore')

astab(col)

--16、獲取每本書的第乙個author

select

tab.col.value(

'author[1]',

'varchar(max)')

astitle

from

@data

.nodes(

'//book')

astab(col)

--17、獲取所有book的所有資訊

select

t.c.value(

'title[1]',

'varchar(max)')

astitle,

t.c.value(

'year[1]',

'int')

asyear

,t.c.value(

'title[1]',

'varchar(max)')

astitle,

t.c.value(

'price[1]',

'float')

asprice,

t.c.value(

'author[1]',

'varchar(max)')

asauthor1,

t.c.value(

'author[2]',

'varchar(max)')

asauthor2,

t.c.value(

'author[3]',

'varchar(max)')

asauthor3,

t.c.value(

'author[4]',

'varchar(max)')

asauthor4

from

@data

.nodes(

'//book')

ast(c)

--18、獲取不是日語(lang!="jp")且**大於35的書的所有資訊

select

t.c.value(

'title[1]',

'varchar(max)')

astitle,

t.c.value(

'year[1]',

'int')

asyear

,t.c.value(

'title[1]',

'varchar(max)')

astitle,

t.c.value(

'price[1]',

'float')

asprice,

t.c.value(

'author[1]',

'varchar(max)')

asauthor1,

t.c.value(

'author[2]',

'varchar(max)')

asauthor2,

t.c.value(

'author[3]',

'varchar(max)')

asauthor3,

t.c.value(

'author[4]',

'varchar(max)')

asauthor4

from

@data

.nodes(

'//book[./title[@lang!="jp"] and price>35 ]')

ast(c)

SQL中的作業

這幾天,一直都在做有關於 使用者的管,原本同事不想對使用者的資料進行物理刪除,但是有關聯的表有三張,查詢出來的時候會出現記錄重複的現向,所以只能對附表進行物理刪除,對主表中的資料進行暫時性的保留,但時間長了對資料的冗餘量那真是不太可觀,所以想辦法要對資料進行定期的清楚.在csdn中找到的方法,收到這...

SQL中的事務

sql中的事務 事務 begin transaction 開始事務 commit transaction 提交事務 rollboack transaction 回滾事務 set implicit ransaction on 隱式事務 update customer set nickname nick...

sql中的連線

一般基於 ansi 標準的 sql 列出了五種 join 方式 內連線 inner join 全外連線 full outer join full join 左外連線 left outer join left join 右外連線 right outer join right join 交叉連線 cro...