SQL簡易複習資料

2021-02-20 小矮子Estelle

SQL

 SQL (Structured Query Language:結構化查詢語言) 是用於管理關係資料庫管理系統(RDBMS)。SQL 的範圍包括數據插入、查詢、更新和刪除,資料庫模式創建和修改,以及數據訪問控制。

SQL對大小寫不敏感。
分號「;」是對每條SQL語句進行分隔。
單引號用來環繞文本值,對數值欄位不需要。

SELECT——從資料庫提取數據;
UPDATE——更新資料庫的數據;
DELETE——從資料庫刪除數據;
INSERT INTO——向資料庫插入新數據;
CREATE DATABASE——創建新資料庫;
ALTER DATABASE——修改資料庫;
CREATE TABLE——創建新表;
ALTER TABLE——改變資料庫表;
DROP TABLE——刪除表;
CREATE INDEX——創建索引;
DROP INDEX——刪除索引;

(1)選擇部分列
SELECT col_1,col_2
FROM table_name
或者
(2)選擇全部列
SELECT *
FROM table_name

SELECT DISTINCT col_1
FROM table_name

SELECT *
FROM table_name
WHERE condition_1

常用的運算符:等於(=);不等於(<>或!=);大於(>);小於(<);大於等於(>=);小於等於(<=);在某個範圍內(BETWEEN);搜索某種模式(LIKE);指定針對某個列的多個可能值(IN)。4. ORDER BY子句
默認按照升序對記錄進行排序。如果需要按照降序對記錄進行排序,您可以使用 DESC 關鍵字。
SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;

ORDER BY 多列的時候,先按照第一個column name排序,再按照第二個column name排序。


5. INSERT INTO子句
INSERT INTO 語句可以有兩種編寫形式。
第一種形式無需指定要插入數據的列名,只需提供被插入的值即可:

INSERT INTO table_name
VALUES (value1,value2,value3,...);

第二種形式需要指定列名及被插入的值:

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

請注意 SQL UPDATE 語句中的 WHERE 子句!WHERE 子句規定哪條記錄或者哪些記錄需要更新。如果您省略了 WHERE 子句,所有的記錄都將被更新!
DELETE FROM table_name
WHERE some_column=some_value;

請注意 SQL DELETE 語句中的 WHERE 子句!WHERE 子句規定哪條記錄或者哪些記錄需要刪除。如果您省略了 WHERE 子句,所有的記錄都將被刪除!
在不刪除表的情況下,刪除表中所有行。DELETE FROM table_name;

高級教程

SELECT TOP/LIMIT/ROWNUM
(1)SQL Server / MS Access 語法
SELECT TOP number|percent column_name(s)
FROM table_name;

(2)MySQL 語法

SELECT column_name(s)
FROM table_name
LIMIT number;

(3)Oracle 語法

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

LIKE操作符
LIKE 操作符用於在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s)
FROM table_name
WHERE column_name (NOT) LIKE pattern;

通配符
(1)%——替代 0 個或多個字符;
(2)_——替代一個字符;
(3)[abcghf]——字符列中的任何單一字符;
(4)[^abcghf]或[!abcghf]——不在字符列中的任何單一字符;
(5)^——以xx開頭;
(6)$——以xx結尾。

舉例:選取 name 以 "G"、"F" 或 "s" 開始的所有網站:
SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';

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

IN和=的異同
同:在WHERE子句後作為篩選條件,都是等於的含義;
異:IN可以規定多個值,而=只能規定一個值。
WHERE column_name IN (value1,value2)
等價於
WHERE column_name=value1 
OR 
column_name=value2

BETWEEN操作符
用於選取介於兩個值之間的數據範圍內的值。這些值可以是數值、文本或者日期。
SELECT column_name(s)
FROM table_name
WHERE column_name (NOT)BETWEEN value1 AND value2;

選取 name 以介於 'A' 和 'H' 之間字母開始的所有網站:
SELECT * FROM Websites
WHERE name BETWEEN 'A' AND 'H';

請注意,在不同的資料庫中,BETWEEN 操作符會產生不同的結果!(需要關注是否包含兩個測試值)

(1)INNER JOIN:如果表中有至少一個匹配,則返回行;

SELECT column_name(s)
FROM table1
(INNER) JOIN table2
ON table1.column_name=table2.column_name;

(2)LEFT (OUTER) JOIN:即使右表中沒有匹配(右表沒有匹配的結果為NULL),也從左表返回所有的行;

SELECT column_name(s)
FROM table1
LEFT (OUTER) JOIN table2
ON table1.column_name=table2.column_name;

(3)RIGHT (OUTER) JOIN:即使左表中沒有匹配(左表沒有匹配的結果為NULL),也從右表返回所有的行;

