常用SQL系列之(六):刪除方式、數據庫、表及索引元信息查詢等

本系統為 在微頭條上的內容,

為便於查閱,特輯錄於此,都是常用SQL基本用法。。

前兩篇連接:

(一):

(二):

(三):

(四):

(五):

常用SQL系列之(六):刪除方式、數據庫、表及索引元信息查詢等

(36):從數據庫表中刪除數據都有哪些方式 ?


刪除數據有主要幾種基本的方式,
其一,刪除表中所有數據,參考SQL形如:delete from xtable
xtable是數據庫中存在的表名。
其二,刪除表中指定條件記錄,參考SQL形式:delete from xtable where condition
此語句中必須存在的是where 子句,其中condition為條件表達式(含組合表達式),比如:
delete from employee where deptno=10(刪除部門為10的員工,刪除數量兩位所有滿足條件的員工信息)。
其三,刪除單個記錄。參考sql形如:delete from Employee where empno =2020
必須指定唯一標識一條記錄的條件。where子句可以為組合條件,以唯一標識一條記錄。

(37):如何刪除違反引用完整性的記錄?


也就是從表中刪除那些引用其它表中不存在的記錄。比如比如員工必是屬於某一部門的,但由於某些原因,導致員工表中有很多記錄不屬於任何存在的部門,要將這些員工刪除。我們可以用not exist或not in來實現,參考SQL如下:
delete from employee e where not exist (select * from dept d where d.deptno = e.deptno )
或者這樣:


delete from employee where deptno not in (select deptno from dept)

(38):如何數據表中刪除重複記錄?


比如我們創建這樣一個表:create table item(id integer,name varchar(10));
然後插入如下記錄:
insert into item values(1,'北京');insert into item values(2,'上海');
insert into item values(3,'廣州');insert into item values(4,'廣州');
insert into item values(5,'西安');insert into item values(6,'西安');
insert into item values(7,'西安');
對於每個像“西安”這樣重複的數據,只保留其中的一個id,並刪除其餘。也不關心保留的id是5、6或7,反正表中只留一個“西安”。我們可以用帶有聚集函數的子查詢,例如min,任意選擇保留的id(本利中保留值最小的id),參考SQL示例如下:
delete from from item where id not in (select min(id) from item group by name)
其實邏輯就是通過分組子查詢保留數據的單一性,把不在單一性內的數據刪除。這裡的分組也是為了確立“重複”的概念,以便實現數據的過濾。
這裡僅是簡單示例,你也可以用max來試試看。操練一把試試吧。

(39):如何查看數據庫(也常叫數據庫模式或模式)中的表 信息?


也就是查看指定模式/數據庫中已創建的表或視圖的清單 ?
假設有這樣一個數據庫MYDB,那麼:


1)在Oracle中,這樣來查SYS.ALL_TABLES,參考如下:
select table_name from all_tables where owner = 'MYDB' ;
2)在DB2中查詢SYSCAT.TABLES,參考SQL語句如下:
select tabname from syscat.tables where tabschema ='MYDB' ;
3)MySQL、PostgreSQL和SQL Server中,查詢INFORMATION_SCHEMA.TABLES,參考如下:
select table_name from information_schema.tables where table_schema = 'MYDB' .
試試查一把看看吧

(40):如何通過SQL語句查看錶結構(列和類型等)?


也就是直接用sql語句列出表的列、數據類型以及列在表中的位置等信息。其實各家廠商提供的數據庫的實現是不一樣的。比如我們要查看mydb數據庫中employee表的各列、類型以及位置,那麼:
1)Oracle中,我們可以查看all_tab_columns表,參考SQL如下:
select column_name,data_type,column_id
from all_tab_columns where owner = 'mydb' and table_name='employee' ;
2) DB2中,通過查看syscat_columns表來獲得相關信息,參考sql如下:
select colname,typename,colno from syscat_columns
where tabname='employee' and tabschema = 'mydb' ;
3)MySQL與PostgreSQL和SQL Server一樣,查看information_schema.columns來獲得信息,參考SQL如下:
select column_name,data_type,ordinal_position
from information_schema.columns where table_schema = 'mydb' and table_name = 'employee' ;
注意,每個版本的數據庫都提供了獲得列數據的詳細方法,這裡查看了列名稱、類型和位置,其它的信息如長度、默認值、是否可空等都可以查看。偷懶的方式,你可以直接用*(星號)來查看所有。


數據庫的元信息,在數據持久化框架中會經常用到,以便於明確匹配約束和映射等。各類驅動也都提供了相應的方法,可根據需要來善加利用。

(41):如何查看一個表的索引列?


也就是查看某一表是否有索引以索引列等信息等。不論何種數據庫,這裡還是假設數據庫為mydb,以及employee表。那麼:
1)在oracle中,通過查看系統表sys.all_ind_columns來確認,參考語句如下:
select table_name,index_name,column_name,column_position from sys.all_ind_columns
where table_name = 'employee' and table_owner = 'mydb';
2)在DB2中,查看系統表syscat.indexes,參考語句如下:
select a.tabname,b.indname,b.colname,b.colseq from syscat.indexes a,syscat.indexcoluse b
where a.tabname = 'employee'
and a.tabschema = 'mydb'
and a.indschema = b.indschema
and a.indname = b.indname ;
3)在MySQL中,最簡單,語句示例如下:
show index from employee ;
4)其他數據PostgreSQL和SQLServer,自己查查看吧(前者通過兩個系統表PG_CATALOG.PG_INDEXES和INFORMATION_SCHEMA.COLUMNS進行關聯查看,後者通過4系統表SYS.TABLES,SYS.INDEXES,SYS.INDEX_COLUMNS,SYS.COLUMNS進行關聯查看),自己動手試試吧。


分享到:


相關文章: