结构化查询语言(SQL)入门
零、引入數據庫
SQL,即結構化查詢語言。SQL是操作和檢索關系數據庫的標準語言,標準的SQL語句可用于操作任何關系數據庫。標準的SQL語句通常可分為以下幾種類型:
1.查詢語句:主要有select關鍵字完成,查詢語句是SQL語句中最復雜,功能最豐富的語句;
2.DML(數據庫操作語言)語句:主要有insert、update、delete三個關鍵字完成;
3.DDL(數據定義語言)語句:主要有create、alter、drop和truncate四個關鍵字完成;
4.DCL(數據控制語言)語句:主要有grant和revoke兩個關鍵字完成;
5.事務控制語句:主要有commit、rollback和savepoint三個關鍵字完成。
SQL語句的關鍵字不區(qū)分大小寫,在上面五種語句中,DCL語句用于為數據庫用戶授權,或者回收指定用戶的權限,通常無須程序員操作。
一、DDL語句語法
標準建表語句:create table (mode_name) table_name (columnName1 datatype [defaul expr],); 如果有多行列定義,最后一行那句后面沒有逗號!該表只是一個空表,如果使用子查詢建表語句,則可以在建表的同時插入數據:create table (mode_name) table_name [column1,column2...] as subquery;(這個語法中新表的字段列表必須與子查詢中的字段列表數量匹配),也可以使用這種create table (table_mode) table_name as select * from table_name2;
修改表結構語法使用alter table,修改包括增加列定義、修改列定義、刪除列、重命名列等操作:
增加:alter table table_name add (column_name1 datatype [default expr],);
如果只是新增一列,僅在add后緊跟一個列定義即可,可以省略括號add table_name datatype;
修改列定義:alter table table_name modify column_name datatype [default expr];(該修改語句每次只能修改一個列定義)其中,default為指定默認值。
從數據表中刪除列:alter table table_name drop column_name; (從數據表中刪除列定義通常總是可以成功,刪除列定義時將從每行中刪除該列的數據,并釋放該列在數據塊中占用的空間。所以刪除大表中的字段時需要比較長的時間,因為還要回收空間)
重命名數據表的語法結構:alter table table_name rename to new_table_name;
MySQL為ALTER TABLE提供了change選項,該選項也可以改變列名:alter table table_name change old_table_name new_table_name type [default expr];
刪除表:drop table table_name;(表結構被刪除,表對象不再存在;表里的所有數據也被刪除;該表所有相關的索引、約束也被刪除)
截斷表:truncate table_name;相對于DML里的delete而言,truncate的速度要快得多。
數據庫約束,通過約束可以更好地保證數據表里數據的完整性,約束是在表上強制執(zhí)行的數據校驗規(guī)則。除此之外,當表中數據存在相互依賴行時,可以保護相關的數據不被刪除。
大部分數據庫支持下面5種完整的約束:
1.NOT NULL:即非空約束,指定某個列不能為空;
2.UNIQUE:唯一約束,制定某列或者幾列的組合不能重復;
3.PRIMARY KEY:主鍵,指定該列的值可以唯一的標識該條記錄;
4.FOREIGN KEY:外鍵,指定該行記錄從屬于主表的一條記錄,主要用于保證參照完整性;
5.CHECK:檢查,制定一個布爾表達式,用于指定對應列的值必須滿足該表達式。
(其中,對于CHECK約束,MySQL并不支持,所以不會起任何作用)
NOT NULL:
SQL中的null具有如下特征:
- 所有數據類型的值都可以是null,包括int、float、boolean等數據類型;
- 與Java類似的是,空字符串不等于null
如果想要指定非空約束,直接在列定義后面加上NOT NULL即可。若要刪除,則:modify column_name datatype null;
除此之外,也可以在使用alter table修改表時增加或者刪除非空約束:alter table table_name modify column_name datatype not null;取消則把not null改為null。
UNIQUE:
不能出現重復值但是能出現多個null值。
指定唯一約束,即在定義后面直接加UNIQUE。
如果需要為多列組合建立唯一約束,或者想自行指定約束名,則需要使用表級約束語法:unique (column_name),constraint unique_name unique(column_name)(使用表級約束語法建立唯一約束,使用表級約束語法建立唯一約束且指定約束名)。
增加唯一約束(直接添加即可)alter table table_name add unique(column_name1,...);
也可以使用modify關鍵字:alter table table_name modify table_name datatype unique;
刪除唯一約束:alter table table_name drop index unique_name;
PRIMARY KEY:
主鍵約束相當于非空約束加唯一約束,即既不允許出現重復值,也不允許出現null。
指定主鍵約束,直接定義后面加PRIMARY KEY。
表級約束:primary key(column_name1,column_name2);
刪除:alter table table_name drop primary key;
為指定表增加主鍵約束:alter table table_name add primary key(column_name1,column_name2);
使用列級增加約束:alter table table_name modify column_name datatype primary key;
建立主鍵約束并且使其自增長:column_name datatype auto_increment primary key,
FOREIGN KEY:
外鍵約束主要用于保證一個或兩個數據表之間的參照完整性。
外鍵確保了相關的兩個字段的參照關系:子表外鍵列的值必須在主表被參照列的值范圍內,或為空。
當主表的記錄被從表記錄參照時,主表記錄不允許被刪除,必須先把從表里參照該記錄的所有記錄全部刪除后,才可以刪除主表的該記錄。(還有一種方式,刪除主表記錄時級聯(lián)刪除從表中所有參照該記錄的從標記錄)
從表外鍵參照的只能是主表主鍵列或者唯一鍵列,同一個表內可以有多個外鍵。
采用列級約束語法建立外鍵可直接使用references關鍵字:指定一列參照其他表的其他列foreign_column_name datatype references primary_table_name(primary_column_name);
表級約束語法:foreign key(foreign_column_name) references table_name(primary_colunm_name);
可以用constraint來指定約束的名字:constraint foreign_key_name foreign key(foreign_column_name) references table_name(primary_column_name);
多列外鍵使用表級約束:foreign key(foreign_column_name1,foreign_column_name2) references table_name(primary_column_name1,primary_column_name2);
刪除外鍵約束:alter table table_name drop foreign key foreign_key_name;
增加外鍵約束:alter table table_name add foreign key(foreign_column_name1,foreign_column_name2) references table_name(primary_column_name1,primary_column_name2);
其中,外鍵約束不僅可以參照其他表,而且可以參照自身,這種參照自身的情況通常被稱為自關聯(lián)。
如果想定義當刪除主表記錄時,從表記錄也會隨之刪除,則需要在建立外鍵約束后添加on delete cascade(刪除主表記錄時,把參照該主表記錄的從表記錄全部級聯(lián)深處)或添加on delete set null(指定當刪除主表記錄時,把參照該主表記錄的從表記錄的外鍵設為null)。
索引,存放在模式(schema)中的一個數據庫對象。創(chuàng)建索引的唯一作用就是加速對表的查詢,索引通過使用快速路徑訪問方法來快速定位數據,從而減少了磁盤的I/O。
索引作為數據庫對象,在數據字典中獨立存放,但不能獨立存在,必須屬于某個表。
創(chuàng)建與刪除索引:當在表上定義主鍵約束、唯一約束和外鍵約束時,系統(tǒng)會為該數據列自動創(chuàng)建對應的索引,同樣的,當數據表被刪除時,該表上的索引自動刪除。手動創(chuàng)建:create index index_name on table_name(column_name...);刪除: drop index index_name on table_name;
索引的好處就是可以加速查詢,壞處是當數據表中的記錄被添加、刪除、修改時,數據庫系統(tǒng)需要維護索引,因此有一定的系統(tǒng)開銷;而且存儲索引信息需要一定的磁盤空間。
視圖,一個或多個數據表中數據的邏輯顯示。
使用視圖的好處:1.可以限制對數據的訪問;2.可以使復雜的查詢變得簡單;3.提供了數據的獨立性;4.提供了對相同數據的不同顯示。
創(chuàng)建視圖:create or replace view view_name as subquery(查詢語句);
限制修改:create or replace view view_name as subquery with check option;
刪除:drop view view_name;
所謂視圖的本質,就是一條被命名的SQL查詢語句
二、DML語句語法
與DDL操作數據庫對象不同,DML語句主要操作數據表里的數據,使用DML可以完成:1.插入新數據;2.修改以有數據;3.刪除不需要數據。
DML語句由insert into、update和delete from三個命令組成。
insert into:
該語句用于向指定數據表中插入記錄。對于標準的SQL語句而言,每次只能插入一條記錄:insert into table_name(column_name1...) values(value_name1...); 執(zhí)行插入操作時,表名后面可以用括號列出所有需要插入值的列名,而values后用括號列出對應需要插入的值。
如果沒有在表后用括號列出所有列,則需要為所有列指定值,若不確定則分配個null:insert into table_name values(null...,value);
當向外鍵列里插值時,外鍵列的值必須是被參照列里已有的值。
帶有子查詢的插入語句可以一次插入多條記錄:insert into table_name1(column_name1) select column_name2 from table_name2;
update:
update語句用于修改數據表記錄,每次可修改多條記錄,用where可以限定修改哪些記錄。where就相當于if一樣。若無where就相當于where的表達值總是true,即所有記錄都會被修改。
修改通用語法:update table_name set column1=value1,... [where condition];
delete from:
該語句用于刪除指定數據表的記錄,無需指定列名應為總是整行的刪除。
語法格式:delete from table_name [where condition];
若不加condition則會全部刪除。
對于select:
單表查詢:select column_name1,column_name2... from table_name [where condition];
默認查所有行所有列數據:select * from table_name
select會默認的所有符合條件的記錄全部選出來,即使完全一樣也都打印。可以在select后面加一個distinct關鍵字去重復。
SQL常見函數:
ifnull(expr1,expr2):如果expr1為null,則返回expr2,否則返回expr1。
nullif(expr1,expr2):如果expr1和expr2相等,則返回null,否則返回expr1。
if(expr1,expr2,expr3):如果expr1為true不等于0和null,則返回expr2,否則返回expr3。
isnull(expr1):若expr1為null返回true,否則返回false。
avg(expr):計算多行expr的平均值。其中expr可以為變量、常量或數據列,但類型必須為數值型。
count(expr):計算多行expr的總條數。其中expr可以是變量、常量或數據列,數據類型可以為任意。
min(expr),max(expr):計算多行expr的最大or最小值。其中expr可以是變量、常量或數據列,數據類型可以為任意。
sum(expr):計算多行expr的總和,其中expr可以是變量、常量或數據列,但其數據類型必須是數值型;可以用distinct來不計算重復值。
SQL92的連接查詢:
如果連接條件要求兩列值相等,這稱為等值連接,否則稱為非等值連接。如果沒有任何的連接條件,這稱為廣義笛卡爾積。SQL92中多表連接查詢的語法格式如下:select column_name1,column_name2... from table_name1 table_name2... [where condition];
調用函數舉例:select s.* , teacher_name from student_table s , teacher_table t where s.j_teacher=t.teacher_id;
SQL99的連接查詢:
比起SQL92,SQL99連接查詢的可讀性更強。
交叉連接:效果等同于SQL92中的廣義笛卡爾積:cross foin table_name t;
自然連接:自然連接會以兩個表中同名列作為連接條件:如果沒有同名,則于交叉連接效果完全一樣:natural join table_name t;
using子句連接:using自己可以指定一列或多列,用于顯式指定兩個表中的同名列作為連接條件。即比起自然連接,可以指定哪些同名作為連接條件:join table_name t using(column_name);
on子句連接:SQL99語法的連接條件放在on子句中指定,且每個on子句只能指定一個連接條件。即如果需要進行N表連接,則需要有N-1個join…on對:join table_name t on s.column_name1=t.columne_name2;on后可以為等值或非等值。
子查詢就是指在查詢語句中嵌套另一個查詢,子查詢可以支持多層嵌套。
子查詢出現位置:from語句后當成數據表,這種用法也被稱為內視圖;出現在where條件后作為過濾條件的值。
子查詢要用括號括起來,把子查詢當成數據表時(出現在from之后),可以為該子查詢起別名,尤其是作為前綴來限定數據列時,必須給子查詢起別名。
集合運算:
為了對兩個結果進行集合運算,這兩個結果集所包含的數據列的數量必須相等且數據類型必須一一對應。
union運算:select 語句 union select 語句并運算。
minus運算:where(column_name1,column_name2) not in (select column_name3,column_name4 from table_name);差運算。
intersect運算:join table_name on(column_name1=column_name2 and column_name3=column_name4);交運算。
總結
以上是生活随笔為你收集整理的结构化查询语言(SQL)入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最强音乐播放器JetAudio_v9.9
- 下一篇: 数据库update(动态更新)-SqlS