SQL高級教程


一、top子句

top子句用於規定要返回的記錄的數目

並非所有數據庫系統都支持top子句

# sqlserver
SELECT TOP number|percent column_name(s) FROM table_name

# mysql
SELECT column_name(s) FROM table_name LIMIT number

# oracle
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number

sqlserver top percent實例

# 選取50%內容

SELECT TOP 50 PERCENT * FROM persons

二、like操作符實例

# 例1
# 從 "Persons" 表中選取居住在以 "N" 開始的城市里的人:
SELECT * FROM Persons WHERE City LIKE 'N%'

# 從 "Persons" 表中選取居住在以 "g" 結尾的城市里的人:
SELECT * FROM Persons WHERE City LIKE '%g'

# 從 "Persons" 表中選取居住在不包含 "lon" 的城市里的人:
SELECT * FROM Persons WHERE City NOT LIKE '%lon%'

三、通配符

# 從上面的 "Persons" 表中選取名字的第一個字符之后是 "eorge" 的人
SELECT * FROM Persons WHERE FirstName LIKE '_eorge'

# 從上面的 "Persons" 表中選取居住的城市以 "A" 或 "L" 或 "N" 開頭的人
SELECT * FROM Persons WHERE City LIKE '[ALN]%'

# 從上面的 "Persons" 表中選取居住的城市不以 "A" 或 "L" 或 "N" 開頭的人
SELECT * FROM Persons WHERE City LIKE '[!ALN]%'

 四、SQL IN操作符

SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)

五、 BETWEEN

# BETWEEN 操作符在 WHERE 子句中使用,作用是選取介於兩個值之間的數據范圍
# 操作符 BETWEEN ... AND 會選取介於兩個值之間的數據范圍。這些值可以是數值、文本或者日期。
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2

# 顯示范圍之外的人
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'

六、 SQL Alias(別名)

# 通過使用 SQL,可以為列名稱和表名稱指定別名(Alias)

# 表的別名用法
SELECT column_name(s) FROM table_name AS alias_name
# 列的別名用法
SELECT column_name AS alias_name FROM table_name

# 假設我們有兩個表分別是:"Persons" 和 "Product_Orders"。我們分別為它們指定別名 "p" 和 "po"。
SELECT PO.orderID, p.lastname, p.firstname FROM Persons AS p, Product_orders AS po WHERE p.LastName='Adams' AND p.FirstName='John'

# 使用一個列名別名
SELECT LastName AS Family, FirstName AS Name FROM Persons

七、 JOIN

# join用於根據兩個或多個表中的列之間的關系,從這些表中查詢數據
# 數據庫的表可通過鍵將彼此聯系起來

# 可以通過引用兩個表的方式來獲取數據
SELECT persons.lastname, persons.firstname, orders.orderNO FROM persons,orders
WHERE persons.ID = orders.ID

# 使用關鍵詞 JOIN 來從兩個表中獲取數據
SELECT persons.lastname, persons.firstname, orders.orderNO FROM persons
INNER JOIN orders ON persons.ID = orders.ID ORDERBY persons.lastnam
# 不同的SQL JOIN
上面使用的INNER JOIN(內連接)

還有這些join類型
JOIN: 如果表中至少一個匹配,則返回行
LEFT_JOIN: 即使右表中沒有匹配,也從左表返回所有的行
RIGHT_JOIN: 即使左表中沒有匹配,也從右表返回所有的行
FULL JOIN: 只要其中一個表存在匹配,就返回行

八、INNER JOIN

# 當表中至少存在一個匹配時, inner join關鍵字返回行, inner join和join是相同的

SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

九、LEFT JOIN

# left join 關鍵字會從左表那里返回所有的行,即使在右表中沒有破匹配的行

SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

十、RIGHT JOIN

# RIGHT JOIN 關鍵字會右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中沒有匹配的行。

SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

十一、FULL JOIN

# 只要其中某個表存在匹配, FULL JOIN關鍵字就會返回行
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

十二、 UNION 和 UNION ALL 操作符

# UNION 操作用於合並兩個或多個select 語句的結果集

# union
# 默認的,union操作符選取不同的值,如果允許重復的值,應該使用union all
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

# union all
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

十三、select into

# select into語句用於創建表的備份復件
# select into從一個表中選取數據,然后插入另一個表