SELECT column_name(s)
FROM table1
RIGHT (OUTER) JOIN table2
ON table1.column_name=table2.column_name;

(4)FULL (OUTER) JOIN:只要其中一個表中存在匹配,則返回行,FULL OUTER JOIN 關鍵字只要左表(table1)和右表(table2)其中一個表中存在匹配,則返回行。
FULL OUTER JOIN 關鍵字結合了 LEFT JOIN 和 RIGHT JOIN 的結果。

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

在使用JOIN時,ON和WHERE的區別
ON是在生成臨時表時使用的條件,而WHERE是臨時表生成後使用的條件。UNION操作符
用於合併兩個或多個 SELECT 語句的結果集。
SELECT column_name(s) FROM table1
UNION (ALL)
SELECT column_name(s) FROM table2;

默認地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。

SELECT INTO語句
SELECT INTO 語句從一個表複製數據,然後把數據插入到另一個新表中。
SELECT *
INTO newtable [IN externaldb]
FROM table1;

MySQL 資料庫不支持 SELECT ... INTO 語句,但支持 INSERT INTO ... SELECT 。INSERT INTO SELECT語句
從一個表複製數據,然後把數據插入到一個已存在的表中。目標表中任何已存在的行都不會受影響。
INSERT INTO table2
SELECT * FROM table1;

INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;

CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);

常見數據類型:int、archar、integer、decimal、date約束:
(1)NOT NULL - 指示某列不能存儲 NULL 值。
(1.1)添加NOT NULL約束
ALTER TABLE Persons
MODIFY Age int NOT NULL;

(1.2)撤銷NOT NULL約束
ALTER TABLE Persons
MODIFY Age int NULL;

(2)UNIQUE - 保證某列的每行必須有唯一的值。

(2.1)添加UNIQUE約束
ALTER TABLE Persons
ADD UNIQUE (P_Id)

ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)

(2.2)撤銷UNIQUE約束
ALTER TABLE Persons
DROP INDEX uc_PersonID

(3)PRIMARY KEY - NOT NULL 和 UNIQUE 的結合。確保某列(或兩個列多個列的結合)有唯一標識,有助於更容易更快速地找到表中的一個特定的記錄。

(3.1)添加PRIMARY KEY約束
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
註:如果您使用 ALTER TABLE 語句添加主鍵,必須把主鍵列聲明為不包含 NULL 值(在表首次創建時)

(3.2)撤銷PRIMARY KEY約束
ALTER TABLE Persons
DROP PRIMARY KEY

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID

(4)FOREIGN KEY - 保證一個表中的數據匹配另一個表中的值的參照完整性。用於預防破壞表之間連接的行為,也能防止非法數據插入外鍵列,因為它必須是它指向的那個表中的值之一。

(4.1)添加FOREIGN KEY約束
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

(4.2)撤銷FOREIGN KEY約束
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders

(5)CHECK - 保證列中的值符合指定的條件。

(5.1)添加CHECK約束
ALTER TABLE Persons
ADD CHECK (P_Id>0)

ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')

(5.2)撤銷CHECK約束
ALTER TABLE Persons
DROP CONSTRAINT chk_Person

ALTER TABLE Persons
DROP CHECK chk_Person

(6)DEFAULT - 規定沒有給列賦值時的默認值。

MySQL:
(6.1)添加DEFAULT約束
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'

(6.2)撤銷DEFAULT約束
ALTER TABLE Persons
ALTER City DROP DEFAULT

注意:
 UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證;
 PRIMARY KEY 約束擁有自動定義的 UNIQUE 約束;
 每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。添加約束的方式
(1)在創建表時設置;
(2)使用ALTER語句進行添加。CREATE INDEX語句
 在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查找數據。
 更新一個包含索引的表需要比更新一個沒有索引的表花費更多的時間,這是由於索引本身也需要更新。因此,理想的做法是僅僅在常常被搜索的列(以及表)上面創建索引。
創建索引:
CREATE INDEX PIndex
ON Persons (LastName)

CREATE INDEX PIndex
ON Persons (LastName, FirstName)

DROP語句
通過使用 DROP 語句,可以輕鬆地刪除索引、表和資料庫。
DROP DATABASE database_name
DROP TABLE table_name
DROP INDEX index_name

如果我們僅僅需要刪除表內的數據,但並不刪除表本身,那麼我們該如何做呢?

TRUNCATE TABLE table_name

DELETE (*) FROM table_name

ALTER語句
ALTER TABLE 語句用於在已有的表中添加、刪除或修改列。
添加列
ALTER TABLE table_name
ADD column_name datatype
刪除列
ALTER TABLE table_name
DROP COLUMN column_name

AUTO INCREMENT欄位
希望在每次插入新記錄時,自動地創建主鍵欄位的值。
CREATE TABLE Persons
(
ID Integer PRIMARY KEY AUTOINCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

視圖View
視圖是虛擬表,視圖中的欄位就是來自一個或多個資料庫中的真實的表中的欄位。
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

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

撤銷視圖:

DROP VIEW view_name

NULL
無法使用比較運算符來測試 NULL 值,比如 =、< 或 <>。我們必須使用 IS NULL 和 IS NOT NULL 操作符。NULL函數
ISNULL() 函數用於規定如何處理 NULL 值。NVL()、IFNULL() 和 COALESCE() 函數也可以達到相同的結果。
SQL Server / MS Access舉例:
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products

Oracle舉例:
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products

MySQL舉例:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products

SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products

一些常用的知識庫
日期函數:https://www.runoob.com/sql/sql-dates.html
通用數據類型:https://www.runoob.com/sql/sql-datatypes-general.html

相關焦點

  • 五年級數學《簡易方程》整理與複習,內容全覆蓋,複習很有用
    對於方程的學習,從小學的簡易方程開始,到一元一次方程,再到二元一次方程,再到一元二次方程,是一個逐漸深化學習的過程。當然,學習難度也是逐級增加,但它們還是有很多相通的地方。所以要學好方程,就得從最簡易方程開始,打下紮實的基礎。
  • sql server 帶列名導出至excel
    --鄒建 2003.10--*/ /*--調用示例 p_exporttb @sqlstr=’select * from 地區資料』,@path=』c:\』,@fname=』aa.xls』,@sheetname=』地區資料』--*/if exists (select
  • 五年級數學:第五單元簡易方程整理與複習
    第五單元簡易方程這一單元,涉及的知識點很多,難度也很大,學生理解起來比較困難,尤其是解方程和用方程解決問題的時候很多學生在 學習之後還是找不到頭緒,這裡我們總得來複習一下第五單元簡易方程。簡易方程不僅僅是五年級要掌握的內容,在六年級、初中、高中解方程都是一大重點和難點,所以一定不能把解方程這一環節落下來了。本單元學習時分了兩大塊內容:用字母表示數和解簡易方程。下面我們就分這兩大塊一起來複習鞏固一下。第一部分:用字母表示數。
  • 一場pandas與SQL的巔峰大戰(七)
    這一部分我們來看下pandas直接操作資料庫的例子,主要學習read_sql和to_sql的用法。read_sql這個函數的作用是,對資料庫中的表運行SQL語句,將查詢結果以dataframe的格式返回。
  • MySQL怎麼刪除#sql開頭的臨時表
    處理方法3.1   同時存在.frm 和.ibd名稱相同的文件如果 #sql-*.ibd 和 #sql-*.frm兩個文件都存在數據目錄裡的話,可以直接drop table。但注意刪除時候表名的變化。下面處理截圖中#sql-ib1516-2335726735.ibd文件,步驟如下:a) 創建一張與#sql-ib1516- 2335726735 相同的表root@testdb 08:47:35>create table company20191216 likecompany;Query OK, 0 rows affected
  • SQL update批量更新
    首先回顧下,sql update語句是用於修改表中的數據。
  • 初中英語寫作專項複習資料,記熟這些經典句子,不怕老師不給高分
    初中英語寫作專項複習資料,記熟這些經典句子,不怕老師不給高分如何提升初中生的英語寫作水平呢?小編老師認為高度重視,樹立信心,培養寫作興趣是關鍵。初一經常進行簡易而有趣的看圖寫話,讓學生感到學英語的樂趣;初二開始可根據教學進程及相關單元課文內容,以不同形式編寫短文,讓學生寫他們感興趣、有意義的人和事。並逐漸養成每周一篇的寫作習慣。如教學了JEFC Book2 Unit15 What do people eat? 可布置學生寫關於中國食品的內容(Chinese Food)可提供短文的開頭或一些重要詞。
  • 產品經理學SQL(二)一天學會用SQL解決業務查詢問題
    本篇文章意在幫助大家系統地入門SQL,教大家如何解決sql查詢任務。前言回顧一下,上一篇文章我們已經知道了SQL語言的基本框架,並能完成簡單的單表查詢和雙表連接查詢。這篇文章希望能幫助你系統地入門SQL,從而解決產品經理80%的sql查詢任務。和上篇的一個小時入門SQL一樣,這篇文章的建議學習時間為一天。
  • MySQL sql_mode 說明(及處理一起 sql_mode 引發的問題)
    先 set global sql_mode='' ,讓他們用著先(文後會給解決問題根本的辦法),同時打開general_log看是哪一個用戶有類似設置 sql_mode 命令:12341134456 Query   SET autocommit=11134456 Query   Set sql_mode
  • Mybatis的sql組裝詳解
    上一篇分析了SqlSession執行sql的過程,其中並沒有分析sql是從哪裡來的,今天就來仔細分析下。Sql來源從上一篇的最後一步執行sql那裡倒推sql的來源,源碼主要過程如下圖:可以看到最後是通過BoundSql直接獲取的sql,然後往前倒推最後發現是通過MappedStatement的getBoundSql方法返回的。
  • sql子查詢面試題
    題目來自sqlzoo的子查詢題目。網址:https://sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial/zh這部分題目使用的是world表:世界國家信息表(有些國家的記錄中,GDP是空值NULL,沒有填入資料)【知識點】all的用法,子查詢,條件中gdp>0用來去掉空值的情況select name from worldwhere gdp > all(select gdp from worldwhere continent = 'Europe' and gdp > 0);
  • SQL 語句中 where 條件後 寫上 1=1 是什麼意思
    例如:  String sql="select * from table_name where 1=1";  if( conditon 1) {  sql=sql+" and var2=value2";  }  if(conditon 2) {  sql=sql+" and var3=value3";
  • SQL資料庫常見故障及解決方法
    但是由於一些故障原因,會造成sql資料庫損壞,數據丟失。本文就主要談談幾種sql資料庫幾種常見故障以及sql資料庫碎片恢復技術。  SQL資料庫「823」錯誤  故障表現:由於緩衝數據丟失,資料庫無法寫入正確的數據,導致數據結構紊亂,重啟後資料庫無法正常附加,附加資料庫文件MDF及日誌文件LDF時,報「823」錯誤。
  • 手撕SQL | 必知必會5道SQL面試題
    愛數據曉輝 | 作者愛數據學院8月SQL月考題 | 來源附本次sql>表列名含義如下:name:國家名稱continent :該國家屬於哪個洲area:⾯積population:⼈⼝gdp:國內⽣產總值請用sql
  • 2020年廣東醫療衛生結構化面試資料:簡述簡易呼吸器的使用
    廣東衛生人才網同步廣東衛生人才網備考資料信息:2020年廣東醫療衛生結構化面試資料:簡述簡易呼吸器的使用,請考生多加關注。更多廣東醫療衛生面試資料,廣東醫療衛生考試,廣東人事考試的內容,請關注廣東衛生人才網備考資料頻道/廣東人事考試網!
  • 上海公司簡易註銷的資料、流程
    公司簡易註銷,真的就簡單多嗎?簡易註銷有什麼條件?什麼樣的企業可以走簡易註銷手續?簡易註銷,主要是針對成立三年以內,沒有核稅,或者稅務一直零申報的企業,可以走簡易註銷手續,但是工商也沒有明確的規定,所以針對一些零申報的企業,也可以嘗試走簡易註銷,但一旦被駁回,就需要重新登報,重新走流程對於簡易註銷的流程來講,都差不多,無非就是不需要登報紙,但還是需要進行辦理網上公示45天,沒有核稅的也要進行稅務登記後,才能辦理註銷流程。
  • python數據分析我覺得可以用pandasql,真香!
    請看~下載、導入第三方庫下載:python -m pip install pandasql導入:from pandasql import sqldf,load_births,load_meat1from pandasql import sqldf,load_births,load_meat加載內置數據集1df1 = load_births
  • SQL 語句中 where 條件後 寫上 1=1 是什麼意思?
    例如:String sql="select * from table_name where 1=1";if( conditon 1) {  sql=sql+"  and  var2=value2";}if(conditon 2) {  sql=sql+"  and var3=value3";
  • MyBatis 動態 SQL 詳解(以後寫 SQL 爽多了)
    先來看看第一個動態SQL標籤——if,通過if標籤,我們能夠根據我們傳遞的參數進行動態查詢,比如:根據id查詢員工信息,若是攜帶了哪個參數sql的條件就要帶上這個參數對應的欄位的值。==> Parameters: %c%(String), jack@qq.com(String)因為id為null,所以後面的and被直接拼在了where的後面,此時sql語法就會出錯,為此我們需要使用另一個標籤——where,它能夠完美地解決這一問題。
  • Sql盲注學習筆記1
    payload='id=0 or if((select ascii(substr(({substr_sql} limit {limit_offset},1),{substr_offset},1))={ascii_num}),1,0)'column_content=''column_contents=[]#通過字典的形式關聯起來 列表中第一個元素表示對應的表的列數