當前位置:首頁 » 編程語言 » sql兩個分類表示一樣
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql兩個分類表示一樣

發布時間: 2023-01-03 09:24:12

1. 用sql查詢兩個表中相同的數據

1、創建測試表;

create table test_col_1(id number, var varchar2(200));

create table test_col_2(id number, var varchar2(200));

2. sql查詢兩個表相同的數據

SQL語句如下:

SELECT * from TABLE1
full join TABLE2 on TABLE1.xingming = TABLE2.xingming
where
TABLE1.xingming is null or TABLE2.xingming is null

分析:

1、首先得出兩個表的並集

從結果中可以看出,表1中的趙二在表2中沒有相同xingming的記錄。

表2中的劉六在表1中沒有相同xingming的記錄。

本題還有其它多種解法,此處列出比較好理解的一種。

(2)sql兩個分類表示一樣擴展閱讀:

使用自聯接

即使表在資料庫中沒有自反關系,也可將它與自身聯接。 例如,可使用自聯接查找生活在同一城市的作者對。

與任何聯接一樣,自聯接至少需要兩個表。 不同之處在於,不是向查詢中添加第二個表,而是添加同一個表的第二個實例。 這樣,可將表的第一個實例中的列與第二個實例中的同一列相比較,這樣可相互比較列中的值。查詢和視圖設計器為表的第二個實例分配一個別名。

例如,如果要創建自聯接來查找居住在 Berkeley 內的所有作者對,可將表的第一個實例中的 city 列與第二個實例中的 city 列相比較。 所得到的查詢可能類似於:

SELECT
authors.au_fname, authors.au_lname, authors1.au_fname AS Expr2, authors1.au_lname AS Expr3

FROM authors INNER JOIN authors authors1 ON authors.city = authors1.city

WHERE
authors.city = 'Berkeley'

參考資料:

網路.full join

3. sql查詢兩個欄位相同的記錄

EXCEL中用VBA連接ACCESS資料庫
有如下一張表,要分別查找出所有同名的人、所有同名並且學號也一樣的人以及所有同名但不同學號的人。

查詢所有同名人員
select * from [18年考試成績] where [姓名] in (SELECT [姓名] FROM [18年考試成績] group by [姓名] having count(姓名)>1)
查詢結果:

查找所有姓名和學號兩個欄位都重復的人
select * from [18年考試成績] where [姓名] in (SELECT [姓名] FROM [18年考試成績] group by [姓名] having count(姓名)>1) and [學號] in (SELECT [學號] FROM [18年考試成績] group by [學號] having count(學號)>1)
查詢結果:

查找所有姓名重復但學號不重復的人
select * from [18年考試成績] where [姓名] in (SELECT [姓名] FROM [18年考試成績] group by [姓名] having count(姓名)>1) and [學號] not in (SELECT [學號] FROM [18年考試成績] group by [學號] having count(學號)>1)
注意:要把SELECT查詢子句配合in或not in 操作符使用,SELECT查詢子句只能有一列內容。
查詢結果:

其中子句 「SELECT [姓名] FROM [18年考試成績] group by [姓名] having count(姓名)>1」是顯示所有重復的姓名,如果如下:

如果要知道重復出現次數,則可以這樣寫:
SELECT [姓名],count(姓名) as 出現次數 FROM [18年考試成績] group by [姓名] having count(姓名)>1
結果如下:

查找唯一記錄
group by [姓名],意思是按姓名分組,having count(姓名)>1 是分組條件,意思是姓名次數出現2次以上的重復內容以姓名進行分組,前面的count(姓名)是對分組以後的姓名統計出現次數。在後面要使用函數條件時應該使用having,而不是使用where
查找唯一值,比如本例的班級中,只有一個「四班」,要把這個四班的所有欄位顯示出來可以這樣:
select * from [18年考試成績] where 班級 not in (SELECT 班級 FROM [18年考試成績] group by 班級 having count(班級)>1)
結果:

如果使用「SELECT DISTINCT 班級 FROM [18年考試成績]」語句查詢唯一值,結果將會如下:

