SQL必知必會筆記(1-6)

生成數(shù)據(jù)庫表和數(shù)據(jù)的SQL文件

第1課:了解SQL

1、數(shù)據(jù)庫基礎

  • 數(shù)據(jù)庫(database):保存有組織的數(shù)據(jù)的容器

數(shù)據(jù)庫軟件也稱為數(shù)據(jù)庫管理系統(tǒng)(DBMS)单雾;

  • 表(table):某種特定類型數(shù)據(jù)的結構化清單

  • 列:表中的一個字段袋马。所有表都是由一個或多個列組成

  • 數(shù)據(jù)類型:限定可存儲在列中的數(shù)據(jù)的種類

  • 行:表中的一條記錄

  • 主鍵:一列(或一組列)把篓,其值能夠唯一標識表中每一行

應該總是定義主鍵制恍,主鍵滿足的條件:

  • 任意兩行都不具有相同的主鍵值
  • 每一行都必須具有一個主鍵(主鍵不允許為NULL)
  • 主鍵列中的值不允許修改或更新
  • 主鍵值不能重用(如果某行被刪除已球,它的主鍵不能賦給以后的新行)


1.2、什么是SQL

  • SQL:Structured Query Language(結構化查詢語言)

SQL的優(yōu)點:

  • 幾乎所有重要的DBMS都支持SQL盼理;
  • SQL簡單易學谈山;
  • SQL可以進行非常復雜和高級的數(shù)據(jù)庫操作;


第2課:檢索數(shù)據(jù)



SELECT語句

SELECT語句用于從一個或多個表中檢索信息

關鍵字不能用作表或列的名字;


檢索單個列:

SELECT prod_name FROM products;

從products表中檢索名為prod_name的列宏怔,FROM關鍵字指出從那個表中檢索數(shù)據(jù)奏路。

多條SQL語句必須以分號(即";")分割

SQL語句不區(qū)分大小寫,一般情況下臊诊,為了易于閱讀和維護鸽粉,對關鍵字使用大寫,而對列名和表名使用小寫抓艳;


檢索多個列

SELECT prod_id, prod_name, prod_price FROM products;

多個列之間使用逗號分隔


檢索所有列

SELECT * FROM products;

一般而言除非確實需要表中的每一列触机,否則最好不要使用通配符,使用通配符通常會降低檢索和應用程序的性能玷或;


檢索不同的值

SELECT DISTINCT vend_id FROM products;
  • DISTINCT關鍵字指示數(shù)據(jù)庫返回不同的值儡首;
  • DISTINCT關鍵字作用于所有的列,不僅僅是緊跟其后的那一列偏友;


限制結果

如果查詢的數(shù)據(jù)有很多蔬胯,只想返回一定的行數(shù),則可以根據(jù)不同的DBMS的關鍵字來實現(xiàn)

  • SQL Server和Access: SELECT TOP 5 prod_name FROM products;
  • DB2: SELECT prod_name FROM products FETCH FIRST 5 ROWS ONLY;
  • Oracle: SELECT prod_name FROM products WHERE ROWNUM <= 5;
  • MySQL / MariaDB / PostgreSQL / SQLite: SELEC prod_name FROM products LIMIT 5;

為了得到后面的5行位他,可以使用OFFSET關鍵字: SELECT prod_name FROM products LIMIT 5 OFFSET 5;

指示DBMS從OFFSET指定的第5行起行起笔宿,查詢LIMIT后的 5 行數(shù)據(jù);


SQL注釋

使用注釋的原因:

  • 隨著SQL語句的變長棱诱,復雜性增加,需要添加一些描述性的文字涝动,以便于以后自己和其他人參考迈勋;
  • 在文件開頭添加一些個人的聯(lián)系方式、程序描述以及一些說明醋粟;
  • 暫時停止不需要執(zhí)行的SQL代碼靡菇;
  • 雙連字符注釋

    SELECT prod_name ?? -- 這是一條注釋

    FROM products;

兩個連字符之后的便是注釋的內(nèi)容

  • 另一種注釋:

      # 這是一條注釋
      # 這是一條注釋
    
  • 多行注釋

      /*
       SELECT prod_name, vend_id
       FROM products
       LIMIT 5 OFFSET 10;
      */
    


第3課:排序檢索數(shù)據(jù)


排序順序

子句:SQL由子句構成米愿,一個子句通常由一個關鍵字加上所提供的數(shù)據(jù)組成厦凤。


ORDER BY 子句可以對檢索出的數(shù)據(jù)進行排序

SELECT prod_name
FROM products
ORDER BY prod_name;

ORDER BY 子句的位置總是在SELECT語句的最后一條,否則會報錯育苟。


按多個列排序

SELECT prod_id, prod_price, prod_name 
FROM products 
ORDER BY prod_price, prod_name;


按排列的位置排序

SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY 2, 3;


指定排序方向

SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC, prod_name;

DESC是降序排列(DESCENDING)较鼓,默認是升序排列ASC(ASCENDING);

DESC關鍵字只能應用到直接位于其前的列名,如果想對多個列進行降序排列博烂,必須對每一列指定DESC關鍵字香椎;


第4課:過濾數(shù)據(jù)


只檢索所需數(shù)據(jù)需要指定搜索條件(search criteria),搜索條件也稱為過濾條件(filter condition)禽篱;

使用WHERE子句

SELECT prod_name, prod_price
FROM products
WHERE prod_price = 3.49;


WHERE子句操作符

操作符 說?明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
!< 不小于
> 大于
>= 大于等于
!> 不大于
BETWEEN 在指定的兩個值之間
IS NULL 為NULL值

并非所有的DBMS都支持以上所有的操作符畜伐,如<>就不是所有的DBMS支持;

實例

查詢單個值

查詢小于價格小于10的商品

SELECT prod_name, prod_price
FROM products
WHERE prod_price < 10
ORDER BY prod_price DESC, prod_name;

限定查詢

SELECT vend_id, prod_name
FROM products
WHERE vend_id != 'DLL01';

范圍查詢

SELECT prod_name, prod_price
FROM products
WHERE prod_price BETWEEN 3 AND 10;

兩個值之間需要 AND 關鍵字隔開

NULL值查詢

SELECT cust_name
FROM customer
WHERE cust_email IS NULL;


第5課:高級數(shù)據(jù)過濾

5.1躺率、組合WHERE子句

SQL允許給出多個WHERE子句玛界,這些子句以 AND 子句或 OR 子句的方式組合:

  • AND操作符:AND指示DBMS檢索只滿足所有給定所有條件的行。

      SELECT prod_id, prod_price, prod_name
      FROM products
      WHERE vend_id = 'DLL01' AND prod_price <= 4
      ORDER BY prod_name DESC;
    


  • OR操作符:用來表示檢索匹配任一給定條件的行悼吱。

      SELECT prod_name, prod_price
      FROM products
      WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
      ORDER BY prod_price DESC;
    


求值順序

AND 操作符的優(yōu)先級高于 OR 慎框,所以在同時使用時建議加上圓括號加以區(qū)別;

實例一:

SELECT prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' AND prod_price >= 10
ORDER BY prod_price DESC;

實例二:

SELECT prod_name, prod_price
FROM products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >= 10 
ORDER BY prod_price DESC;


IN 操作符

IN操作符用來指定的范圍舆绎,范圍中的每個條件都可以匹配鲤脏。

SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id IN ('DLL01', 'BRS01')
ORDER BY prod_id;

使用 IN 操作符的優(yōu)點:

  • 在有很多合法選項時,IN操作符的語法更清楚吕朵,更直觀猎醇;
  • 在與AND和OR等其他操作符組合使用時,求值順序更容易管理努溃;
  • IN 操作符一般比一組OR操作符執(zhí)行的更快硫嘶;
  • IN 操作符的最大優(yōu)點是可以包含SELECT語句,能夠更動態(tài)的建立WHERE子句梧税;


NOT操作符

NOT操作符用來否定其后跟的條件沦疾;

實例:

SELECT prod_id, prod_name
FROM products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_id;C

以上實例等同于:

SELECT prod_id, prod_name
FROM products
WHERE vend_id != 'DLL01'
ORDER BY prod_id;


第6課:用通配符進行過濾

LIKE操作符

通配符(wildcard):用來匹配值的一部分的特殊字符


為在搜索子句中使用通配符,必須使用LIKE操作符第队。LIKE指示DBMS哮塞,后跟的搜索模式利用通配符而不是簡單的相等匹配進行比較。


通配符只能用于文本字段(字符串)

百分號(%)通配符

% 表示任何字符出現(xiàn)任意次數(shù)凳谦;

實例: 找出所有以Fish起頭的產(chǎn)品

SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'Fish%';

搜索時會區(qū)分大小寫忆畅;


使用多個%通配符:找出所有包含“bean bag”的產(chǎn)品

SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '%bean bag%';

在搜索模式的中間:找出以F開頭,以y結尾的所有產(chǎn)品

SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'F%y';

在中間使用時搜索電子郵件很有用尸执,如:WHERE email LIKE 'b%@163.com';

%不會匹配NULL


下劃線(_)匹配符

下劃線通配符是用來匹配單個字符的

實例:匹配兩個

SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '__ inch teddy bear';

匹配任意個:

SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '% inch teddy bear';

方括號([])通配符

方括號([])匹配符用來指定一個字符集家凯,它必須匹配指定位置(通配符的位置)的一個字符;

并不是所有的DBMS都支持創(chuàng)建集合的[]如失,只有微軟的Access和SQL Server支持绊诲。

SELECT cust_contact
FROM customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;

對[]進行否定,[^JM]%


使用通配符的技巧:

  • 不要過度使用通配符褪贵,如果能達到相同目的掂之,應該使用其他操作符;
  • 在確實需要使用時,盡量不要把它們用在搜索模式的開始處板惑,因為那樣是搜索起來最慢的橄镜;
  • 仔細注意通配符的位置;

....

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冯乘,一起剝皮案震驚了整個濱河市洽胶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裆馒,老刑警劉巖姊氓,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喷好,居然都是意外死亡翔横,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門梗搅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來禾唁,“玉大人,你說我怎么就攤上這事无切〉炊蹋” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵哆键,是天一觀的道長掘托。 經(jīng)常有香客問我,道長籍嘹,這世上最難降的妖魔是什么闪盔? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮辱士,結果婚禮上泪掀,老公的妹妹穿的比我還像新娘。我一直安慰自己颂碘,他們只是感情好异赫,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凭涂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贴妻。 梳的紋絲不亂的頭發(fā)上切油,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機與錄音名惩,去河邊找鬼澎胡。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的攻谁。 我是一名探鬼主播稚伍,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戚宦!你這毒婦竟也來了个曙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤受楼,失蹤者是張志新(化名)和其女友劉穎垦搬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艳汽,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡猴贰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了河狐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片米绕。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖馋艺,靈堂內(nèi)的尸體忽然破棺而出栅干,到底是詐尸還是另有隱情,我是刑警寧澤丈钙,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布非驮,位于F島的核電站,受9級特大地震影響雏赦,放射性物質(zhì)發(fā)生泄漏劫笙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一星岗、第九天 我趴在偏房一處隱蔽的房頂上張望填大。 院中可真熱鬧,春花似錦俏橘、人聲如沸允华。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽靴寂。三九已至,卻和暖如春召耘,著一層夾襖步出監(jiān)牢的瞬間百炬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工污它, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剖踊,地道東北人庶弃。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像德澈,于是被迫代替她去往敵國和親歇攻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容