1. 程式人生 > >CHAPTER 2 Create and Use Databases

CHAPTER 2 Create and Use Databases

第二章 建立和使用資料庫


首先,需要說明的是,在學習SQL時,我是通過MySQL這一開源資料庫伺服器來學習如何編寫SQL語句,但目光並不能僅限於此,在甲骨文公司上的Oracle Database,Microsoft上的SQL Server,IBM上的DB2 Universal Database 和Sybase的Sybase Adaptive Server也要熟悉把握各中特色與差異。


2.1建立MySQL資料庫

Create USER 'learning'@'localhost' IDENTIFIED BY 'password'; #建立使用者
GRANT ALL PRIVILEGES ON bank.* TO '
learning'@'localhost'; #賦予使用者bank資料庫的許可權 quit; mysql -u learning -p; USE bank;

2.2 使用mysql命令列工具

mysql命令列工具使用+、-和|等符號將查詢結果格式化輸出在矩形框中。

SELECT now();#顯示當前日期時間
SELECT now()
-> FROM dual;#某些資料庫伺服器(如Oracle)規定查詢語句中必須包含FROM,Oracle與mysql都自帶了dual中只包含了dummy一個列。

2.3 MySQL資料型別

對於流行資料庫,字串、日期與數字等都有著相同的資料型別,但對於XML文件及二進位制文件,不同資料庫可能存在著較大差異(這些咱們暫不涉及)。

2.3.1 字元型資料

字元型資料可以使用定長或變長字串實現。定長:使用空格向右填充;變長:不填充且位元組數可變。
如char(20)#定長字串,最大長度255位元組,varchar(20)#變長字串,最大長度65535位元組

1)字符集

對於拉丁系語言,如英語,通常是一個字母一個位元組(單字符集);其他語言如日語韓語,一個字元往往多個位元組(多字符集);

SHOW CHARACTER SET;#檢視伺服器所支援的字符集
+----------+---------------------------------+---------------------+--------+
|
Charset | Description | Default collation | Maxlen | +----------+---------------------------------+---------------------+--------+ | armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 | | ascii | US ASCII | ascii_general_ci | 1 | | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | | binary | Binary pseudo charset | binary | 1 | | cp1250 | Windows Central European | cp1250_general_ci | 1 | | cp1251 | Windows Cyrillic | cp1251_general_ci | 1 | | cp1256 | Windows Arabic | cp1256_general_ci | 1 | | cp1257 | Windows Baltic | cp1257_general_ci | 1 | | cp850 | DOS West European | cp850_general_ci | 1 | | cp852 | DOS Central European | cp852_general_ci | 1 | | cp866 | DOS Russian | cp866_general_ci | 1 | | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 | | dec8 | DEC West European | dec8_swedish_ci | 1 | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 | | euckr | EUC-KR Korean | euckr_korean_ci | 2 | | gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 | | gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 | | gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 | | geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 | | greek | ISO 8859-7 Greek | greek_general_ci | 1 | | hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 | | hp8 | HP West European | hp8_english_ci | 1 | | keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 | | koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 | | koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 | | latin1 | cp1252 West European | latin1_swedish_ci | 1 | | latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 | | latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 | | latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 | | macce | Mac Central European | macce_general_ci | 1 | | macroman | Mac West European | macroman_general_ci | 1 | | sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 | | swe7 | 7bit Swedish | swe7_swedish_ci | 1 | | tis620 | TIS620 Thai | tis620_thai_ci | 1 | | ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 | | ujis | EUC-JP Japanese | ujis_japanese_ci | 3 | | utf16 | UTF-16 Unicode | utf16_general_ci | 4 | | utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 | | utf32 | UTF-32 Unicode | utf32_general_ci | 4 | | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | | utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 | +----------+---------------------------------+---------------------+--------+ 41 rows in set (0.00 sec) #這裡面的Maxlen若大於1則表示多字符集;latin1為MySQL的預設字符集;

在mysql中還可以為資料庫字元列選擇不同的字符集,如:

varchar(20) CHARACTER SET utf8;
CREATE DATABASE foreign_sales CHARACTER SET utf8;#為整個資料庫更改預設字符集

2)文字資料

如果儲存的資料超過64k(varchar列所能容許的上限),就要用到文字型別。

文字型別 位元組最大長度
tinytext 255
text 65535
mediumtext 16777215
longtext 429496295

  • 超過文字資料最大長度的資料會被截斷;
  • 向文字列裝載資料時,不會消除資料的尾部空格
  • 當時用文字列排序或分組時,一般只使用前1024個位元組
  • 上表針對MySQL,SQLServer對字串型資料只提供text型別,而DB2和Oracle使用的資料型別名稱為colb。
  • 由於varchar的存在,一般在MySQL中不會用到tinytext和text

2.3.2 數值型資料

整數型別

型別 帶符號的範圍 無符號的範圍
tiny -128~127 0~255
smallint -32768~32767 0~65535
mediumint -8388608~8388607 0~16777215
int -2147483648~2147483647 0~4294967295
bigint -9223372036854775808~9223372036854775807 0~18446744073709551615

MySQL浮點型:float(p,s);double(p,s);p:精度(總位數),s:有效位(數)

2.3.3 時間資料

MySQL時間型別

型別 預設格式 型別 預設格式
date YYYY-MM-DD datatime YYYY-MM-DD HH:MI:SS
timestamp YYYY-MM-DD HH:MI:SS year YYYY
time HHH:MI:SS

其中要注意的是date與datetime範圍包括9000年,timestamp只包括1970-2037,year只包括19012155,time只包括-839:59:59839:59:59

2.4 表的建立

2.4.1 step1 設計

我們需要哪些資訊,它們分別是什麼型別

2.4.2 step2 精化

拒絕重複,複合,保證行唯一,對外來鍵的設計

2.4.3 step3 構建SQL方案語句

CREATE TABLE person
(person_id SMALLINT UNSIGNED,
fname VARCHAR(20),
lname VARCHAR(20),
gender ENUM('M','F'),
brith_date DATE,
street VARCHAR(30),
city VARCHAR(20),
state VARCHAR(20),
country VARCHAR(20),
postal_code VARCHAR(20),
CONSTRAINT pk_person PRIMARY KEY (person_id)
);

gender ENUM(‘M’,‘F’)#約束gender的取值
CONSTRAINT pk_person PRIMARY KEY (person_id) #在定義表時,需要向資料庫指明哪個列或哪些列將作為表的主鍵,constraint就是這個功能。該語句表明person_id 為主鍵並被命名為pk_person。

CREATE TABLE favorite_food(
person_id SMALLINT UNSIGNED,
food VARCHAR(20),
CONSTRAINT pk_fav_food PRIMARY KEY (person_id,food),
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id)
);

REFERENCES person (person_id)#外來鍵約束,限定person_id必須來自person。

##2.5 操作與修改表

2.5.1 insert data

生成數字型主鍵資料

修改已存在的表定義:

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

上述語法表示將person_id賦值為null時,MySQL自動新增可用的主鍵數字;

新增,查詢資料:

INSERT INTO person
(person_id,fname,lname,gender,birth_date)
VALUES(null,'William','Turner','M','1996-04-25');
SELECT person_id,fname,lname,birth_date FROM person WHERE person_id=1;
SELECT person_id,fname,lname,birth_date FROM person WHERE lname='Turner';
INSERT INTO favorite_food(person_id,food) VALUES(1,'pizza');
INSERT INTO favorite_food(person_id,food) VALUES(1,'cookies');
INSERT INTO favorite_food(person_id,food) VALUES(1,'nachos');
SELECT food FROM favorite_food WHERE person_id=1 ORDER BY food;
INSERT INTO person
(person_id,fname,lname,gender,birth_date,
street,city,state,country,postal_code)
VALUES(null,'Moon','Left','F','1996-04-25','Mao','JJ','JX','China','332000');

更新資料:

UPDATE person
SET street='1225 Trement St.',
    city='Boston',
    state='VA',
    country='USA',
    postal_code='02138'
WHERE person_id=1;

:這裡要注意WHERE前面最後一個賦值語句不用打逗號,我卡這裡卡了1個小時你能信…
刪除資料:

DELETE FROM person
WHERE person_id=2;