DISTINCT 會顯示不重復的值,如果有重復的,只顯示第一個,所以如果需要顯示僅出現一次的值並不適合使用SELECT DISTINCT語句
分組查詢語句:
比如要班級為單位,查詢每個班的總人數,科目總分,科目平均分等
SELECT [班級],count(姓名) as 班級人數,sum(語文) as 語文總成績,sum(數學) as 數學總成績,ROUND(avg(語文),1) as 語文平均分,ROUND(avg(數學),1) as 數學平均分 FROM [18年考試成績] group by [班級]
查詢結果如下:

注意:如果使用函數的欄位,不使用AS指定別名,將會自動生成一個欄位名,第一列名字Expr1000,第二列名為Expr1001,第三列名為Expr1002,以此類推
如:
SELECT [班級],count(姓名),sum(語文),sum(數學),ROUND(avg(語文),1) ,ROUND(avg(數學),1) FROM [18年考試成績] group by [班級]
查詢結果如下:

如果不指定別名,你將無法清楚在查詢結果中知道每一列是干什麼的。
如果需要再細分,查詢每個班女生總人數和科目平均分,只需要再加一個where條件就可以了
SELECT [班級],count(姓名) as 班級女性人數,ROUND(avg(語文),1) as 語文平均分,ROUND(avg(數學),1) as 數學平均分 FROM [18年考試成績] where 性別='女' group by [班級]

4. sql查詢中怎麼將兩條內容相同的記錄顯示成一條

sql查詢中兩條內容相同的記錄顯示成一條可以用group by語句或distinct語句來實現。distinct支持單列、多列的去重方式。單列去重的方式簡明易懂,即相同值只保留1個。多列的去重則是根據指定的去重的列信息來進行,即只有所有指定的列信息都相同,才會被認為是重復的信息。

示例數據表中的數據:mysql>select*fromtalk_test;
+----+-------+--------+|id|name|mobile|
+----+-------+--------+|1|xiao9|555555|
|2|xiao6|666666|
|3|xiao9|888888|
|4|xiao9|555555||5|xiao6|777777|
+進行單列去重後的結果:mysql>selectdistinct(name)fromtalk_test;
+-------+|name|
+-------+|xiao9||xiao6|
+-------+2rowsinset(0.01sec)mysql>selectdistinct(mobile)fromtalk_test;
+--------+|mobile|
+--------+|555555|
|666666|
|888888||777777|
只會保留指定的列的信息進行多列去重後的結果:
mysql>selectdistinctname,mobilefromtalk_test;
+-------+--------+|name|mobile|
+-------+--------+|xiao9|555555|
|xiao6|666666|
|xiao9|888888||xiao6|777777|
+-------+--------+**只有所有指定的列信息都相同,才會被認定為重復的信息

group by使用的頻率相對較高,但正如其功能一樣,它的目的是用來進行聚合統計的,雖然也可能實現去重的功能,但這並不是它的長項。

5. SQL 每個分類顯示一個記錄

SELECT Pic.Cat_ID,Cat_Name,Pic_Url,Pic_Date
FROM [Pic]
INNER JOIN [Pic_Cat]
ON (Pic.Cat_ID = Pic_Cat.Cat_ID)
WHERE (Pic.Pic_ID IN (
SELECT MAX(Pic_ID)
FROM [Pic]
GROUP BY Pic_Cat
))
這只是一種用IN子查詢的思路,也可以用相關子查詢的方法。

6. SQL 語句合並查詢,兩張表欄位一樣

如果兩張表的各自查詢都只有一行結果。想把兩個查詢的結果合並到一行。可以直接使用自然連接:select
aa.*
,
bb.*
from
(select
*
from
a)
as
aa
,
(select
*
from
b)
as
bb
其中
(select
*
from
a)
和(select
*
from
b)是你的兩張表的查詢,結果各自只有一行。
如果說,你的意思是每張表查詢出來的結果都有多行。你需要這多行最後全部顯示為一行內容。可能你需要使用
select
*
from
a
for
xml
path('')
來將每個查詢的多行結果轉換為一行xml文本字元串。