SQL基礎(chǔ)
SQL 簡(jiǎn)介
SQL是用于訪問和處理數(shù)據(jù)庫的標(biāo)準(zhǔn)的計(jì)算機(jī)語言
SQL是什么?
- SQL堪滨,指結(jié)構(gòu)化查詢語言赖阻,全稱是 Structured Query Language浊闪。
- SQL 讓您可以訪問和處理數(shù)據(jù)庫。
- SQL 是一種 ANSI(American National Standards Institute 美國國家標(biāo)準(zhǔn)化組織)標(biāo)準(zhǔn)的計(jì)算機(jī)語言感憾。
SQL能做什么?
- SQL 面向數(shù)據(jù)庫執(zhí)行查詢
- SQL 可從數(shù)據(jù)庫取回?cái)?shù)據(jù)
- SQL 可在數(shù)據(jù)庫中插入新的記錄
- SQL 可更新數(shù)據(jù)庫中的數(shù)據(jù)
- SQL 可從數(shù)據(jù)庫刪除記錄
- SQL 可創(chuàng)建新數(shù)據(jù)庫
- SQL 可在數(shù)據(jù)庫中創(chuàng)建新表
- SQL 可在數(shù)據(jù)庫中創(chuàng)建存儲(chǔ)過程
- SQL 可在數(shù)據(jù)庫中創(chuàng)建視圖
- SQL 可以設(shè)置表回右、存儲(chǔ)過程和視圖的權(quán)限
常用的MySQL管理命令:
- USE Databasename 用于在MySQL工作區(qū)內(nèi)選擇具體某個(gè)數(shù)據(jù)庫斤蔓。
- SHOW DATABASES 列出 MySQL DBMS 所能訪問的數(shù)據(jù)庫植酥。
- SHOW TABLES 一旦數(shù)據(jù)庫被 use 命令選中,顯示數(shù)據(jù)庫中的表附迷。
- SHOW COLUMNS FROM tablename 顯示表的屬性惧互、屬性類型、鍵信息喇伯、是否允許 NULL 值,默認(rèn)值拨与,以及其他一些信息稻据。
- SHOW INDEX FROM tablename 顯示表中所有索引的細(xì)節(jié)信息,包括PRIMARY KEY买喧。
- SHOW TABLE STATUS LIKE tablename\G 報(bào)告MySQL DBMS的性能及統(tǒng)計(jì)的細(xì)節(jié)信息捻悯。
SQL SELECT
SELECT語句用于從數(shù)據(jù)庫中選取數(shù)據(jù),結(jié)果被存儲(chǔ)在一個(gè)結(jié)果表中,稱為結(jié)果集
SQL SELECT IDSTINCT
返回唯一不同的值(去除重復(fù)的值).
SQL WHERE
用于過濾記錄.
WHERE字句中的運(yùn)算符
運(yùn)算符 | 描述 |
---|---|
= | 等于 |
<> | 不等于。注釋:在 SQL 的一些版本中淤毛,該操作符可被寫成 != |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某個(gè)范圍內(nèi) |
LIKE | 搜索某種模式 |
IN | 指定針對(duì)某個(gè)列的多個(gè)可能值 |
特殊條件
- 空值判斷: is null
- between and (在 ... 之間的值)
- in
- like
SQL AND & OR
ORDER BY 用于對(duì)結(jié)果集進(jìn)行排序
默認(rèn)按照升序?qū)τ涗涍M(jìn)行排序.
- DESC 升序
- ASC 降序
SQL INSERT INTO
用于向表中插入新記錄今缚。
INSERT INTO 語句可以有兩種編寫形式。
第一種形式無需指定要插入數(shù)據(jù)的列名低淡,只需提供被插入的值即可:
INSERT INTO table_name
VALUES (value1,value2,value3,...);
第二種形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
SQL UPDATE
用于更新表中已經(jīng)存在的記錄
SQL DELETE
用于刪除表中已經(jīng)存在的記錄
SQL 高級(jí)函數(shù)
SQL SELECT TOP
MySQL中 TOP 無效.
MySQL語法:
SELECT column_name(s) FROM table_name LIMIT number;
Oracle 語法
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;
SQL SELECT TOP PERCENT 示例: 使用百分比作為參數(shù)
SELECT TOP 50 PERCENT * FROM Websites;
SQL LIKE
搜索列中的制定模式
SQL LIKE 語法
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;
SQL 通配符
通配符用于替換字符串中任何其他字符
MySQL中使用REGEXP或NOT REGEXP運(yùn)算符(或者LIKE和NOT LIKE)來操作正則表達(dá)式
SQL中可以使用一下通配符
通配符 | 描述 |
---|---|
% | 替代0個(gè)或者多個(gè)字符 |
- | 替代一個(gè)字符 |
[charlist] | 字符列中的任何單一字符 |
[^charlist]或者[!charlis] | 不在字符列中的任何單一字符 |
SQL IN
SQL BETWEEN
SQL BETWEEN 語法(兩頭都包括):
BETWEEN 操作符選取介于兩個(gè)值之間的數(shù)據(jù)范圍內(nèi)的值姓言。這些值可以是數(shù)值、文本或者日期蔗蹋。
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
NOT BETWEEN , NOT IN: 不在范圍內(nèi)
SQL 別名
通過使用SQL,可以為表名或者列名指定列名.基本上何荚,創(chuàng)建別名是為了讓列名稱的可讀性更強(qiáng)。
將多個(gè)列和在一起:
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info
FROM Websites;
在下面的情況下猪杭,使用別名很有用:
- 在查詢中涉及超過一個(gè)表
- 在查詢中使用了函數(shù)
- 列名稱很長(zhǎng)或者可讀性差
- 需要把兩個(gè)列或者多個(gè)列結(jié)合在一起
SQL 連接(JOIN)
SQL join 用于把來自兩個(gè)或者多個(gè)表的行結(jié)合起來.
在我們繼續(xù)講解實(shí)例之前餐塘,我們先列出您可以使用的不同的 SQL JOIN 類型:
- INNER JOIN:如果表中有至少一個(gè)匹配,則返回行
- LEFT JOIN:即使右表中沒有匹配皂吮,也從左表返回所有的行
- RIGHT JOIN:即使左表中沒有匹配戒傻,也從右表返回所有的行
- FULL JOIN:只要其中一個(gè)表中存在匹配税手,則返回行
1.SQL INNER JOIN 語法
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;
注釋:INNER JOIN 與 JOIN 是相同的。
2. SQL LEFT JOIN 語法
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
注釋:在某些數(shù)據(jù)庫中需纳,LEFT JOIN 稱為 LEFT OUTER JOIN冈止。
3. SQL RIGHT JOIN 語法
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;
注釋:在某些數(shù)據(jù)庫中,RIGHT JOIN 稱為 RIGHT OUTER JOIN候齿。
4. SQL FULL OUTER JOIN 語法
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
SQL UNION 操作符
SQL UNION 操作符合并兩個(gè)或者多個(gè)SELECT語句的結(jié)果,
注意: UNION內(nèi)部的每個(gè)SELECT語句必須擁有相同數(shù)量的列.列也必須擁有相似的數(shù)據(jù)類型.同事每個(gè)SELECT語句中的列的順序也必須相同.
SQL UNION 語法
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
注釋:默認(rèn)地熙暴,UNION 操作符選取不同的值。如果允許重復(fù)的值慌盯,請(qǐng)使用 UNION ALL周霉。
SQL UNION ALL 語法
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
注釋:UNION 結(jié)果集中的列名總是等于 UNION 中第一個(gè) SELECT 語句中的列名。
SQL SELECT INTO 語句
通過SQL,您可以從一個(gè)表復(fù)制信息到另一個(gè)表.
MySQL 數(shù)據(jù)庫不支持 SELECT ... INTO 語句亚皂,但支持 INSERT INTO ... SELECT 俱箱。
當(dāng)然你可以使用以下語句來拷貝表結(jié)構(gòu)及數(shù)據(jù):
CREATE TABLE 新表 SELECT * FROM 舊表
SQL INSERT INTO SELECT 語句
INSERT INTO SELECT 語句從一個(gè)表復(fù)制數(shù)據(jù),然后把數(shù)據(jù)插入到一個(gè)已存在的表中灭必。目標(biāo)表中任何已存在的行都不會(huì)受影響狞谱。
SQL INSERT INTO SELECT 語法
我們可以從一個(gè)表中復(fù)制所有的列插入到另一個(gè)已存在的表中:
INSERT INTO table2
SELECT * FROM table1;
或者我們可以只復(fù)制希望的列插入到另一個(gè)已存在的表中:
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;
SQL CREATE DATABASE 語句
用于創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE dbname;
SQL CREATE TABLE 語句
CREATE TABLE 語句用于創(chuàng)建數(shù)據(jù)庫中的表。
實(shí)例
CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
SQL 約束
SQL約束用于規(guī)定表中的數(shù)據(jù)規(guī)則.
在SQL中有如下約束:
- NOT NULL -只是某列不能存儲(chǔ)null值
- UNIQUE - 保證某列的每行必須有唯一的值
- PRIMARY KEY - NOT NULL 和 UNIQUE 的結(jié)合,確保某列的值有唯一標(biāo)識(shí),有助于更快速的找到表中的一個(gè)特定的記錄.
- FOREIGN KEY -保證一個(gè)表中的數(shù)據(jù)匹配到另一個(gè)表中的值得參照完整性.
- CHECK -保證列中的值負(fù)荷指定的條件.
- DEFAULT - 規(guī)定沒有給列賦值時(shí)的默認(rèn)值.
ALERT TABLE 時(shí)的 SQL約束(修改約束)
當(dāng)表已被創(chuàng)建時(shí)禁漓,如需在 "P_Id" 列創(chuàng)建 UNIQUE 約束跟衅,請(qǐng)使用下面的 SQL:
ALTER TABLE Persons
ADD UNIQUE (P_Id)
撤銷約束
如需撤銷 UNIQUE 約束,請(qǐng)使用下面的 SQL:
MySQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
SQL CREATE INDEX
用于創(chuàng)建索引.在不讀取整表的情況下,索引使數(shù)據(jù)庫應(yīng)用程序可以更快的查找數(shù)據(jù).
注釋:更新一個(gè)包含索引的表需要比更新一個(gè)沒有索引的表花費(fèi)更多的時(shí)間播歼,這是由于索引本身也需要更新伶跷。因此,理想的做法是僅僅在常常被搜索的列(以及表)上面創(chuàng)建索引秘狞。
CREATE INDEX 實(shí)例
下面的 SQL 語句在 "Persons" 表的 "LastName" 列上創(chuàng)建一個(gè)名為 "PIndex" 的索引:
CREATE INDEX PIndex
ON Persons (LastName)
如果您希望索引不止一個(gè)列叭莫,您可以在括號(hào)中列出這些列的名稱,用逗號(hào)隔開:
CREATE INDEX PIndex
ON Persons (LastName, FirstName)
SQL CREATE UNIQUE INDEX 語法:在表上創(chuàng)建一個(gè)唯一的索引烁试。不允許使用重復(fù)的值:唯一的索引意味著兩個(gè)行不能擁有相同的索引值.
SQL DROP
使用DROP語句,刪除索引,表和數(shù)據(jù)庫.
- 刪除數(shù)據(jù)庫
DROP DATABASE database_name
- 刪除表
DROP TABLE table_name
- 刪除索引
ALTER TABLE table_name DROP INDEX index_name
- TRUNCATE TABLE 語句(清空表內(nèi)數(shù)據(jù))
TRUNCATE TABLE table_name
SQL ALTER TABEL語句
用于在已有的表中添加,刪除或者修改列.
- 添加列
ALTER TABLE table_name
ADD column_name datatype
- 刪除列
ALTER TABLE table_name
DROP COLUMN column_name
- 修改列的數(shù)據(jù)類型
ALTER TABLE table_name
MODIFY COLUMN column_name datatype
SQL AUTO INCREMENT 字段
自增的字段.
- 設(shè)置表內(nèi)自增字段起始值
ALTER TABLE Persons AUTO_INCREMENT=100
SQL 視圖.
可以理解為對(duì)查詢的封裝;
- 添加視圖
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
- 刪除視圖
DROP VIEW view_name
- 修改視圖
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
使用視圖
select * from view_name;
SQL 日期
MySQL 使用下列數(shù)據(jù)類型在數(shù)據(jù)庫中存儲(chǔ)日期或日期/時(shí)間值:
- DATE - 格式:YYYY-MM-DD
- DATETIME - 格式:YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
- YEAR - 格式:YYYY 或 YY
日期函數(shù):
函數(shù) | 描述 |
---|---|
NOW() | 返回當(dāng)前的日期和時(shí)間 |
CURDATE() | 返回當(dāng)前的日期 |
CURTIME() | 返回當(dāng)前的時(shí)間 |
DATE() | 提取日期或日期/時(shí)間表達(dá)式的日期部分 |
EXTRACT() | 返回日期/時(shí)間的單獨(dú)部分 |
DATE_ADD() | 向日期添加指定的時(shí)間間隔 |
DATE_SUB() | 從日期減去指定的時(shí)間間隔 |
DATEDIFF() | 返回兩個(gè)日期之間的天數(shù) |
DATE_FORMAT() | 用不同的格式顯示日期/時(shí)間 |
SQL NULL
NULL代表遺漏的未知數(shù)據(jù). 使用 IS NULL 和 NOT IS NULL 作為篩選條件.
- IS NULL
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
- IS NOT NULL
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
SQL NULL 函數(shù)
MySQL中使用IFNULL()函數(shù).當(dāng)所選字段值為NULL時(shí) 給予默認(rèn)值.
SELECT (1+IFNULL(fee,0))as a from ss_order
SQL 函數(shù)
SQL Aggregate 函數(shù)
SQL Aggregate 函數(shù)計(jì)算從列中取得的值雇初,返回一個(gè)單一的值。
有用的 Aggregate 函數(shù):
- AVG() - 返回平均值
- COUNT() - 返回行數(shù)
- FIRST() - 返回第一個(gè)記錄的值
- LAST() - 返回最后一個(gè)記錄的值
- MAX() - 返回最大值
- MIN() - 返回最小值
- SUM() - 返回總和
- SQL Scalar 函數(shù)
SQL Scalar 函數(shù)基于輸入值减响,返回一個(gè)單一的值靖诗。
有用的 Scalar 函數(shù):
- UCASE() - 將某個(gè)字段轉(zhuǎn)換為大寫
- LCASE() - 將某個(gè)字段轉(zhuǎn)換為小寫
- MID() - 從某個(gè)文本字段提取字符
- LEN() - 返回某個(gè)文本字段的長(zhǎng)度
- ROUND() - 對(duì)某個(gè)數(shù)值字段進(jìn)行指定小數(shù)位數(shù)的四舍五入
- NOW() - 返回當(dāng)前的系統(tǒng)日期和時(shí)間
- FORMAT() - 格式化某個(gè)字段的顯示方式