《SQL基礎(chǔ)教程》學(xué)習筆記Ch1&2

0進入PostgreSQL

0.png

1數(shù)據(jù)庫和SQL

1-1數(shù)據(jù)庫是什么

數(shù)據(jù)庫Database(DB):將大量數(shù)據(jù)保存起來渴频,通過計算機加工而成的可以進行高效訪問的數(shù)據(jù)集合稱為數(shù)據(jù)庫
數(shù)據(jù)庫管理系統(tǒng)Database Management System(DBMS):用來管理數(shù)據(jù)庫的計算機系統(tǒng)

DBMS的種類:
  • 層次數(shù)據(jù)庫HDB
    樹狀結(jié)構(gòu)珊搀,相對于RDB較少使用
  • 關(guān)系數(shù)據(jù)庫Relational Database,RDB
    由行和列組成的二維表來管理數(shù)據(jù),使用專門的Structured Query Language(SQL結(jié)構(gòu)化查詢語言)對數(shù)據(jù)進行操作
    5種常用的RDBMS:
    Oracle Database袱箱,SQL server,DB2义矛,PostgreSQL发笔,MySQL
  • 面向?qū)ο髷?shù)據(jù)庫
  • XML數(shù)據(jù)庫
  • 鍵值存儲系統(tǒng)

1-2數(shù)據(jù)庫的結(jié)構(gòu)

RDBMS的常見系統(tǒng)結(jié)構(gòu):客戶端/服務(wù)器類型(C/S類型)
客戶端:委托方;服務(wù)器:受托方(RDBMS)

表的結(jié)構(gòu)

根據(jù)SQL語句的內(nèi)容返回的數(shù)據(jù)必須是二維表的形式
表的行稱為字段凉翻;表的行稱為記錄

1-3SQL概要

SQL用關(guān)鍵字了讨、表名、列名等組合而成的一條語句。

SQL語句的種類:
  • DDL(Data definition language前计,數(shù)據(jù)定義語言):創(chuàng)建或刪除存儲數(shù)據(jù)用的數(shù)據(jù)庫以及數(shù)據(jù)庫中的表等對象
    CREATE
    DROP
    ALTER
  • DML(Data manipulation language胞谭,數(shù)據(jù)操縱語言):查詢或變更表中的記錄
    SELECT
    INSERT
    UPDATE
    DELETE
  • DCL(Data control language,數(shù)據(jù)控制語言):確認或取消對數(shù)據(jù)庫中的數(shù)據(jù)進行的變更
    COMMIT
    ROLLBACK
    GRANT
    REVOKE
SQL的基本書寫規(guī)則

1.要以分號(男杈;)結(jié)尾
2.不區(qū)分大小寫

為了代碼的整潔性韭赘,采取下面的規(guī)則:
關(guān)鍵字大寫
表名的首字母大寫
其余(列名等)小寫

3.常數(shù)的書寫方式是固定的
在SQL語句中直接書寫的字符串、日期或者數(shù)字等稱為常數(shù)势就。

