0進入PostgreSQL
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;
需要注意的是鳍烁,如果使用星號的話叨襟,無法設(shè)定列的排列順序,表會依照CREATE TABLE的順序?qū)α信判?/p>
為列設(shè)置別名
SELECT product_id AS id,
product_name AS name,
purchase_price AS price
FROM Product;
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;
從結(jié)果中刪除重復(fù)行
想知道Product表中保存了哪些商品種類
SELECT DISTINCT product_type
FROM Product;
在使用DISTINCT時,NULL也被視為一類數(shù)據(jù)
SELECT DISTINCT purchase_price
FROM Product;
在多列之前使用DISTINCT
SELECT DISTINCT product_type, regist_date
FROM Product;
根據(jù)WHERE語句來選擇記錄
SELECT語句通過WHERE子句來指定查詢數(shù)據(jù)的條件
SELECT product_name, product_type
FROM Product
WHERE product_type = '衣服';
首先通過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表梆暮,如下所示:
--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é)果:
這是由于字符串類型的數(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ù)期不符:
這是由于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');
邏輯運算符與真值
邏輯運算符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于置。