技術問答集錦(九)數據庫系列

1 數據庫SQL分爲幾種

DML(數據操做語言)、DDL(數據定義語言)、DCL(數據控制語言)sql

2 描述表SQL

desc table_name 描述表結構、類型、約束數據庫

3 從新給列取別名

select last_name , salary*12 "year_sal" from employee; (別名也能夠不加雙引號)bash

4 鏈接運算符

select first_name || ' ' || last_name || ','|| title "Employees" from employee;服務器

5 空值處理

select last_name , title , salary*NVL(commission_pct , 0)/100 COMM from s_emp;數據庫設計

若是某一個字段爲NULL,則對該字段進行任何操做後仍爲NULL;函數

NVL函數:表示該字段爲NULL時,則用第二個參數值來代替大數據

6 like 使用

select last_name from s_emp where last_name like 'M%'; 匹配多個字符ui

select last_name from s_emp where last_name like '_M%';匹配單個字符spa

select last_name from s_emp where last_name like 'S\_M%' escape '\';設計

escape:指定一個字符爲拖字符,意義指拖字符後面的字符再也不爲關鍵字,僅是一個字符。

7 排序 order by

select last_name , salay * 12 from s_emp order by 2; 表明按查詢結果的第二列升序排列。(默認爲升序排序)

8 SQL函數使用

LOWER('Sql Course')=> sql course 轉換爲小寫形式

UPPER('Sql Course')=> SQL COURSE 轉換爲大寫形式

INITCAP('SQL COURSE')=> Sql Course 轉換爲每一個單詞首字母大寫

CONCAT('Good','String')=> GoodString 鏈接字符串

SUBSTR('String',1,3)=>Str 1表明起始位置,3表明截取的長度

LENGTH('String')=>6 獲取字符串長度

ROUND(45.923,2)=>45.92 作四捨五入處理 表示保留到小數點後2位

ROUND(45.923,0)=>46 作四捨五入處理 表示保留到個位,若第二個參數省略,默認爲0

ROUND(45.923,-1)=>50 作四捨五入處理 表示保留到十位

TRUNC(45.923,2)=>45.92 作直接截斷處理,不進行四捨五入處理,表示保留到小數點後2位

TRUNC(45.923,0)=>45 作直接截斷處理,不進行四捨五入處理,表示保留到個位,若第二個參數省略,默認爲0

TRUNC(45.923,-1)=>40 作直接截斷處理,不進行四捨五入處理,表示保留到十位

TO_CHAR(birthday,'YYYY-MM-DD') Date轉爲字符串

TO_DATE('1980-03-04','YYYY-MM-DD') 字符串轉爲Date

TO_NUMBER('1980') 字符串轉爲數字

MOD(id,2) 表示對2進行求餘運算

9 函數嵌套使用

select last_name , NVL(TO_CHAR(manager_id),'No Manager') from s_emp where manager_id is null;

10 獲取系統當前日期

select name , birthday , SYSDATE from employee;

11 多表鏈接查詢

等值鏈接、交叉鏈接、外鏈接、自鏈接

12 分組查詢

SELECT 後可出現分組依據字段、分組函數

FROM 表名

WHERE 後不可以使用分組函數做爲條件的,是對分組前數據篩選,由於數據尚未分組,因此就沒有分組函數可言。

GROUP BY 指定分組依據字段

HAVING 對分組記錄進行篩選,並且必須伴隨group by 出現,後能跟分組依據字段、分組函數

ORDER BY 對分組記錄進行排序,後能跟分組依據字段、分組函數

13 分組函數

AVG()=>平均值;COUNT()=>計數;MAX()=>最大值;MIN()=>最小值;SUM()=>求和值;

14 數據完整性約束

實體完整性:規定表的每一行在表中是唯一的實體。

列完整性: 是指表中的列必須知足某種特定的數據類型約束,其中約束又包括取值範圍、精度等規定。

參照完整性: 是指兩個表的主鍵字段和外鍵字段的數據應一致,保證了表之間的數據的一致性,防止了數據丟失或無心義的數據在數據庫中擴散。

用戶定義的完整性: 不一樣的關係數據庫系統根據其應用環境的不一樣,每每還須要一些特殊的約束條件。用戶定義的完整性便是針對某個特定關係數據庫的約束條件,它反映某一具體應用必須知足的語義要求。

15 數據庫設計三範式

第一範式(確保每列保持原子性):最基本的範式。若是數據庫表中的全部字段值都是不可分解的原子值,就說明該數據庫表知足了第一範式。

第二範式(確保表中的每列都和主鍵相關):在第一範式的基礎之上更進一層。第二範式須要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能保存一種數據,不能夠把多種數據保存在同一張數據庫表中。

第三範式(確保每列都和主鍵列直接相關,而不是間接相關):在第二範式的基礎之上更進一層 。要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。

16 varchar2和char區別

varchar2(size) 可變長度的字符值,節省空間,查詢效率低

char(size) 固定長度的字符值,浪費空間,查詢效率高

17 數據類型

NUMBER(8,2) 8位有效數字,小數點後有效位數2位

CLOB 字符大數據,保存很長的文本,最大可爲4G

BLOB 二進制大數據,保存圖片,最大可爲4G

18 日期函數

select SYSDATE from DUAL 可查看日期

MONTHS_BETWEEN('01-12-95','01-10-94') 得到相隔的月數

ADD_MONTHS('01-10-95',2) 得到2個月後的日期

NEXT_DAY('01-10-95','FRIDAY') 從該日期開始的星期五是幾號

