SQL概要與表的創建 1.表的結構 關係資料庫通過類似Excel 工作表那樣的、由行和列組成的二維表來管理數據。用來管理數據的二維表在關係資料庫中簡稱為表。 根據 SQL 語句的內容返回的數據同樣必須是二維表的形式 ,這也是關係資料庫的特征之一 。返回結果如果不是二維表的SQL 語句則無法執 ...
SQL概要與表的創建
1.表的結構
關係資料庫通過類似Excel 工作表那樣的、由行和列組成的二維表來管理數據。用來管理數據的二維表在關係資料庫中簡稱為表。
根據SQL 語句的內容返回的數據同樣必須是二維表的形式 ,這也是關係資料庫的特征之一。返回結果如果不是二維表的SQL 語句則無法執行。
表的列(垂直方向)稱為欄位,它代表了保存在表中的數據項目。表的行(水平方向)稱為記錄,它相當於一條數據。
關係資料庫必須以行為單位進行數據讀寫。
一個單元格中只能輸入一個數據。
2.SQL 語句及其種類
SQL是為操作資料庫而開發的語言。
SQL通過一條語句來描述想要進行的操作,發送給RDBMS。
SQL根據操作目的可以分為DDL、DML和DCL。
SQL 用關鍵字、表名、列名等組合而成的一條語句(SQL 語句)來
描述操作的內容。
2.1.DDL
DDL(Data Definition Language,數據定義語言) 用來創建或者刪除存儲數據用的資料庫以及資料庫中的表等對象。
create :創建資料庫和表等對象
drop :刪除資料庫和表等對象
alert :修改資料庫和表等對象的結構
2.2 DML
DML(Data Manipulation Language,數據操縱語言) 用來查詢或者變更表中的記錄。
select:查詢表中的數據
insert:向表中插入新數據
updata:更新表中的數據
delete:刪除表中的數據
2.3DCL
DCL(Data Control Language,數據控制語言) 用來確認或者取消對資料庫中的數據進行的變更。除此之外,還可以對RDBMS 的用戶是否有許可權操作資料庫中的對象(資料庫表等)進行設定。
commit: 確認對資料庫中的數據進行的變更
rollback: 取消對資料庫中的數據進行的變更
grant: 賦予用戶操作許可權
revoke: 取消用戶的操作許可權
3.表的創建
3.1創建資料庫
create database <資料庫名稱>;
例:create database shop;
3.2創建表
create table <表名>
(<列名1> <數據類型> <該列所需約束>,
<列名2> <數據類型> <該列所需約束>,
<列名3> <數據類型> <該列所需約束>,
<列名4> <數據類型> <該列所需約束>,
.. .
<該表的約束1>, <該表的約束2>,……)
例:
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 interge ,
regist_date data ,
primary key (product_id));
<列名1> <數據類型> <該列所需約束> | l<列名2> <數據類型> <該列所需約束> | ... | <該表的約束1> | ... |
---|---|---|---|---|
4.數據類型的指定
部分數據類型
數值:tinyint、int 、bigint float、double、decimal
字元串:char、varchar、text
時間類型:data 、time、datatime、timestamp
枚舉和集合類型:enum、set
4.1 tinyint型
tinyint[(m)] [unsigned] [zerofill] []表示可選
有符號:-128 ~ 127 無符號:0 ~ 255,SQL中無布爾值,使用tinyint(1)構造。
用1代表TRUE,0代表FALSE,boolean在MySQL里的類型為tinyint(1),
MySQL里有四個常量:true,false,TRUE,FALSE,它們分別代表1,0,1,0
mysql> create table t2(YON boolean);
Query OK, 0 rows affected (0.04 sec)
mysql> insert into t2(YON) values(true);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+------+
| YON |
+------+
| 1 |
+------+
mysql> create table t3(YON tinyint(1));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t3(YON) values(true);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t3;
+------+
| YON |
+------+
| 1 |
+------+
mysql> create table t4(YON tinyint(1));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t4(YON) values(0);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t4;
+------+
| YON |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
4.2 int型
用來指定存儲整數的列的數據類型(數字型),不能存儲小數。int(5),5表示的是顯示長度,其它的數據類型中都是存儲寬度,所以我們來設計表的時候 int類型的欄位不用加顯示寬度,預設是總長度的位數+1。負數不能zerofill
mysql> create table t2(number int(1));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t2(number) values(123);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+--------+
| number |
+--------+
| 123 |
+--------+
1 row in set (0.00 sec)
4.3 float型
float[(m,d)] [unsigned] [zerofill]
M是全長,D是小數點後個數。m最大值為255,d最大值為30
mysql> create table t4(digite float(6,3) zerofill);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t4(digite) values(1.2);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t4;
+--------+
| digite |
+--------+
| 01.200 |
+--------+
4.4 char型
char 是character(字元)的縮寫,是用來指定存儲字元串的列的數據類型(字元型)。可以像char(10) 或者char(200) 這樣,在括弧中指定該列可以存儲的字元串的長度(最大長度)。字元串超出最大長度的部分是無法輸入到該列中的。
字元串以定長字元串的形式存儲在被指定為char型的列中。所謂定長字元串,就是當列中存儲的字元串長度達不到最大長度的時候,使用半形空格進行補足。例如,我們向char(8) 類型的列中輸入'abc'的時候,
會以'abc'(abc 後面有5 個半形空格)的形式保存起來。
在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,除非我們打開pad_char_to_full_length SQL模式(設置SQL模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)
4.5 varchar型
同char 類型一樣,varchar 型也是用來指定存儲字元串的列的數據類型(字元串類型),也可以通過括弧內的數字來指定字元串的長度(最大長度)。但該類型的列是以 可變長字元串 的形式來保存字元串的定長字元串在字元數未達到最大長度時會用半形空格補足,但可變長字元串不同,即使字元數未達到最大長度,也不會用半形空格補足。例如,我們向varcha(8) 類型的列中輸入字元串'abc'的時候,保存的就是字元串'abc'。創建表時,定長的類型往前放,變長的往後放
mysql> create table t1(x char(5),y varchar(5));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t1 values('abc ','abc ');
Query OK, 1 row affected (0.00 sec)
mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
#檢索時char類型的數據時,不會把末尾的空格計入字元長度(包括自己創建的)
mysql> select x,char_length(x),y,char_length(y) from t1;
+------+----------------+------+----------------+
| x | char_length(x) | y | char_length(y) |
+------+----------------+------+----------------+
| abc | 3 | abc | 4 |
+------+----------------+------+----------------+
1 row in set (0.00 sec)
mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected (0.00 sec)
mysql> select @@sql_mode;
+-------------------------+
| @@sql_mode |
+-------------------------+
| PAD_CHAR_TO_FULL_LENGTH |
+-------------------------+
1 row in set (0.00 sec)
mysql> select x,char_length(x),y,char_length(y) from t1;
+-------+----------------+------+----------------+
| x | char_length(x) | y | char_length(y) |
+-------+----------------+------+----------------+
| abc | 5 | abc | 4 |
+-------+----------------+------+----------------+
關於:sql_mode
4.5 時間
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
---|---|---|---|---|
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 時間值或持續時間 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
mysql> create table t3(y year,d date,dt datetime,t time);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t3(y,d,dt,t) values(now(),now(),now(),now());
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from t3;
+------+------------+---------------------+----------+
| y | d | dt | t |
+------+------------+---------------------+----------+
| 2019 | 2019-08-21 | 2019-08-21 21:14:43 | 21:14:43 |
| 2019 | 2019-08-21 | 2019-08-21 21:14:55 | 21:14:55 |
+------+------------+---------------------+----------+
4.6 enum和set
mysql> create table t5(id int,se enum('man','woman'));
Query OK, 0 rows affected (0.03 sec)
#插入值從enum中單選
mysql> insert into t5(id,se) values(1,'man');
Query OK, 1 row affected (0.00 sec)
mysql> create table t6(id int,hobby set('sing','dance','rap'));
Query OK, 0 rows affected (0.04 sec)
#插入值從set中可多選,註意這裡的語法。
mysql> insert into t6(id,hobby) values(1,'sing,rap');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t6;
+------+----------+
| id | hobby |
+------+----------+
| 1 | sing,rap |
+------+----------+
5.約束的設置
約束是除了數據類型之外,對列中存儲的數據進行限制或者追加條件的功能,保證數據的完整性和一致型。
另外,在創建product 表的create table語句的後面,還有下麵這樣的記述。primary key (product_id)這是用來給product_id 列設置主鍵約束的。所謂鍵,就是在指定特定數據時使用的列的組合。鍵種類多樣,主鍵(primary key)就是可以特定一行數據的列。也就是說,如果把product_id 列指定為主鍵,就可以通過該列取出特定的商品數據了。反之,如果向product_id 列中輸入了重覆數據,就無法取出唯一的特定數據了(因為無法確定唯一的一行數據)。這樣就可以為某一列設置主鍵約束了。
5.1 null和default
null 是代表空白(無記錄)的關鍵字。在null 之前加上了表示否定的not,就是給該列設置了不能輸入空白,也就是必須輸入數據的約束(如果什麼都不輸入就會出錯)。
default預設值,當插數據時未主動設置值時,則自動添加預設值。
mysql> create table t1(product_id int not null,pruduct_name char(10) default 'unknow');
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t1(product_id) values(1);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+------------+--------------+
| product_id | pruduct_name |
+------------+--------------+
| 1 | unknow |
+------------+--------------+
mysql> create table t2(id int not null default 0);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t2 values();
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+----+
| id |
+----+
| 0 |
+----+
5.2 unique
unique表示該列唯一,可添加多列。如果在表的最後面單獨設置,例:unique(id,name)表示組合唯一,id與name有一個不同即可插入。
mysql> create table t3(id int,name char(5),unique(id,name));
Query OK, 0 rows affected (0.05 sec)
mysql> insert into t3(id,name) values(1,'a'),(2,'a');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into t3(id,name) values(1,'a');
ERROR 1062 (23000): Duplicate entry '1-a' for key 'id'
5.3 primary key
在MySQL的一個表中只有唯一的一個主鍵,不能有多列主鍵,但可以有複合主鍵
一個表中可以:單列做主鍵 、多列做主鍵(複合主鍵)
約束:等價於 not null unique,欄位的值不為空且唯一
存儲引擎預設是(innodb):對於innodb存儲引擎來說,一張表必須有一個主鍵。
mysql> create table t4(id int ,name char,primary key(id));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t4(id,name) values(1,'a');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t4(id,name) values(1,'b');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into t4(name) values('c');
ERROR 1364 (HY000): Field 'id' doesn't have a default value
5.4 auto_increment
約束的欄位為自動增長,約束的欄位必須同時被key約束
mysql> create table t5(id int primary key auto_increment,name char(5));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t5(name) values('a');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t5(name) values('b');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t5;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
+----+------+
2 rows in set (0.00 sec)
mysql> delete from t5;
Query OK, 2 rows affected (0.00 sec)
#即使被刪除(delete),欄位仍然繼續增加,如果使用truncate,則不會。
mysql> insert into t5(name) values('d');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t5;
+----+------+
| id | name |
+----+------+
| 3 | d |
+----+------+
5.5外鍵
1.創建被關聯的表
2.創建關聯表
3.向被關聯的表插入數據
4.向關聯表插入數據
mysql> create table department(seq int primary key auto_increment,name varchar(20) not null);
Query OK, 0 rows affected (0.05 sec)
mysql> create table staff(id int primary key,name char(10),dep_seq int,constraint fk foreign key(dep_seq) references department(seq));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into department(name) values('生產部'),('技術部'),('銷售部'),('財務部');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> insert into staff(id,name,dep_seq) values(1,'趙',2),(2,'錢',3);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from department;
+-----+-----------+
| seq | name |
+-----+-----------+
| 1 | 生產部 |
| 2 | 技術部 |
| 3 | 銷售部 |
| 4 | 財務部 |
+-----+-----------+
4 rows in set (0.00 sec)
mysql> select * from staff;
+----+------+---------+
| id | name | dep_seq |
+----+------+---------+
| 1 | 趙 | 2 |
| 2 | 錢 | 3 |
+----+------+---------+
2 rows in set (0.00 sec)
#如果被關聯的表中的某條數據被關聯,則該行無法刪除
#創建關聯表時添加同步刪除和同步更新,再去刪被關聯表的記錄,關聯表中的記錄也跟著刪除和更新。
create table staff(id int primary key,name char(10),dep_seq int,constraint fk foreign key(dep_seq) references department(seq) on delete cascade on update cascade);