# 把所有列插入新表
SELECT *
INTO new_table_name [IN externaldatabase] 
FROM old_tablename

# 只把希望的列插入新表
SELECT column_name(s)
INTO new_table_name [IN externaldatabase] 
FROM old_tablename

# 下面的例子會制作 "Persons" 表的備份復件:
SELECT *
INTO Persons_backup
FROM Persons

# IN 子句可用於向另一個數據庫中拷貝表:
SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons

十四、CREATE DB

# 創建數據庫
CREATE DATABASE dzp;

# 查看數據庫
SHOW DATABASES;

# 查看當前數據庫
select database();

CREATE DATABASE IF NOT EXISTS t1;
SHOW WARNNINGS;

 十五、create table

 

CREATE TABLE 表名稱
(
列名稱1 數據類型,
列名稱2 數據類型,
列名稱3 數據類型,
....
)

# 例子
CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

 十六、約束 constraints

# 約束用於限制加入表的數據的類型
# 可以在創建表的時候規定約束,通過CREATE TABLE語句創建
# 或者在表創建之后也可以,通過ALTER TABLE語句修改

# 有以下幾種約束
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT

十七、NOT NULL

# NOT NULL約束強制列不接受null值,強制字段始終包含值
# 這就意味着,如果不向字段添加值,就無法插入新記錄或者是修改記錄

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

 

十八、UNIQUE約束

# UNIQUE 約束唯一表示數據庫表中的每條記錄
# UNIQUEPRIMARY KEY約束均為列或列集合提供了唯一性的保證
# PRIMARY KEY擁有自動定義的UNIQUE約束
# 注意!!每個表可以有多個UNIQUE約束,但是每個表只能有一個PRIMARY KEY約束

# Mysql 創建UNIQUE約束
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)

 

十九、primary key 主鍵約束

# primary key約束唯一表示數據庫表中的每條記錄
# 主鍵必須包含唯一的值
# 主鍵列不能包含null值
# 每個表都應該有一個主鍵,並且每個表只能有一個主鍵

# mysql 創建表的時候創建主鍵
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)

# mysql / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

# 表已存在的時間添加主鍵,如果您使用 ALTER TABLE 語句添加主鍵,必須把主鍵列聲明為不包含 NULL 值(在表首次創建時)
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)
# 撤銷主鍵約束
ALTER TABLE Persons
DROP PRIMARY KEY

 

二十、外鍵約束 FOREIGN KEY

# 父表 persons 子表 orders
# persons中的Id_P是父表的primary key
# orders中的Id_P是字表中的foreign key

# 外鍵約束用於預防破壞表之間連接的動作
# 外鍵約束也能預防非法數據插入外鍵列,因為他必須指向父表中的值之一

# 在創建子表的時候創建外鍵

CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES persons(Id_P)
}

# 在子表已經存在的情況下創建外鍵約束
ALTER TABLE ORDERS ADD FOREIGN KEY(Id_P) REFERENCES persons (
Id_P)

# 如果需要命名FOREIGN KEY約束,以及為多個列定義外鍵約束
ALTER TABLE orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)

# 撤銷外鍵約束
ALTER TABLE orders DROP FOREIGN KEY fk_PerOrders

二十一、check 約束

# CHECK 約束用於限制列中的值的范圍。
mysql> CREATE TABLE persons(
    -> Id_P int NOT NULL CHECK (Id_P>0),
    -> Lastname VARCHAR(255) NOT NULL,
    -> Firstname VARCHAR(255),
    -> Address VARCHAR(255),
    -> city VARCHAR(255)
    -> );
Query OK, 0 rows affected (0.02 sec)

# 定義多個列CHECK約束
mysql> CREATE TABLE persons1(
    -> Id_P int NOT NULL,
    -> LastName varchar(255) NOT NULL,
    -> City varchar(255),
    -> CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
    -> );
Query OK, 0 rows affected (0.03 sec)

# 已存在表,為Id_P創建CHECK約束
ALTER TABLE Persons ADD CHECK(Id_P>0)
# 為多個列創建CHECK約束
ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')

# 撤銷CHECK約束
ALTER TABLE Persons DROP CHECK chk_Perso

 二十二、DEFAULT約束

# detault約束
# default約束用於向列中插入默認值

# 
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)

