mysql和oracle語法都差不多,但還是有差別,查閱資料后我總結了一套完整的sql語句大全,供初學者學習
1.SQL是用于訪問和處理數據庫的標準計算機語言-------結構化查詢語言(Structured Query Language)
RDBMS:關系型數據庫管理系統,是sql基礎,有 MS SQL Server、IBM DB2、Oracle、MySQL等
2.語法:
表是相關數據的集合,由行和列組成
SQL不區分大小寫
SELECT - 從數據庫中提取數據 UPDATE - 更新數據庫中的數據
DELETE - 從數據庫中刪除數據 INSERT INTO - 向數據庫中插入新數據
CREATE DATABASE - 創建新數據庫 ALTER DATABASE - 修改數據庫
CREATE TABLE - 創建新表 ALTER TABLE - 變更(改變)數據庫表
DROP TABLE - 刪除表 CREATE INDEX - 創建索引(搜索鍵)
DROP INDEX - 刪除索引
3.查詢-----select
(1)select----從數據庫選取數據
select 列名 from 表名------------------查詢指定的列的數據
select * from 表名------------------------查詢整張表
(2)distinct :一列可能有多個重復值,distinct返回唯一不同的值,即去重復
select distinct 列名 from 表名-----------查詢指定列的唯一不同的數據
(3)where:過濾條件
例:SELECT * FROM web WHERE country='成都';
字符串需要用引號,數字不需要引號
select * from 表名 where 條件--------查詢滿足條件的所有數據
=:等于 !=或<>:不等于 >:大于 >=:大于等于
<:小于 <=:小于等于 between:在某個范圍
like:某種模式 in:多個可能值 like:模糊查詢 not like:不匹配記錄
例:
name 含 "oo" 的所有客戶:SELECT * FROM web WHERE name LIKE '%oo%';
name不含“00”的所有客戶:SELECT * FROM web WHERE name NOT LIKE '%oo%';
通配符:%----代替多個字符,-------替代一個字符
M% : 以M 開頭的 %M% :包含M %M% : 包含M并且M在倒數第二位
_M:任一字符開頭M結尾的 [ ]:字符列中任一個 [^ ]/[! ]:不在字符列任一個
例:
name 以 "G"、"F" 或 "s" 開始的所有網站:
SELECT * FROM web WHERE name REGEXP '^[GFs]';
name 不以 "G"、"F" 或 "s" 開始的所有網站:
SELECT * FROM web WHERE name REGEXP '[GFs]';
注:mysql 以 REGEXP 或 NOT REGEXP 運算符 (或 RLIKE 和 NOT RLIKE) 來操作正則表達式
in:匹配條件存在多個值
例: name 為 "a" 或 "b" 的所有網站
SELECT * FROM web WHERE name IN ('a','b');
between:兩個值之間的數據(不同數據庫可能取邊值不同)
例: alexa 介于 1 和 20 間
SELECT * FROM web WHERE alexa BETWEEN 1 AND 20;
name 介于 'A' 和 'H' 之間字母:
SELECT * FROM web WHERE name BETWEEN 'A' AND 'H';
date 介于 '2016-05-10' 和 '2016-05-14' 之間:
SELECT * FROM a where date BETWEEN '2016-05-10' AND '2016-05-14';
(4)and 和or :兩個及以上條件
and:第一條件和第二個條件都成立,顯示一條記錄
or :第一和第二只要一個成立,顯示一條記錄
select * from 表名 where 條件1 and/or 條件2
例:"web" 表中選取 alexa 排名大于 "15" 且國家為 "CN" 或 "USA" 的所有網站
SELECT * FROM web WHERE alexa > 15 AND (country='CN' OR country='USA');
(5)order by :對結果集排序,默認升序ASC,降序用DESC
select * from 表名 order by 列名-----根據某列升序排列
select * from 表名 order by 列名1,列名2---根據列1排序,如果數據相同按照列2排序
(6)top子句:規定返回的記錄數目(不是所有都支持)
sql server/MS Access語法:
select top 數字|percent 列名 from 表名
例:"Customers" 表中選取前面 50% 的記錄
SELECT TOP 50 PERCENT * FROM web;
mysql和oracle用其他方式:
select 列名 from 表名 limit 數字-------mysql
select 列名 from 表名 where rownum<=數字------oracle
(7)別名:為表或列指定別名(使用:不止一個表,使用了函數,列名過長,需要合并多個列)
表:select 列名 from 表名 as 表別名
列:select 列名 as 列表名 from 表名
例:三列(url、alexa 和 country)結合在一起,并創建一個名為 "site_info" 的別名
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info FROM web ;
"web " 和 "access_log" 表,并分別為它們指定表別名 "w" 和 "a"
SELECT w.name, w.url, a.count, a.date FROM web AS w, access_log AS a WHERE a.site_id=w.id and w.name="小三";
(8)join:基于相同字段,將多個表的行結合
inner join:若表至少一個匹配,返回行(inner join=join),沒有不返回
left join :從左表(table1)返回所有行,即使右表(table2)中沒有匹配,若右表沒有匹配,返回null
right join:右表(table2)返回所有的行,即使左表(table1)中沒有匹配。若左表中沒有匹配,則結果為 NULL。
full join:只要其中一個表中有匹配,返回行
(9)union :合并兩個及以上select 語句結果
每個select語句必須有相同數量的列,列有相似的數據類型,列的順序相同
union默認選取不同的值,union all允許重復的值
結果的列名等于union中第一個select語句中的列名
4.插入-----insert into
insert into 表名(列1,列2,列3) values (值1,值2,值3)
id不用插入,是自動更新,唯一標識
5.更新-----update
update------更新(修改)已有數據
update 表名 set 列=值 where 列=條件 (where指定條件更新,無where則全部更新)
6.刪除-----delete
delete from 表名 where 條件-----刪除滿足條件的數據
刪除表中所有行(清空數據):delete from 表名 或 delete * from 表名
還有一種方式:truncate table 表名-------刪除速度快,刪除表中所有內容
drop table 表名:刪除表,連表結構也刪除
7.表復制:select into
復制一張表的數據插入到另一張新表中:create table 新表 select * from 舊表
也可以用select into (mysql不支持,但有insert into .....select)
select * into 新表 from 舊表---------舊表復制備份
select 列名 into 新表 from 舊表---------舊表指定列復制到新表
select * into 新表 from 舊表 where 1=0-------創建一個新的空表(無數據)
8.數據復制:insert into .....select
從一個表復制數據,插入到另一個已存在的表中
insert into 表2 select * from 表1:復制表1所有列到表2
insert into 表2 列名 select 列名 from 表1:復制表1的指定列插入到表2中
9.創建數據庫:create database
create database 數據庫名-----創建一個數據庫
10.創建表:create table
create table 表名(列名1 數據類型(大小),列名2 數據類型(大小)...)
表由行和列組成,每個表必須有表名
11.約束Constraints:用于規定表中的數據規則
若違反規則,行為被約束終止
約束條件可以在建表時規定(create table)、或建表之后(alter table)
create table 表名(列名1 數據類型(大小) 約束條件,列名2......)
sql有以下約束:
not null:指定某列不能存儲null值,即不為空,若無添加值無法更新表
unique:某列的每行必須有唯一的值,每個表可以有多個unique約束
(1)create table時:
單個:create table 表名(id int not null,...,unique (id))-------mysql
create table 表名(id int not null unique,..., )----------其他
多個:create table 表名(id int not null,name varchar(255) not
null,constraint 別名 unique(id,name))
(2)alter table時:
單個:alter table 表名 add unique(列名)
多個:alter table 表名 add constraint 別名 unique(列1,列2)
(3)撤銷 :
alter table 表名 drop index 別名----------mysql
alter table 表名 drop constraint 別名-----------其他
primary key:某列有唯一標識,每個表只能有一個primary key約束
主鍵必須包含唯一的值,主鍵列不能含null值,每個表只能有一個主鍵
(1)create table時:
單個:create table 表名(id int not null,...,primary key (id))---mysql
create table 表名(id int not null primary key,...)-------其他
多個: create table 表名(id int not null ,name varchar not
null,...,constraint pk_id primary key (id,name))-------所有
(這里 其實只有一個主鍵pk_id)
(2)alter table時:
單個:alter table 表名 add primary key(列名)
多個:alter table 表名 add constraint 別名 primary key(列1,列2)
注:必須在建表時把主鍵聲明為不含null
(3)撤銷:
alter table 表名 drop primary key----------mysql
alter table 表名 drop constraint 別名-----------其他
foreign key :外鍵,指向另一個表的primary key
(1)create table時:
單個:create table 表1(id int not null,p_id int...,primary key
(id),foreign key(p_id) peferences 表2 (p_id))----------mysql
create table 表1(id int not null primary key,...,p_id int foreign
key peferences 表2 (p_id))-------其他
(2)alter table時:
單個:alter table 表1 add foreign key(列) references 表2(列)
多個:alter table 表1 add constraint 別名 foreign key(列)
references 表2(列)
(3)撤銷:
alter table 表名 drop foreign key 別名----------mysql
alter table 表名 drop constraint 別名------------其他
check:值符合指定條件,同上分類
(1)create table:
單個:create table 表名 (p_id int not null,...,check (p_id>0))-----mysql
create table 表名 (p_id int not null check (p_id>0),...,)-----其他
多個: create table 表名 (p_id int,city varchar(255),...,constraint 別
名 check (p_id>0 and city='v'))
( 2 ) alter table:
單個:alter table 表名 add check (p_id>0)
多個:alter table 表名 add constraint 別名 check (p_id>0 and city='v')
( 3 )撤銷:
alter table 表名 drop check 別名----------mysql
alter table 表名 drop constraint 別名---------其他
default:默認值
(1)create table:
create table 表名 (...,name varchar(255) default '張三')
( 2 ) alter table:
alter table 表名 alter 列 set default '值'-----mysql
alter table 表名 modify 列 default '值'-----oracle
alter table 表名 alter column 列 set default '值'-----其他
( 3 )撤銷:
alter table 表名 alter 列 drop default----------mysql
alter table 表名 alter column 列 drop default---------其他
12.創建索引:create index------加速搜索、查詢
create index 索引名 on 表名(列名)-----允許重復
create unique index 索引名 on 表名(列名)------唯一索引
13.撤銷刪除:drop -----------------刪除索引、表和數據庫
刪除索引:drop index 索引名 on 表名---------MS Access
drop index 表名.索引名---------sql server
drop index 索引名--------------oracle/db2
alter table 表名 drop index 索引名-----mysql
刪除表:drop table 表名(刪除內容 : truncate table 表名)
刪除數據庫:drop database 數據庫名
14、操作表:alter -----------用于已有表的添加、刪除、修改列
添加列:alter table 表名 add 列名 數據類型
刪除列:alter table 表名 drop colnum 列名
改變列的數據類型:
alter table 表名 alter colnum 列名 數據類型-----sql server
alter table 表名 modify colnum 列名 數據類型-------oracle/mysql
alter table 表名 modify 列名 數據類型------------oracle 10g后
15.主鍵自動生成:auto increment --------每次插入新記錄會自動創建字段的值
create table 表名(id int not null auto_increment,....)----------------mysql
默認開始1,每次加1,若以其他值可用auto_increment,=100
create table 表名(id int identity(1,1) primary key,..)-------------------sql server
identity(10,2)規定id起始為10,每次遞增2
create table 表名(id integer primary key autoincrement,....)-------Access
默認1,每次加1,autoincrement(10,5)以10開始,每次加5
oracle中比較復雜:
首先創建sequence對象:
create sequence 名字 minvalue 1 start with 1 increment by 1 cache 10
然后插入數據的時候:
insert into 表(id,字段2,...)values(名字.nextval,值2,...)
16.null值:不能比較,null和0不等價
is null: select * from 表 where 列 is null
is not null: select * from 表 where 列 is not null
操作null,很多時候運算需要將null轉化成0,所以需要null函數:
isnull(列,0)---------------------------------sql server/MS Access
nvl(列,0)------------------------------------oracle
ifnull(列,0)或coalesce(列,0)----------mysql