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

mysql差集sql

發布時間: 2023-07-22 12:30:38

⑴ 15個Mysql常用基本SQL語句

在學習SQL語句之前,首先需要區分幾個概念,我們常說的資料庫是指資料庫軟體,例如MySQL、Oracle、SQL Server等,而本文提到的資料庫是指資料庫軟體中的一個個用於存儲數據的容器。

在MySQL中,資料庫稱為database,數據表稱為table,一個資料庫軟體中有多個資料庫(databases),每個資料庫中又可以有多個數據表(tables),最終,數據是存儲在數據表中。

資料庫和數據表之間的關系可以用下面這個圖來表示,對於一個資料庫來說,有多個數據表。

在正式開始寫SQL語句之前,需要說明兩點。

這里通過MySQL Workbench來寫SQL代碼,在Workbench中,執行一條SQL語句的方式有兩種。

了解了這之後,接下來介紹一些常見的命令,分兩部分:資料庫常用命令和數據表常用命令。

1、查看有哪些資料庫

2、創建資料庫

創建一個名為Testdb的資料庫。

3、創建資料庫並指定編碼格式

有些時候,為了防止中文亂碼,創建資料庫的時候需要指定編碼格式。

4、使用某個資料庫

使用mydb這個資料庫,或者進入mydb這個資料庫。

5、刪除資料庫

刪除Testdb這個資料庫。

1、查看有哪些數據表

進入某個資料庫之後,想查看有哪些數據表,SQL語句為:

mydb是一個新建的資料庫,所以自然是沒有數據表。

2、創建數據表

建表SQL語句格式為:

說明: 每個欄位以逗號分隔,最後一個欄位不加逗號。

例如,給定一個學員信息表,如下表所示。

根據以上表格,建表SQL語句如下。

以上語句中,primary key表示主鍵,意思是這個欄位作為記錄的唯一標識,就像每個人的身份證號,都是唯一確定的。

3、查看錶結構

查看錶結構的SQL命令為:

執行該命令會顯示表stuinfo的基本結構,例如有哪些欄位,每個欄位是什麼類型,誰是主鍵等。

4、修改數據表

修改數據表通過drop子句進行,比如,建完表後,想增加一個欄位,SQL語句的格式為:

想在指定位置增加一個欄位,例如,在某個欄位後增加一個欄位,SQL語句的格式為:

如果在某個欄位之前增加欄位,用before即可。

例如,在欄位age後增加一個欄位major(專業),SQL語句為:

執行這個命令,再通過describe查看錶結構,會發現表中多了一個欄位major。

如果要刪除major這個欄位,通過drop子句,SQL語句為:

5、重命名表

重命名表通過alter+rename來實現,SQL語句格式為:

這里為了不影響之前創建的表,我們創建一個新表,SQL語句如下。

以上創建一個名為stuInfoTest的表,現在想將它的名稱改成stuinfotest1,SQL語句為:

6、刪除數據表

刪除數據表通過drop進行,SQL語句格式為:

例如,刪除數據表stuinfotest1,SQL語句為:

7、插入記錄

此時的表stuinfo是空的,沒有數據,我們要向表中插入記錄。

插入記錄通過insert into進行,SQL語句格式為:

例如,向表stuinfo插入一條記錄,SQL語句為:

注意:上方是一條SQL語句,為了可讀性換行,記住一條SQL語句默認以分號結尾。

如果需要一次性插入多條記錄,SQL語句格式為:

例如,向表stuinfo再插入兩條記錄,SQL語句為:

注意:如果設置了主鍵,插入記錄的主鍵欄位是不能重復的,也就是不能插入重復的記錄。

作業:大家可以按照上述方法將上面的學員信息表中的所有記錄都插入表stuinfo中。

8、查詢記錄

有了數據之後,就可以查詢記錄了,查詢記錄通過select子句進行。

例如,想查詢表stuinfo中的所有記錄,SQL語句為:

執行之後,就可以看到表stuinfo中的所有記錄了。

如果想查詢符合某個條件的記錄,就要用到where子句了,SQL格式為:

例如,想查詢stuid為20161001的記錄,SQL語句為:

9、刪除記錄

刪除記錄通過delete子句進行,SQL語句格式為:

例如,想刪除stuid為20161002的記錄,SQL語句為:

10、修改記錄

修改記錄通過update子句進行,update就是更新的意思,SQL語句格式為:

例如,想將學號(stuid)為20161001的記錄的姓名(stuname)更新為Jack,SQL語句為:

以上,就是MySQL中的基本SQL語句。

零基礎如何學習數據分析?查看下方專欄。

⑵ 關於sql查詢b表中存在,a表中不存在的數據

這實際上是求非交集(差集)問題,sql語句求差集相對於求交集的辦法要少得多。

求差集方法中,使用not in關鍵字進行篩選在邏輯上最容易理解,很多人都會想到利用到它,數據量不大時還行,但是它有個重大缺陷,那就是在碰到大數據表的情況下其運行效率極低,有沒有可被利用的索引效率都一樣極差。我曾在利用大數據表的測試中,發現not in 語句常常要花費數小時才能返回結果,最誇張的例子耗時竟然超過一天!在返回結果前數據查詢會處在"假死"狀態,讓人感覺是返回了空集似的,其實不是那樣的,只是資料庫引擎尚未完成運算而已。

在有可被利用的索引情況下,我們可以利用非存在not exists子句來篩選出兩表之間的差集,其運行效率是非常高的。以題主的語句為例可改寫如下:

原來使用not in篩選差集,大數據表效率極差:
SELECT ipdz FROM ipdz_b WHERE ipdz not in(select ipdz_d from zj_b);

而使用not exists篩選差集,大數據表有索引可利用時返回結果酒快多了:
select b.ipdz from ipdz_b b where not exists(
select 1 from zj_b a where a.ipdz_d=b.ipdz);

請留意不要踩not exists的坑!盡管它在有可被利用的索引時運行效率極高,但是如果沒可利用的索引它會跟not in一樣在遇到大數據表時, 運行運行效率也很糟!

在沒有索引可被利用的情況下,建議利用左(右)聯接出現的null值來求出差集,但是需要留意並小心處理因兩表連接所導致的記錄行變多問題。

下面是以題主的表結構為例的sql語句寫法,其返回結果集的速度還是很不錯的:

left join 篩選差集:
select b.ipdz from ipdz_b b left join zj_b a on
a.ipdz_d=b.ipdz where a.ipdz_d is null;

這里假設a表的ipdz_d是唯一的,如果非唯一需調整如下

select b.ipdz from ipdz_b b left join (
select distinct ipzd_d from zj_b) a on
a.ipdz_d=b.ipdz where a.ipdz_d is null;

總結:

小數據量not in隨便用,此方法邏輯簡單,語句易於編寫;
大數據量在有可利用的索引情況下,建議首選 not exists(因為效率最高);
大數據量時,有沒有可被利用的索引not in都要避免使用。而not exists 在沒索引可利用時也應避免使用,此時建議使用左left join或右連接返回差集會有比較好的表現。

後兩種方法在邏輯上不太好理解,還要處理因連接導致的記錄行變多問題,語句編寫相對麻煩。

⑶ mysql如何實現兩個表的數據差異查詢

查詢兩張表數據不一致的記錄,可以用求差集(非交集)的辦法來解決。
SQL語言求"差集"的辦法相對於求"交集"的辦法要少很多,一般可用not exists(非存在子句)或 左(右)連接後所產生空欄位值來篩選兩表的差集。
下面舉個例子供參考
選出a表中與b表中id不一致的記錄

select a.* from a where not exists (select 1 from b where b.id=c.id);

說明:上述語句只比對id一個欄位,我們可以根據需要比對多個欄位。not exists在比對欄位有可利用的索引時,其運行效率是非常高,但是如果沒有索引的情況下運行在大數據表時,其運行效率極差,這時應避免使用它,這時我們可改用左(右)連接來求差集。
下面是用左連接來求差集的例子:

1

select a.* from a left join b on a.id=b.id where b.id is null;

