SQL的過濾
① sql里過濾相同數據
如有表A(col1,col2,col3)
要過濾col1,col2,col3都相同的數據時可以用distinct
如select distinct col1,col2,col3 from A
如只要過濾col1,col2相同的數據,且取col3最大值時可以如下
select col1,col2,max(col3) as col3 from A group by col1,col2
② 資料庫筆記-SQL過濾(LIKE&正則表達式)
查詢語句:
結果:
查詢語句:
結果:
查詢語句:
結果:
查詢語句:
正則表達式 [32]1,[32]定義一組字元,它的意思是匹配 3 或匹配 2,也就是「31」或者 「21」都算是匹配的。
結果:
查詢語句:
結果:
如果要匹配特殊字元的,需要加上前導「」,「-」表示查找「-」,「.」表示查找「.」
這種就是 「轉義(escaping)」 ,在正則表達式里,本身有意義的字元,比如「.」是匹配任意字元的意思。那如果要匹配它,需要轉義。
注意:在 MySQL 里,是比其他的正則表達式多一個「」的,就是「」。
趣味提問:
如何匹配「」?
答案:「\」
\([0-9] sticks?\) 匹配的是(NUM stick)或者(NUM sticks)。s後的 ? 使得s可選。
重復元字元
* 是 0 個或多個匹配
? 是 1 個或多個匹配
{n} 是指定n個匹配
{n,} 是 不少於 n 個匹配
{n,m} 是 指定匹配的范圍,m不超過 255
查詢語句:
^值的是字元串的開始,$是字元串的結尾。
這就是 REGEXP 與 LIKE 類似,但是它獨特的好處:可以通過「定位符」只匹配「子字元串」。
結果:
③ 用SQL語句怎麼過濾重復數據
有一半是添加表的,因為我沒有你的結果集,所以拼了個表變數做為結果集
,重點在後半部分,處理邏輯是按你的想寫的,前提是如果我沒有理解錯的話
這個方法的結果集返回的是每一年的數據,年數遞增的,行數以有多少個城市為准,不過我感覺你要這樣的結果集沒有什麼意義
declare @tab table(name nvarchar(20), both int)
declare @tabtmp table(name nvarchar(20), both int)
declare @tabname table(name nvarchar(20))
declare @name nvarchar(20)
declare @both int
insert into @tab
select N'上海',1996
union
select N'上海',1997
union
select N'北京',1996
union
select N'北京', 1997
insert into @tabname
select distinct name from @tab
select top 1 @name=name from @tab order by name asc
select @both=MIN(both) from @tab
while(@name is not null)
begin
insert into @tabtmp
select @name,@both
update @tab set name='' where name=@name
set @name=null
select top 1 @name =name from @tab where name<>'' order by name asc
select top 1 @both=both from @tab where both>@both order by both asc
end
select * from @tabtmp
④ sql 如何過濾重復記錄
問題背景
在一個多表查詢的sql中正常情況下產生的數據都是唯一的,但因為資料庫中存在錯誤(某張表中存在相同的外鍵ID)導致我這邊查詢出來的數據就會有重復的問題
下面結果集中UserID:15834存在多個
參考:
MSDN: OVER 子句 (Transact-SQL)
stackoverflow sql query distinct with Row_Number
SQL Trick: row_number() is to SELECT what dense_rank() is to SELECT DISTINCT
⑤ sql 查詢語句中如何過濾指定的字元
1、語句:SELECT * FROM dbo.Procts WHERE prod_name='king doll' AND prod_price>8。
--檢索dbo.Procts表中所有列,過濾條件為由供應商king doll製造價格大於8的所有商品。
注意:--後面的字元是這條語句的注釋,這條語句有兩個條件,分別用AND關鍵字聯接在一起,並且過濾結果必須滿足這兩個條件,如果只滿足其中一個該數據不會被檢索出來。
2、OR操作符(或)
語句:SELECT * FROM dbo.Procts WHERE prod_name='king doll' OR prod_price>8。
--檢索dbo.Procts表中所有列,過濾條件為由供應商king doll製造價格大於8的所有商品值。
注意:--這里要說明的是OR操作符與AND操作符的不同之處是只要滿足其中一個條件,數值就會被檢索出來,例如:由供應商king doll製造價格小於8商品或者由供應商king add製造價格大於8的商品只要其中一個條件符合,數據就被檢索出來。
3、IN操作符(指定條件范圍)
語句:SELECT * FROM dbo.Procts WHERE prod_name IN ('king doll' ,'Queen dool')。
--檢索dbo.Procts表中所有列,過濾條件為由供應商king doll和Queen dool製造的商品。
注意:它的功能其實和OR一樣,但是它的執行速度會更快並且簡潔,最大的優點是可以包含其他SELECT語句,能夠更動態地建立WHERE字句。
⑥ 「如何使用」SQL過濾代碼
Public Function RepBadChar(strChar)
If strChar="" Then
RepBadChar=""
Else
RepBadChar=Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(strChar,"'",""),"?",""),"(","("),")",")"),"<",""),".","."),">","")," ","")
End if
End function
dim id
id =request.QueryString("id")
if len(RepBadChar(id))<>len(request.QueryString("id")) then
response.write"<script>alert(""id參數里含有非法字元"");location.href=""../index.asp"";</script>"
response.end
end if
⑦ sql過濾問題
要是只過濾 id=61的
就是
select * from 表 where id!=『61『
但要是過濾 flag 不等於 null 的就是
select * from 表 where flag!=null 了
⑧ sql語句查詢過濾重復數據
1、查找表中多餘的重復記錄,重復記錄是根據單個欄位(peopleId)來判斷
復制代碼代碼如下:
select * from people
where peopleId in (select peopleId from people group by peopleId having count
(peopleId) > 1)
2、刪除表中多餘的重復記錄,重復記錄是根據單個欄位(peopleId)來判斷,只留有rowid最小的記錄
復制代碼代碼如下:
delete from people
where peopleId in (select peopleId from people group by peopleId having count
(peopleId) > 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId
)>1)
⑨ sql 如何過濾相同數據
樓主用distinct肯定達不到所需效果。
可以用group by 分組,不過因為其他欄位有重復值,只能讓其他欄位取一個值了
sql="select test1,max(test2) as test2,max(test3) as test3,max(test4) as test4 from table1 group by test1"