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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章