用左(右)連接來求差集,由於需要實施兩表連接會導致笛卡爾效應其輸出集的記錄行可能會增多,若果不是一對一或一對多,我們應該將多對多的情況處理成多對一後才進行連接,否則輸出的記錄集可能不正確。
求差集的兩種方法,有索引可利用時,not exists的效率要高於left join,反之left join效率更好。

⑷ SQL集合運算:差集、交集、並集



SQL集合運算:差集、交集、並集

2011年03月30日 15:41:00

閱讀數:15446

1、差集( except )

select a from t_a

except

select a from t_b

-- 也可寫作:

select a from t_a where a not in (select a from t_b)

-- 多個欄位時:

select a,b from t_a

except

select a,b from t_b

-- 多欄位的查集也可寫成:

select a,b from t_a where (a,b) not in (select a,b from t_b)

2、交集( intersect )

select a from t_a

intersect

select a from t_b

-- 也可寫作:

   select a from t_a where a in (select a from t_b)

3、並集( union )

select a from t_a

union distinct

select a from t_b

⑸ sql資料庫中把兩個表中的差集數據插入到第3個表,怎麼寫

insert into table_3 (column_1,column_2,column_3) select column_1,column_2,column_3 from table_1 minus select column_1,column_2,column_3 from table_2;

要點就是保持欄位一致。

⑹ 請問一下大神行家:使用Navicat for MySQL可以取得2個資料庫的並集嗎

步驟
兩個集合的結構要一致,對應的欄位數,欄位類型
將兩個集合用 UNION ALL 關鍵字合並,這里的結果是有重復的所有集
將上面的所有集 GROUP BY id
最後 HAVING COUNT(id)=1,等於1的意思是只出現了一次,所以這個是差集,如果等於2,那麼就是交集
代碼演示
差集
-- 下面的sql有明顯的問題,不過這個只是一個示意,
-- 從一個表中查詢不需要用到交集和差集,條件可以合並在一起直接查詢出來的.能明白意思就好
-- 下面的sql的意思是找到所有非技術部的員工的id,code和name
SELECT a.* FROM(
SELECT id,code,name FROM test_emp
UNION ALL
SELECT id,code,name FROM test_emp WHERE dept='JSB'
)a GROUP BY a.id HAVING COUNT(a.id)=
交集
-- 下面的sql的意思是找到所有技術部年齡大於25的員工
SELECT a.* FROM(
SELECT id,code,name FROM test_emp WHERE age>25
UNION ALL
SELECT id,code,name FROM test_emp WHERE dept='JSB'
)a GROUP BY a.id HAVING COUNT(a.id)=2
並集
-- 下面的sql的意思是找到所有技術部的員工和年齡大於30的員工
-- union可以自動去除重復的內容,得到不重復的結果集
SELECT a.* FROM(
SELECT id,code,name FROM test_emp WHERE age>25
UNION
SELECT id,code,name FROM test_emp WHERE dept='JSB'
)a

⑺ MySQL資料庫SQL語法參考