LAST_DAY('01-10-95') 該月份的最後一天

ROUND(SYSDATE,'MONTH') 對月份作四捨五入處理

ROUND(SYSDATE,'YEAR') 對年份作四捨五入處理

TRUNC(SYSDATE,'MONTH') 對月份直接進行截斷處理

TRUNC(SYSDATE,'YEAR') 對年份直接進行截斷處理

19 表約束與列約束定義主鍵約束

主鍵字段:

  1. 一個表只能建立一個主鍵;

  2. 主鍵字段的值惟一;

  3. 主鍵字段的任意部分都不容許爲空;

  4. 凡是建立了主鍵約束的列,在主鍵列都會自動建立惟一性索引;

create table stu
    (
       id number(7) constraint stu_id_pk PRIMARY KEY ,  列約束
       name varchar2(20) constraint stu_name_nn not null, 列約束
       constraint stu_id_name_pk PRIMARY KEY(id,name) 表約束
    );
複製代碼

表約束能夠定義組合字段爲主鍵約束,列約束是不能夠的。

20 表約束與列約束定義外鍵約束

列約束:

create table s_emp
(

... dept_id number(7) constraint s_emp_dept_id_fk references s_dept(id),...

);
複製代碼

表約束:

create table s_emp
(

... constraint s_emp_dept_id_fk FOREIGN KEY(dept_id) references s_dept(id),...

);
複製代碼

on delete cascade : 級聯刪除(把主鍵表中的記錄刪除,則外鍵表中自動刪除相應的記錄) on delete set null :刪除後,字段置空

21 表約束與列約束定義惟一性束

列約束:

create table s_emp
(

...,phone varchar2(10) constraint s_emp_phone_uk UNIQUE,...

);
複製代碼

表約束:

create table s_emp
(

...,constraint s_emp_phone_uk UNIQUE(phone,name),...

);
複製代碼

若是定義了惟一約束字段,會自動給該列添加惟一索引。

22 自定義檢查約束

表約束:

create table s_emp
(

...,constraint s_emp_com_pct_ck CHECK(com_pct in(10,12.5,15,17.5,20)),...

);
複製代碼

23 使用子查詢建立表

create table s_emp_41
AS
select id , last_name , userid , start_date
from s_emp
where dept_id=41
複製代碼

原來表中僅有非空約束被拷貝,其餘約束都沒有被拷貝。

24 添加、修改、刪除列

alter table s_emp add(comments varchar2(255));僅能添加非空約束/無約束的列,其餘約束不能夠。當表中有記錄時,添加一個非空的列,則會報錯。

alter table s_emp drop(comments);

alter table s_emp modify(comments varchar2(50)); 僅能修改字段的數據類型、非空約束、默認值。

25 添加、刪除、生效、失效約束

alter table s_emp
add constraint s_emp_manager_id_fk FOREIGN KEY(manager_id) REFERENCES s_emp(id);

alter table s_emp
drop constraint s_emp_manager_id_fk ;

alter table s_emp
drop PRIMARY KEY cascade;級聯刪除外鍵約束;刪除主鍵約束時,能夠不用寫約束名;(由於主鍵約束惟一)

alter table s_emp
disable constraint s_emp_id_pk cascade;外鍵約束級聯失效

alter table s_emp
enable constraint s_emp_id_pk cascade;外鍵約束級聯生效
複製代碼

26 刪除、重命名錶

drop table s_emp cascade constraints;在刪除表的同時,級聯刪除該表上的全部約束。屬於DDL,刪除表的結構,釋放表的空間,不可恢復。

truncate table s_emp;屬於DDL,刪除表記錄,保留表結構,不可恢復。

delete table s_empl;屬於DML,刪除表記錄,保留表接口,可按條件刪除,可恢復。

rename s_emp to s_emp_new;重命名錶名。

27 增長、刪除、修改表記錄

insert into  s_emp (...,...,...) values('','','');

insert into  s_emp(...)
select id , last_name , salary
from s_emp
where start_date <'01-02-94';

update s_emp set dept_id=10 where id=2;

delete from s_emp where id=2; 刪除記錄時不能違反表的參照完整性約束;
複製代碼

凡是增長、刪除、修改,均要使用commit提交!

28 數據庫事務

一個或多個DML語句組成,各DML語句是不被打斷的,可爲一事務。

一個DDL語句組成,可爲一事務。

一個DCL語句組成,可爲一事務。

29 數據庫事務結束

commit/rollback。(rollback 回滾到最近一次commit位置)

執行到一個DDL/DCL,事務結束,事務會自動提交。

系統崩潰,自動回滾。

30 序列 Sequence

可以自動產生一個惟一數字的對象;

能夠被共享的對象;

只能保證給出的值是有序的;

典型的建立主鍵值的方法;

31 索引

索引的原理:二叉樹結構;

若是在表中的某個字段加上了主鍵約束或惟一約束,系統會自動爲該字段建立惟一索引;

索引是建在字段上的,是與字段相關的;

使用索引能減小磁盤的IO,索引是自動被Oracle服務器使用和維護;

32 視圖

一張虛表,與表有相同的結構,虛表不存儲數據,只保留結構,數據都從表中來;

33 集合操做

UNION:並集,去掉兩個查詢結果中重複的記錄;

UNIONALL:並集,不會去掉重複記錄;

INTERSECT:交集,取兩查詢結果中相同記錄;

MINUS:取相應的補集;

相關文章
相關標籤/搜索