含有字符串的時候泉瞻,使用單引號(')將字符串括起來:'abc'
含有日期時,也需要單引號(')將其括起來苞冯,形式有多種:'26 Jan 2010','10/01/26','2010-01-26'
書寫數(shù)字的時候袖牙,不需要任何標識

4.單詞之間需要用半角空格或者換行來分隔

1-4表的創(chuàng)建

CREATE TABLE Product
(product_id         CHAR(4)     NOT NULL,
 product_name     VARCHAR(100)    NOT NULL,
 product_type     VARCHAR(32)      NOT NULL,
 sale_price         INTEGER       ,
 purchase_price   INTEGER     ,
 regist_date        DATE  ,
 PRIMARY KEY  (product_id));
  • 命名規(guī)則:只能使用半角英文字母、數(shù)字舅锄、下劃線(_)作為數(shù)據(jù)庫鞭达、表和列的名稱,且名稱必須以字母開頭
  • 數(shù)據(jù)類型的指定:
    INTEGER型:整數(shù)
    CHAR型:定長字符串(當字符串達不到指定長度時皇忿,用半角空格進行補足)
    VARCHAR型:可變長字符串
    DATE型:日期
  • 約束的設(shè)置:
    約束是除了數(shù)據(jù)類型之外畴蹭,對列中存儲的數(shù)據(jù)進行限制或者追加條件的功能。
    NOT NULL約束:該列不能輸入空白
    主鍵約束:將product_id設(shè)為主鍵(主鍵:可以特定一行數(shù)據(jù)的列)

1-5表的刪除和更新

表的刪除
DROP TABLE Product;
表定義的更新(添加列或刪除列)
ALTER TABLE Product ADD COLUMN product_name_pinyin VARCHAR(100);
ALTER TABLE Product DROP COLUMN product_name_pinyin;
向Product表中插入數(shù)據(jù)
-- DML:插入數(shù)據(jù)
BEGIN TRANSACTION;

INSERT INTO Product VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');
INSERT INTO Product VALUES ('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11');
INSERT INTO Product VALUES ('0003', '運動T恤', '衣服', 4000, 2800, NULL);
INSERT INTO Product VALUES ('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20');
INSERT INTO Product VALUES ('0005', '高壓鍋', '廚房用具', 6800, 5000, '2009-01-15');
INSERT INTO Product VALUES ('0006', '叉子', '廚房用具', 500, NULL, '2009-09-20');
INSERT INTO Product VALUES ('0007', '擦菜板', '廚房用具', 880, 790, '2008-04-28');
INSERT INTO Product VALUES ('0008', '圓珠筆', '辦公用品', 100, NULL, '2009-11-11');

COMMIT;
表名稱的修改
ALTER TABLE Poduct RENAME TO Product;

2查詢基礎(chǔ)

2-1SELECT語句基礎(chǔ)

列的查詢
SELECT product_id, product_name, purchase_price  
  FROM  Product;
查詢出表中所有的列
SELECT * 
  FROM Product;
2-1.png

需要注意的是鳍烁,如果使用星號的話叨襟,無法設(shè)定列的排列順序,表會依照CREATE TABLE的順序?qū)α信判?/p>

為列設(shè)置別名
SELECT product_id      AS  id,
       product_name    AS  name,
       purchase_price  AS  price
  FROM Product;
2-2.png
SELECT product_id      AS  "商品編號",
       product_name    AS  "商品名稱",
       purchase_price  AS  "進貨單價"
  FROM Product;

設(shè)定中文別名需要用雙引號(")括起來

常數(shù)的書寫

第一列是字符串常數(shù)幔荒,第二列是數(shù)字常數(shù)糊闽,第三列是日期常數(shù)

SELECT '商品' AS string, 38 AS number, '2009-02-24' AS date,
       product_id, product_name
  FROM Product;
2-3.png
從結(jié)果中刪除重復(fù)行

想知道Product表中保存了哪些商品種類

SELECT DISTINCT product_type
  FROM Product;

在使用DISTINCT時,NULL也被視為一類數(shù)據(jù)

SELECT DISTINCT purchase_price
  FROM Product;
2-4.png

在多列之前使用DISTINCT

SELECT DISTINCT product_type, regist_date
  FROM Product;
2-5.png
根據(jù)WHERE語句來選擇記錄

SELECT語句通過WHERE子句來指定查詢數(shù)據(jù)的條件

SELECT product_name, product_type
  FROM Product
 WHERE product_type = '衣服';
圖片.png

首先通過WHERE子句查詢出符合指定條件的行爹梁,再選取出SELECT語句指定的列右犹;
SQL語句中子句的書寫順序是固定的,WHERE子句必須緊跟在FROM子句后

注釋的寫法
  • 1行注釋
    書寫在“--”之后姚垃,只能寫在同一行
  • 多行注釋
    書寫在“/”和“/”之間念链,可以跨多行
-- 本SELECT語句會從結(jié)果中刪除重復(fù)行。
SELECT DISTINCT product_id, purchase_price
  FROM Product;

/* 本SELECT語句
   會從結(jié)果中刪除重復(fù)行积糯。*/
SELECT DISTINCT product_id, purchase_price
  FROM Product;

注釋還可以插在上兩句之間掂墓。

SELECT DISTINCT product_id, purchase_price
/* 本SELECT語句
   會從結(jié)果中刪除重復(fù)行。*/
  FROM Product;

2-2算術(shù)運算符和比較運算符

算術(shù)運算符
SELECT product_name, sale_price,
       sale_price * 2 AS "sale_price_x2"
  FROM Product;

算術(shù)運算符:+,-,*,/
也可以使用括號
需要注意絮宁,有NULL的運算式結(jié)果全為NULL

比較運算符
--選取出sale_price列的值不是500的記錄
SELECT product_name, product_type
  FROM Product
 WHERE sale_price <> 500;

--選取出登記日期在2009年9月27日之前的記錄
SELECT product_name, product_type, regist_date
  FROM Product
 WHERE regist_date < '2009-09-27';

也可以對計算結(jié)果進行比較

SELECT product_name, sale_price, purchase_price
  FROM Product
 WHERE sale_price - purchase_price >= 500;
對字符串使用不等號

首先我們創(chuàng)建一個Chars表梆暮,如下所示:


圖片.png
--DDL:創(chuàng)建表
CREATE TABLE Chars
(chr CHAR(3) NOT NULL,
PRIMARY KEY (chr));

--DML:插入數(shù)據(jù)
BEGIN TRANSACTION;

INSERT INTO Chars VALUES ('1');
INSERT INTO Chars VALUES ('2');
INSERT INTO Chars VALUES ('3');
INSERT INTO Chars VALUES ('10');
INSERT INTO Chars VALUES ('11');
INSERT INTO Chars VALUES ('222');

COMMIT;

接著我們選取表中大于‘2’的數(shù)據(jù)

SELECT chr 
  FROM Chars
 WHERE chr > '2';

執(zhí)行結(jié)果:


圖片.png

這是由于字符串類型的數(shù)據(jù)在比較時按照字典順序進行排序:1,10,11,2,222,3
不能與數(shù)字的大小順序混淆

不能對NULL使用比較運算符
--錯誤的SELECT語句(一條記錄也取不出來)
SELECT product_name, purchase_price
  FROM Product
WHERE purchase_price = NULL;
--選取NULL的記錄
SELECT product_name, purchase_price 
  FROM Product
 WHERE purchase_price IS NULL;
--選取不為NULL的記錄
SELECT product_name, purchase_price
  FROM Product
 WHERE purchase_price IS NOT NULL;

2-3邏輯運算符

NOT運算符

下面兩段語句是等價的

SELECT product_name, product_type, sale_price
  FROM Product
 WHERE NOT sale_price >= 1000;
SELECT product_name, product_type, sale_price
  FROM Product
 WHERE sale_price < 1000;
AND運算符和OR運算符

AND:同時滿足兩側(cè)查詢條件
OR:兩側(cè)查詢條件有一個成立

SELECT product_name, purchase_price
  FROM Product
 WHERE product_type = '廚房用具'
   AND sale_price >= 3000;
通過括號強化處理

假設(shè)我們需要提取的數(shù)據(jù)滿足:
“商品種類為辦公用品” 并且 “登記日期是2009年9月11日或者2009年9月20日”

--將查詢條件原封不動地寫入條件表達式
SELECT product_name, product_type, regist_date
  FROM Product
 WHERE product_type = '辦公用品'
   AND regist_date = '2009-09-11'
    OR regist_date = '2009-09-20';

查詢結(jié)果和預(yù)期不符:


圖片.png

這是由于AND運算符優(yōu)先于OR運算符造成的服协。
可以使用半角括號()將OR運算符及其兩側(cè)的查詢條件括起來

SELECT product_name, product_type, regist_date
  FROM Product
 WHERE product_type = '辦公用品'
   AND ( regist_date = '2009-09-11'
      OR regist_date = '2009-09-20');
圖片.png
邏輯運算符與真值

邏輯運算符AND绍昂,OR,NOT對比較運算符返回的真值進行操作。
真值:TRUE窘游,F(xiàn)ALSE唠椭。

含有NULL時的真值

在Product表中,商品“叉子”和“圓珠筆”的purchase_price為NULL忍饰,
查詢語句為purchase_price = 2800時贪嫂,顯然結(jié)果為FALSE;
但是執(zhí)行查詢語句NOT purchase_price = 2800時艾蓝,結(jié)果也是FALSE(不取出NULL所在的值)力崇;
它的執(zhí)行結(jié)果是UNKNOWN,這是SQL語言獨有的三元邏輯赢织。
真值有:TRUE亮靴,F(xiàn)ALSE,UNKNOWN于置。

習題2

2.1.png

2.3,2.4.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茧吊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子八毯,更是在濱河造成了極大的恐慌搓侄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件话速,死亡現(xiàn)場離奇詭異讶踪,居然都是意外死亡,警方通過查閱死者的電腦和手機泊交,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門俊柔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人活合,你說我怎么就攤上這事雏婶。” “怎么了白指?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵留晚,是天一觀的道長。 經(jīng)常有香客問我告嘲,道長错维,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任橄唬,我火速辦了婚禮赋焕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仰楚。我一直安慰自己隆判,他們只是感情好犬庇,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侨嘀,像睡著了一般臭挽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咬腕,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天欢峰,我揣著相機與錄音,去河邊找鬼涨共。 笑死纽帖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的举反。 我是一名探鬼主播抛计,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼照筑!你這毒婦竟也來了吹截?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤凝危,失蹤者是張志新(化名)和其女友劉穎波俄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛾默,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡懦铺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了支鸡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冬念。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖牧挣,靈堂內(nèi)的尸體忽然破棺而出急前,到底是詐尸還是另有隱情,我是刑警寧澤瀑构,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布裆针,位于F島的核電站,受9級特大地震影響寺晌,放射性物質(zhì)發(fā)生泄漏世吨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一呻征、第九天 我趴在偏房一處隱蔽的房頂上張望耘婚。 院中可真熱鬧,春花似錦陆赋、人聲如沸沐祷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戈轿。三九已至,卻和暖如春阵子,著一層夾襖步出監(jiān)牢的瞬間思杯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工挠进, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留色乾,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓领突,卻偏偏與公主長得像暖璧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子君旦,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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