一、資料定義 ddl(data definition language)
資料定語言是指對資料的格式和形態下定義的搭纖局語言,他是每個資料庫要建立時候時首先要面對的,舉凡資料分哪些表格關系、表格內的有什麽欄位主鍵、表格和表格之間互相參考的關系等等,都是在開始的時候所必須規劃好的。
1、建表格:
create table table_name(column1 datatype [not null] [not null primary key],
column2 datatype [not null],
...);
說明:
datatype --是資料的格式,詳見表。
nut null --可不可以允許資料有空的(尚未有資料填入)。
primary key --是本表的主鍵。
2、更改表格
alter table table_name
add column column_name datatype
說豎扮明:增加一個欄位(沒有刪除某個欄位的語法。
alter table table_name
add primary key (column_name)
說明:更改表得的定義把某個欄位設為主鍵。
alter table table_name
drop primary key (column_name)
說明:把主鍵的定義刪除。
3、建立索引
create index index_name on table_name (column_name)
說明:對某個表格的欄位建立索引以增加查詢時的速度。
4、刪除
drop table_name
drop index_name
二、資料操作 dml (data manipulation language)
資料定義好之後接下來的就是資料的操作。資料的操作不外乎增加資料(insert)、查詢資料(query)、更改資料(update) 、刪除資料(delete)四種模式,以下分 別介紹他們的語法:
1、增加資料:
insert into table_name (column1,column2,...)
values ( value1,value2, ...)
說明:
1.若沒有指定column 系統則會按表格內的欄位順序填入資料。
2.欄位的資料形態和所填入的資料必須吻合。
3.table_name 也可以是景觀 view_name。
insert into table_name (column1,column2,...)
select columnx,columny,... from another_table
說明:也可以經過一個子查詢(subquery)把別的表格的資料填入。
2、查詢資料:
基本查詢
select column1,columns2,...
from table_name
說明:把table_name 的特定欄位資料全部列出來
select *
from table_name
where column1 = xxx
[and column2
yyy] [or column3
zzz]
說明:
1.'*'表示全部的欄位都列出來。
2.where 之後是接條件式,把符合條件的資料列出來。
select column1,column2
from table_name
order by column2 [desc]
說明:order by 是指定以某個欄位做排序,[desc]是指從大到小排列,若沒有指明,則是從小到大
排列
組合查詢
組合查詢是指所查詢得資料來源並不只有單一的表格,而是聯合一個以上的表格才能夠得到結果的。
select *
from table1,table2
where table1.colum1=table2.column1
說明:
1.查詢兩個表格中其中 column1 值相同的資料。
2.當然兩個表格相互比較的欄位,其資料形態必須相同。
3.一個復雜的查詢其動用到的表格可能會很多個。
整合性的查詢:
select count (*)
from table_name
where column_name = xxx
說明:
查知讓詢符合條件的資料共有幾筆。
select sum(column1)
from table_name
說明:
1.計算出總和,所選的欄位必須是可數的數字形態。
2.除此以外還有 avg() 是計算平均、max()、min()計算最大最小值的整合性查詢。
select column1,avg(column2)
from table_name
group by column1
having avg(column2)
xxx
說明:
1.group by: 以column1 為一組計算 column2 的平均值必須和 avg、sum等整合性查詢的關鍵字一起使用。
2.having : 必須和 group by 一起使用作為整合性的限制。
復合性的查詢
select *
from table_name1
where exists (select *
from table_name2
where conditions )
說明:
1.where 的 conditions 可以是另外一個的 query。
2.exists 在此是指存在與否。
select *
from table_name1
where column1 in (select column1
from table_name2
where conditions )
說明:
1. in 後面接的是一個集合,表示column1 存在集合裡面。
2. select 出來的資料形態必須符合 column1。
其他查詢
select *
from table_name1
where column1 like 'x%'
說明:like 必須和後面的'x%' 相呼應表示以 x為開頭的字串。
select *
from table_name1
where column1 in ('xxx','yyy',..)
說明:in 後面接的是一個集合,表示column1 存在集合裡面。
select *
from table_name1
where column1 between xx and yy
說明:between 表示 column1 的值介於 xx 和 yy 之間。
3、更改資料:
update table_name
set column1='xxx'
where conditoins
說明:
1.更改某個欄位設定其值為'xxx'。
2.conditions 是所要符合的條件、若沒有 where 則整個 table 的那個欄位都會全部被更改。
4、刪除資料:
delete from table_name
where conditions
說明:刪除符合條件的資料。
說明:關於where條件後面如果包含有日期的比較,不同資料庫有不同的表達式。具體如下:
(1)如果是access資料庫,則為:where mydate#2000-01-01#
(2)如果是oracle資料庫,則為:where mydatecast(񟭀-01-01' as date) 或:where mydateto_date(񟭀-01-01','yyyy-mm-dd')
在delphi中寫成:
thedate=񟭀-01-01'
query1.sql.add('select * from abc where mydatecast('+''''+thedate+''''+' as date)');
如果比較日期時間型,則為:
where mydatetimeto_date(񟭀-01-01 10:00:01','yyyy-mm-dd hh24:mi:ss');