# 通過使用類似 GETDATE() 這樣的函數,DEFAULT 約束也可以用於插入系統值:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)

# 如果在表已存在的情況下為 "City" 列創建 DEFAULT 約束

ALTER TABLE Orders ALTER City SET DEFAULT 'Fuzhou'

# 撤銷default
ALTER TABLE Orders ALTER City DROP DEFAULT

二十三、 CREATE INDEX 索引

# create index語句用於在表中創建索引
# 在不讀取整個表的情況下,索引使數據庫應用程序可以更快的查找數據

# 可以在表中創建索引,一遍更加快速高效的查詢數據
# 用戶無法看到索引,他們只能用來加速搜索/查詢

#更新一個包含索引的表需要比更新一個沒有索引的表 要花更多的時間,這是因為索引本身也需要更新,因此理想的做法是:僅僅在常常被搜索的列(以及表)上面創建索引

# 語法
在表上創建一個簡單的索引,允許使用重復的值, column_name對頂需要索引的列
CREATE INDEX index_name ON table_name (column_name)

# 創建唯一索引
CREATE UNIQUE INDEX index_name ON table_name (column_name)

# 創建索引
CREATE INDEX PersonIndex
ON Person (LastName) 

# 降序索引某個列中的值,在列名稱之后添加保留字 DESC
CREATE INDEX PersonIndex
ON Person (LastName DESC) 

# 索引不止一個列可以在括號中列出這些列的名稱,用逗號隔開:
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)

二十四、DROP語句

# 通過使用 DROP 語句,可以輕松地刪除索引、表和數據庫。

ALTER TABLE table_name DROP INDEX index_name

DROP TABLE 表名稱

DROP DATABASE 數據庫名稱


# 如果我們僅僅需要除去表內的數據,但並不刪除表本身,那么我們該如何做呢?
# truncate table 表名稱
# 僅僅是刪除表格中的數據
TRUNCATE TABLE 表名稱

 

二十五、ALTER語句

# 添加
ALTER TABLE table_name
ADD column_name datatype

# 刪除
ALTER TABLE table_name
DROP column_name datatype

# 在表 "Persons" 中添加一個名為 "Birthday" 的新列
ALTER TABLE Persons ADD  Birthday date

# 改變 "Persons" 表中 "Birthday" 列的數據類型
ALTER TABLE Persons  ALTER CLOUMN Birthday year

# 刪除 "Person" 表中的 "Birthday" 列
ALTER TABLE Persons DROP COLUMN Birthday

二十六、AUTO_INCREMENT

# 我們通常希望在每次插入新記錄時,自動地創建主鍵字段的值

CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

MySQL 使用 AUTO_INCREMENT 關鍵字來執行 auto-increment 任務。
默認地,AUTO_INCREMENT 的開始值是 1,每條新記錄遞增 1。
要讓 AUTO_INCREMENT 序列以其他的值起始,請使用下列 SQL 語法:

ALTER TABLE Persons AUTO_INCREMENT=100

二十七、視圖 VIEW

# 如何創建、更新和刪除視圖。
# 視圖是基於SQL語句結果集的可視化的表
# 視圖包含行和列,就像一個真實的表。視圖中的字段就是來自一個或多個數據庫中的真實的表中的字段。我們可以向視圖添加 SQL 函數、WHERE 以及 JOIN 語句,我們也可以提交數據,就像這些來自於某個單一的表。

# 數據庫的設計和結構不會受到視圖中的函數、wherejoin 語句的影響

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

# 使用以下語法來更新視圖
SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition


# DROP VIEW 命令來刪除視圖
SQL DROP VIEW Syntax
DROP VIEW view_name

DROP VIEW IF EXISTS view_name

 

二十八、mysql數據類型

# mysql中有三種主要的類型:文本、數字、日期/時間

# text類型
CHAR(size) 
VARCHAR(size)  
TINYTEXT  存放最大長度為 255 個字符的字符串
ENUM(x,y,z,etc.) 允許你輸入可能值的列表。可以在 ENUM 列表中列出最大 65535 個值。如果列表中不存在插入的值,則插入空值。(枚舉)

# Number類型
TINYINT(size)
SMALLINT(size)
INT(size)
BIGINT(size)
FLOAT(size,d)
DOUBLE(size,d)

# date類型
DATE()
TIMESTAMP()
TIME()
YEAR()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM