1. 程式人生 > >MySQL視訊筆記

MySQL視訊筆記

已經發布部落格

慕課網的免費課程

綜合評分:9.7

非常高,聽後效果也是很好,沒有廢話,都是乾貨,總共8.5小時,讓你對MySQL有個初步瞭解。

https://www.imooc.com/learn/122

'''

 

#2018-06-19 484508 June Tuesday the 25 week, the 170 day SZ

 

C:\Users\z003tesj>mysql -uroot -p044500 -P3306 -h127.0.0.1

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 40

Server version: 5.5.59 MySQL Community Server (GPL)

 

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

'''

與MySQL的零距離接觸

左下角開始輸入cmd,回車,

開啟mysql:

net start mysql

登陸MySQL客戶端:

mysql -uroot -p044500 -P3306 -h127.0.0.1

或者:

mysql -uroot -p044500

出現mysql>說明成功登陸了,

然後就進入系統,展示所有的資料庫:

mysql> SHOW DATABASES; 

選擇一個數據庫,要不然會報錯:ERROR 1046(3D000): No Database Selected

接著使用資料庫:

mysql> USE test 

顯示所有的列表:

SHOW TABLES;

顯示列表中某個內容:

SHOW COLUMNS FROM users;

顯示users的具體內容:

SELECT * FROM users;

##############################################

SHOW DATABASE;

mysql> SHOW DATABASES;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| t2                 |

| test               |

+--------------------+

5 rows in set (0.01 sec)

 

 

SHOW TABLES;

+----------------+

| Tables_in_test |

+----------------+

| provinces      |

| tb1            |

| tb2            |

| tb3            |

| tb4            |

| tb5            |

| tb6            |

| users1         |

| users3         |

+----------------+

SHOW TABLES FROM mysql;

SHOW COLUMNS FROM tb3;

SHOW TABLES;

SHOW COLUMNS;

SHOW CREATE TABLE provinces;

SHOW INDEXES FROM provinces;

 

SHOW COLUMNS FROM user;

SHOW CREATE TABLE users1;

 

mysql> CREATE TABLE users(

    ->

    -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT

    -> username VARCHAR(20) NOT NULL,

    -> password VARCHAR(20) NOT NULL,

    -> age TINYINT UNSIGNED NOT NULL DEFAULT 10,

    -> sex BOOLEAN

    -> );

 

mysql> SHOW COLUMNS FROM users;

+----------+----------------------+------+-----+---------+----------------+

| Field    | Type                 | Null | Key | Default | Extra          |

+----------+----------------------+------+-----+---------+----------------+

| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |

| username | varchar(20)          | NO   |     | NULL    |                |

| password | varchar(20)          | NO   |     | NULL    |                |

| age      | tinyint(3) unsigned  | NO   |     | 10      |                |

| sex      | tinyint(1)           | YES  |     | NULL    |                |

+----------+----------------------+------+-----+---------+----------------+

 

 

mysql> SELECT * FROM users;

+----+----------+----------+-----+------+

| id | username | password | age | sex  |

+----+----------+----------+-----+------+

|  1 | Tom      | 123      |  25 |    1 |

+----+----------+----------+-----+------+

1 row in set (0.00 sec)

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

 

登陸MySQL客戶端:

mysql -uroot -p044500

 

出現mysql>說明成功登陸了

接著使用資料庫

程式碼:

USE test;

接著建立資料表:

程式碼:

CREATE TABLE provinces(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,pname VARCHAR(20) NOT NULL);

 

 

 

 

 

MySQL基礎

1.1

瑞典 MySQL AB公司開發,目前屬於Oracle公司,開源關係型資料庫

社群版和企業版

Server version: 5.5.59 MySQL Community Server (GPL)

1.2 、安裝

MSI安裝方式

MySQL Server 5.5 安裝

下載地址

https://dev.mysql.com/downloads/mysql/

 

C:\Program Files\MySQL\MySQL Server 5.5\bin\

MySQLInstanceConfig.exe

該檔案進行配置

detailed Configuration不用,因為麻煩

我們選擇standard configuration 

下一步選擇install as windows service

launch the mysql server 

include bin directory in windows path新增到Windows路徑

 

下一步:modify security settings

password 044500

root是超級使用者

 

bin儲存可執行檔案

data儲存資料檔案

docs,文件目錄

include包含的標頭檔案

lib庫檔案

share錯誤資訊和字符集檔案

 

修改編碼方式:

C:\Program Files\MySQL\MySQL Server 5.5\my.ini

 

雙擊my.ini

port埠號 3306

在port=3306後面修改編碼格式為utf8

搜尋“default-character-set”將其改為utf8,

搜尋“character-set-server=utf8”將其改為utf8

 

按照老師要求,修改完後,發現無法儲存。

解決辦法:修改後另存為桌面,然後把桌面修改好的my.ini複製到路徑替換以前的my.ini

 

 

 

1.3

啟動mysql

控制欄輸入

C:\Users\z003tesj>net start mysql

 

停止服務:net stop mysql

但是會報錯:System error 5 has occurred. Access is denied." 

解決方案,

先關閉mysql,

在開始的附件裡找到 command prompt右擊,用管理員模式開啟就解決了。

 

說明系統正確配置和啟動了

 

1.4

mysql登陸和退出

cls清屏

檢視版本

C:\Windows\system32>mysql -V

mysql  Ver 14.14 Distrib 5.5.59, for Win64 (AMD64)

 

-u使用者名稱

-P埠號

-p密碼

--prompt=name設定使用者名稱

-h伺服器名稱

-D開啟指定資料庫

--delimiter=name指定分隔符

管理員許可權使用者名稱

mysql -uroot -p

 

C:\Windows\system32>mysql -uroot -p

Enter password: ******

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.5.59 MySQL Community Server (GPL)

 

本地迴環 地址-h127.0.0.1

 

mysql> mysql -uroot -p -P3306 -h127.0.0.1

預設0006埠和本地伺服器

所以-P3306 和h 也可以不寫

 

退出:exit or quit or \q

 

mysql> mysql -uroot -p -P3306 -h127.0.0.1

    -> \q

Bye

按下鍵盤的上下箭頭,讓命令重新出現,選擇自己需要的命令就行

 

1.5

 

修改MySQL提示符

1》連線客戶端時候通過引數指定:shell>mysql -uroot -proot --prompt 提示符

 

連線上客戶端後,通過prompt命令修改

mysql>prompt提示符

 

C:\Windows\system32>mysql -uroot -p044500 --prompt \h

 

 

提示符:

\D 完整日期

\d 當前資料庫

\h 伺服器名稱

\u 當前使用者

 

root使用者名稱

localhost伺服器名稱

(none)當前資料庫

 

以下是命令列的內容

localhost

localhostprompt mysql

PROMPT set to 'mysql'

mysqlPROMPT \[email protected]\h \d

PROMPT set to '\[email protected]\h \d'

[email protected] (none)USE test

Database changed

[email protected] test

 

 

USE test是還沒有學過的命令

 

1.6

 

MySQL常用命令以及語法規範

 

SELECT VERSION();

顯示當前伺服器版本號

SELECT NOW();

顯示當前時間

SELECT USER();

顯示當前使用者

 

MySQL語句的規範

關鍵字和函式名稱全部大寫

2資料庫名稱,表名稱,欄位名稱全部小寫

3SQL語句必須用分好結尾

 

1.7 操作資料庫

 

系統自帶四個資料庫

建立資料庫:

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name

 

 

大括號是必選項,中括號是可選項,|是從中做個選擇,取出一個就行

 

localhost testSHOW DATABASE;

localhost testSHOW DATABASES;

檢視當前伺服器下的資料庫列表

SHOW {DATABASES | SCHEMAS}

[LIKE 'pattern' | WHERE expr] 

建立資料庫 

[email protected] testCREATE DATABASE IF NOT EXISTS t1;

Query OK, 1 row affected, 1 warning (0.00 sec)

 

[email protected] testSHOW WARNINGS;

 

 

[email protected] testSHOW CREATE DATABASE t1;

 

[email protected] testCREATE DATABASE IF NOT EXISTS t2;

這樣t2就被建立了

 

修改資料庫

ALTER {DATABASE | SCHEMA} [db_name]

[DEFAULT] CHARACTER SET [=] charset_name

 

控制欄:

[email protected] testALTER DATABASE t2 CHARACTER SET = gbk;

 

刪除資料庫

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

刪除時候一定要儲存資料庫的存在。

 

控制欄:

[email protected] testDROP DATABASE t2

    -> ;

Query OK, 0 rows affected (0.01 sec)

如果忘記寫分號,可以在下一行繼續補上分號就行。

 

[email protected] testSHOW DATABASES;

顯示目前的資料庫列表

 

2-1

內容回顧:

MySQL基礎

安裝MySQL

配置MySQL

使用MySQL

 

預設埠號:3306

超級使用者名稱:root

建立資料庫:CREATE DATABASE

修改資料庫:ALTER DATABASE

刪除資料庫:DROP DATABASE

 

2-2 MySQL資料型別之整型

TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT, 

 

2-3 資料型別之浮點型

單精度浮點

FLOAT[(M,D)]

雙精度DOUBLE[(M,D)]

M是數字總位數,D是小數點後面的位數,

 

2-4 資料型別之日期,時間

 

YEAR, TIME, DATE, DATETIME, TIMESTAMP,

 

2-5MySQL資料型別之字元型

 

CHAR(M), VARCHAR(M), TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT, ENUM('value', 'value2',....)

SET('value1', 'value2',...)

 

2-6 

MySQL建立資料表 

 

資料表是其他物件的基礎,二維表格,行,列

行:記錄,

列:欄位

 

USE開啟某個資料庫

USE 資料庫名稱;

 

控制欄登陸資料庫程式碼:

#ntsqk -yriit -p044500 -P3306 -h127.0.0.1

mysql -uroot -p004500 -P3306 -h127.0.0.1

 

USE test;

SELECT DATABASE();

 

 

建立資料表

CREATE TABLE [IF NOT EXISTS] table_name(column_name data_type, ...)

 

控制欄程式碼:

[email protected] testCREATE TABLE tb1(

    -> username VARCHAR(20),

    -> age TINYINT UNSIGNED,

    -> salary FLOAT(8,2) UNSIGNED

    -> );

Query OK, 0 rows affected (0.03 sec)

 

 

2-7 MySQL檢視資料表

 

SHOW TABLES[FROM db_name] [LIKE 'pattern' | WHERE expr]

 

控制欄程式碼:

 

[email protected] testSHOW TABLES;

顯示test使用者裡面的tables

 

[email protected] testSHOW TABLES FROM mysql;

顯示mysql裡面所有的資料表

[email protected] testSELECT DATABASE();

 

2-8 

檢視資料表結構

SHOW COLUMNS FROM tbl_name

控制欄內容:

 

2-9 MySQL記錄的插入與查詢

 

插入記錄:

INSERT [INTO] tbl_name[ (col_name,...)] VALUESE(val,...)

列名字可以省略,但是要給所有列都賦值

 

程式碼:

[email protected] testINSERT tb1 VALUES('Tom', 25);

 

給某部分賦值

程式碼:

INSERT tb1(username,salary) VALUES('JOHN', 9666.68);

 

 

記錄查詢

SELECT expr,... FROM tbl_name

 

程式碼:

SELECT * FROM tb1;

 

 

2-10 MySQL空值與非空 

新增相應屬性

NULL, 欄位值可以為空

NOT NULL, 欄位值禁止為空

 

程式碼:

CREATE TABLE tb2(

username VARCHAR(20) NOT NULL,

age TINYINT UNSIGNED NULL);

 

INSERT tb2 VALUES('tom',NULL);

 

SELECT * FROM tb2;

 

INSERT tb2 VALUES(NULL, 26);

 

2-11 MySQL自動編號

AUTO_INCREMENT

自動編號,必須和主鍵組合使用

預設情況,起始值是1,增量是1,增量為整數,如果是為浮點數,小數位數為零,

 

程式碼:

CREATE TABLE tb3(id SMALLINT UNSIGNED AUTO_INCREMENT, username VARCHAR(30) NOT NULL);

報錯:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto colum

n and it must be defined as a key

必須定義一個主鍵為自動列

 

2-12 MySQL初涉主鍵約束 

主鍵約束

每張資料表只能存在一個主鍵

主鍵保證記錄的唯一性

主鍵自動為NOT NULL

 

程式碼:

CREATE TABLE tb3(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(30) NOT NULL);

 

 

[email protected] testSHOW COLUMNS FROM tb3;

 

INSERT tb3(username) VALUES('TOM');

INSERT tb3(username) VALUES('JOHN');

INSERT tb3(username) VALUES('JOHN');

INSERT tb3(username) VALUES('ROSE');

INSERT tb3(username) VALUES('DIMITAR');

 

SELECT * FROM tb3;

 

程式碼:

CREATE TABLE tb4(id SMALLINT UNSIGNED PRIMARY KEY, username VARCHAR(20) NOT NULL);

 

SHOW COLUMNS FROM tb4;

 

INSERT tb4 VALUES(4,'TOM');

 

INSERT tb4 VALUES(22,'JOHN');

 

SELECT*FROM tb4;

 

2-13 MySQL初涉唯一約束

UNIQUE KEY

唯一約束

保證記錄的唯一性

唯一約束的欄位可以為空值NULL

每張資料表可以存在多個唯一約束

 

程式碼:

CREATE TABLE tb5(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20) NOT NULL UNIQUE KEY, age tinyint UNSIGNED);

 

[email protected] testSHOW COLUMNS FROM tb5;

 

INSERT tb5(username, age) VALUES('Tom',22);

 

2-14

MySQL初涉預設約束

DEFAULT

預設值

當插入記錄時候,如果沒有明確為欄位賦值,則自動賦予預設值

程式碼:

CREATE TABLE tb6(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20) NOT NULL UNIQUE KEY, sex ENUM('1','2','3') DEFAULT '3');

 

作業系統

 

 

程式碼:

SHOW COLUMNS FROM tb6;

 

INSERT tb6(username) VALUES('Tom');

 

SELECT * FROM tb6;

沒有賦值時候,系統預設賦值3

 

2-15 總結

資料型別:字元型,整型,浮點型,日期時間型

SHOW TABLES;

SHOW COLUMNS;

檢視資料表真實結構

 

資料表操作:INSERT插入記錄,SELECT查詢記錄

 

記錄操作:建立資料表,約束的使用

 

3-1 回顧和概述

 

資料表操作:建立,PRIMARY KEY(主鍵約束),UNIQUE KEY(唯一約束),DEFAULT(預設約束),NOT NULL(非空約束)

記錄插入,查詢

 

3-2 MySQL 外來鍵約束的要求解析

約束:

保證資料的一致性和完整性

約束分為表級約束和列級約束

約束型別包括:

非空約束,主鍵約束,唯一約束,預設約束,外來鍵約束FOREIGN KEY

 

外來鍵約束:保證資料一致性,完整性,實現一對一或者一對多關係

 

外來鍵約束的要求:

父表和子表必須使用相同的儲存引擎,而且禁止使用臨時表。

2 資料表的儲存引擎只能為InnoDB

3外來鍵列和參照列必須具有相似的資料型別。數字的長度及是否有符號位必須相同;而字元長度可以不同。

4外來鍵列和參照列必須建立索引。如果外來鍵列不存在索引的話,MySQL將會自動建立索引。

 

具有外來鍵列的表為子表,子表所參照的表為父表

 

外來鍵列:forray參照的列

 

編輯資料表的預設儲存引擎

配置檔案my.ini修改為:default-storage-engine =INNODB

 

 

登陸MySQL客戶端:

mysql -uroot -p044500

 

出現mysql>說明成功登陸了

接著使用資料庫

程式碼:

USE test;

接著建立資料表:

程式碼:

CREATE TABLE provinces(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,pname VARCHAR(20) NOT NULL);

 

檢視預設儲存引擎:

程式碼:

SHOW CREATE TABLE provinces;

 

檢查:外來鍵列和參照列必須具有相似的資料型別。

程式碼:

CREATE TABLE users(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) NOT NULL, pid BIGINT, FOREIGN KEY (pid) REFERENCES provinces (id) );

CREATE TABLE users1(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces (id) ON DELETE CASCADE);

以上是錯誤程式碼,因為資料型別長度和符號都不同。

修改為:

CREATE TABLE users(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username, VARCHAR(20) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces (id) );

pid是省份編號,pname是省份名字

 

判斷是否建立索引:

SHOW INDEXES FROM provinces;

 

SHOW COLUMNS FROM user;

 

3-3 

外來鍵約束的參照操作

3-3

程式碼:

CREATE TABLE users1(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces (id) ON DELETE CASCADE);

mysql> SHOW CREATE TABLE users1;

CASCADE: 從父表刪除或者更新且自動刪除或者更新子表中匹配的行。

SET NULL:從父表刪除或更新行,並設定子表中的外來鍵列為NULL。如果使用該選項,必須保證子表列沒有指定NOT NULL

RESTRICT:拒絕對父表的刪除或者更新操作

NO ACTION:標準SQL的關鍵字,在MySQL中與RESTRICT相同。

 

 

程式碼:

INSERT provinces(pname) VALUES('A');

 

INSERT provinces(pname) VALUES('B');

 

INSERT provinces(pname) VALUES('C');

 

SELECT * FROM provinces;

 

INSERT users1(username,pid) VALUES('Tom', 3);

 

INSERT users1(username,pid) VALUES('Tom',6);

 

INSERT users1(username,pid) VALUES('John',1);

 

INSERT users1(username,pid) VALUES('Rose',3);

 

SELECT * FROM users1;

 

DELETE FROM provinces WHERE id = 3;

 

 

 

3.3結束。

 

3-4 表級約束和列級約束

對一個數據列建立的約束稱為列級約束,

對多個數據列建立的約束稱為表級約束。

列級約束可以在列定義前後生命,表級約束只能在列定義後宣告。

 

3-5

 MySQL 修改資料表-新增/刪除列

新增單列:

ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name]

FIRST表示新增的列在最前面 

AFTER col_name 表示新增的列在col_name後面

沒有FIRST 或者AFTER 新增的列位於所有列的最下面

看一下users1資料表的結構 

程式碼:

mysql> SHOW COLUMNS FROM users1;

 

+----------+----------------------+------+-----+---------+----------------+

| Field    | Type                 | Null | Key | Default | Extra          |

+----------+----------------------+------+-----+---------+----------------+

| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |

| username | varchar(10)          | NO   |     | NULL    |                |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |                |

+----------+----------------------+------+-----+---------+----------------+

3 rows in set (0.01 sec)

新增一列

程式碼:

mysql> ALTER TABLE users1 ADD age TINYINT UNSIGNED NOT NULL DEFAULT 10;

Query OK, 1 row affected (0.05 sec)

Records: 1  Duplicates: 0  Warnings: 0

程式碼:

mysql> SHOW COLUMNS FROM users1;

mysql> SHOW COLUMNS FROM users1;

+----------+----------------------+------+-----+---------+----------------+

| Field    | Type                 | Null | Key | Default | Extra          |

+----------+----------------------+------+-----+---------+----------------+

| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |

| username | varchar(10)          | NO   |     | NULL    |                |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |                |

| age      | tinyint(3) unsigned  | NO   |     | 10      |                |

+----------+----------------------+------+-----+---------+----------------+

4 rows in set (0.02 sec)

看來age確實被新增到了末尾,first可以新增到開頭,after 可以指定新增到某行後面。

 

在username後面新增password:

mysql> ALTER TABLE users1 ADD password VARCHAR(32) NOT NULL AFTER username;

Query OK, 1 row affected (0.06 sec)

Records: 1  Duplicates: 0  Warnings: 0

 

mysql> SHOW COLUMNS FROM users1;

+----------+----------------------+------+-----+---------+----------------+

| Field    | Type                 | Null | Key | Default | Extra          |

+----------+----------------------+------+-----+---------+----------------+

| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |

| username | varchar(10)          | NO   |     | NULL    |                |

| password | varchar(32)          | NO   |     | NULL    |                |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |                |

| age      | tinyint(3) unsigned  | NO   |     | 10      |                |

+----------+----------------------+------+-----+---------+----------------+

5 rows in set (0.04 sec)

 

在頭部新增truename。用first 

mysql> ALTER TABLE users1 ADD truename VARCHAR(20) NOT NULL FIRST;

Query OK, 1 row affected (0.07 sec)

Records: 1  Duplicates: 0  Warnings: 0

 

mysql> SHOW COLUMNS FROM users1;

+----------+----------------------+------+-----+---------+----------------+

| Field    | Type                 | Null | Key | Default | Extra          |

+----------+----------------------+------+-----+---------+----------------+

| truename | varchar(20)          | NO   |     | NULL    |                |

| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |

| username | varchar(10)          | NO   |     | NULL    |                |

| password | varchar(32)          | NO   |     | NULL    |                |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |                |

| age      | tinyint(3) unsigned  | NO   |     | 10      |                |

+----------+----------------------+------+-----+---------+----------------+

6 rows in set (0.04 sec)

 

新增多列只可以在列的最後依次新增,不可以隨機新增。

 

刪除列:

ALTER TABLE tbl_name DROP [COLUMN] col_name 

刪除一個

mysql> ALTER TABLE users1 DROP truename;

Query OK, 1 row affected (0.04 sec)

Records: 1  Duplicates: 0  Warnings: 0

一次刪除兩個列。

mysql> ALTER TABLE users1 DROP password, DROP age;

Query OK, 1 row affected (0.05 sec)

Records: 1  Duplicates: 0  Warnings: 0

 

3.5結束

3-6  MySQL 修改資料表--新增約束

 

新增主鍵約束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)

建立一張廢表users2

 

mysql> CREATE TABLE users2(

    -> username VARCHAR(10) NOT NULL,

    -> pid SMALLINT UNSIGNED);

Query OK, 0 rows affected (0.02 sec)

 

mysql> SHOW CREATE TABLE users2;

+--------+----------------------------------------------------------------------

---------------------------------------------------------------------+

| Table  | Create Table

                                                                     |

+--------+----------------------------------------------------------------------

---------------------------------------------------------------------+

| users2 | CREATE TABLE `users2` (

  `username` varchar(10) NOT NULL,

  `pid` smallint(5) unsigned DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+----------------------------------------------------------------------

---------------------------------------------------------------------+

1 row in set (0.00 sec)

 

這個表目前沒有主鍵,下面新增主鍵。

mysql> ALTER TABLE users2 ADD id smallint unsigned;

Query OK, 0 rows affected (0.15 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   |     | NULL    |       |

| pid      | smallint(5) unsigned | YES  |     | NULL    |       |

| id       | smallint(5) unsigned | YES  |     | NULL    |       |

+----------+----------------------+------+-----+---------+-------+

3 rows in set (0.01 sec)

 

把id設定成主鍵: PK是主鍵primary key的意思

mysql> ALTER TABLE users2 ADD CONSTRAINT PK_user2_id PRIMARY KEY(id);

Query OK, 0 rows affected (0.04 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   |     | NULL    |       |

| pid      | smallint(5) unsigned | YES  |     | NULL    |       |

| id       | smallint(5) unsigned | NO   | PRI | 0       |       |

+----------+----------------------+------+-----+---------+-------+

3 rows in set (0.02 sec)

 

新增唯一約束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name, ...)

假設為username新增唯一約束

程式碼:

mysql> ALTER TABLE users2 ADD UNIQUE (username);

Query OK, 0 rows affected (0.06 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW CREATE TABLE users2;

+--------+---------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

-------------------+

| Table  | Create Table

 

 

                   |

+--------+---------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

-------------------+

| users2 | CREATE TABLE `users2` (

  `username` varchar(10) NOT NULL,

  `pid` smallint(5) unsigned DEFAULT NULL,

  `id` smallint(5) unsigned NOT NULL DEFAULT '0',

  PRIMARY KEY (`id`),

  UNIQUE KEY `username` (`username`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+---------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

-------------------+

1 row in set (0.00 sec)

 

新增外來鍵約束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition

 

 

mysql> SHOW COLUMNS FROM provinces;

+-------+----------------------+------+-----+---------+----------------+

| Field | Type                 | Null | Key | Default | Extra          |

+-------+----------------------+------+-----+---------+----------------+

| id    | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |

| pname | varchar(20)          | NO   |     | NULL    |                |

+-------+----------------------+------+-----+---------+----------------+

2 rows in set (0.01 sec)

 

mysql> ALTER TABLE users2 ADD FOREIGN KEY (pid) REFERENCES provinces (id)

Query OK, 0 rows affected (0.03 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW CREATE TABLE users2;

+--------+---------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

----------------------------------------+

| Table  | Create Table

 

 

 

                                        |

+--------+---------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

----------------------------------------+

| users2 | CREATE TABLE `users2` (

  `username` varchar(10) NOT NULL,

  `pid` smallint(5) unsigned DEFAULT NULL,

  `id` smallint(5) unsigned NOT NULL DEFAULT '0',

  PRIMARY KEY (`id`),

  UNIQUE KEY `username` (`username`),

  KEY `pid` (`pid`),

  CONSTRAINT `users2_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `provinces` (

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+---------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

-------------------------------------------------------------------------

----------------------------------------+

1 row in set (0.00 sec)

 

 

新增/刪除 預設約束 

ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

給users2新增表age,

mysql> ALTER TABLE users2 ADD age TINYINT UNSIGNED NOT NULL;

Query OK, 0 rows affected (0.07 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

顯示所有的 列 

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   | UNI | NULL    |       |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |       |

| id       | smallint(5) unsigned | NO   | PRI | 0       |       |

| age      | tinyint(3) unsigned  | NO   |     | NULL    |       |

+----------+----------------------+------+-----+---------+-------+

4 rows in set (0.05 sec)

改變users2表裡面的age列為預設15,

mysql> ALTER TABLE users2 ALTER age SET DEFAULT 15;

Query OK, 0 rows affected (0.03 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

顯示錶users2裡面的列

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   | UNI | NULL    |       |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |       |

| id       | smallint(5) unsigned | NO   | PRI | 0       |       |

| age      | tinyint(3) unsigned  | NO   |     | 15      |       |

+----------+----------------------+------+-----+---------+-------+

4 rows in set (0.02 sec)

刪除表users2裡面的age

mysql> ALTER TABLE users2 ALTER age DROP DEFAULT;

Query OK, 0 rows affected (0.04 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   | UNI | NULL    |       |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |       |

| id       | smallint(5) unsigned | NO   | PRI | 0       |       |

| age      | tinyint(3) unsigned  | NO   |     | NULL    |       |

+----------+----------------------+------+-----+---------+-------+

4 rows in set (0.03 sec)

 

3.6結束

3-7 MySQL 修改資料表--刪除約束

 

刪除主鍵約束 

ALTER TABLE tbl_name DROP PRIMARY KEY

主鍵後面沒有加名稱,因為任何資料表有且僅有一個主鍵

mysql> ALTER TABLE users2 DROP PRIMARY KEY;

Query OK, 0 rows affected (0.04 sec)

Records: 0  Duplicates: 0  Warnings: 0

檢視資料表的結構:

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   | PRI | NULL    |       |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |       |

| id       | smallint(5) unsigned | NO   |     | 0       |       |

| age      | tinyint(3) unsigned  | NO   |     | NULL    |       |

+----------+----------------------+------+-----+---------+-------+

4 rows in set (0.01 sec)

確實沒有了主鍵id

 

 

刪除唯一約束:

ALTER TABLE tbl_name DROP {INDEX|KEY} index_name

 

 

mysql> SHOW INDEXES FROM users2;

+--------+------------+----------+--------------+-------------+-----------+-----

--------+----------+--------+------+------------+---------+---------------+

| Table  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Card

inality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |

+--------+------------+----------+--------------+-------------+-----------+-----

--------+----------+--------+------+------------+---------+---------------+

| users2 |          0 | username |            1 | username    | A         |

      0 |     NULL | NULL   |      | BTREE      |         |               |

| users2 |          1 | pid      |            1 | pid         | A         |

      0 |     NULL | NULL   | YES  | BTREE      |         |               |

+--------+------------+----------+--------------+-------------+-----------+-----

--------+----------+--------+------+------------+---------+---------------+

2 rows in set (0.00 sec)

 

 

用網格的形式表現

mysql> SHOW INDEXES FROM users2\G;

*************************** 1. row ***************************

        Table: users2

   Non_unique: 0

     Key_name: username

 Seq_in_index: 1

  Column_name: username

    Collation: A

  Cardinality: 0

     Sub_part: NULL

       Packed: NULL

         Null:

   Index_type: BTREE

      Comment:

Index_comment:

*************************** 2. row ***************************

        Table: users2

   Non_unique: 1

     Key_name: pid

 Seq_in_index: 1

  Column_name: pid

    Collation: A

  Cardinality: 0

     Sub_part: NULL

       Packed: NULL

         Null: YES

   Index_type: BTREE

      Comment:

Index_comment:

2 rows in set (0.00 sec)

 

ERROR:

No query specified

 

刪除 username 

mysql> ALTER TABLE users2 DROP INDEX username;

Query OK, 0 rows affected (0.06 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| username | varchar(10)          | NO   |     | NULL    |       |

| pid      | smallint(5) unsigned | YES  | MUL | NULL    |       |

| id       | smallint(5) unsigned | NO   |     | 0       |       |

| age      | tinyint(3) unsigned  | NO   |     | NULL    |       |

+----------+----------------------+------+-----+---------+-------+

4 rows in set (0.02 sec)

顯示 索引,發現username確實不見了。 

mysql> SHOW INDEXES FROM users2\G;

*************************** 1. row ***************************

        Table: users2

   Non_unique: 1

     Key_name: pid

 Seq_in_index: 1

  Column_name: pid

    Collation: A

  Cardinality: 0

     Sub_part: NULL

       Packed: NULL

         Null: YES

   Index_type: BTREE

      Comment:

Index_comment:

1 row in set (0.00 sec)

 

ERROR:

No query specified

 

 

刪除外來鍵約束 

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol

 

mysql> SHOW CREATE TABLE users2;

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

------------------+

| Table  | Create Table

 

 

 

                  |

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

------------------+

| users2 | CREATE TABLE `users2` (

  `username` varchar(10) NOT NULL,

  `pid` smallint(5) unsigned DEFAULT NULL,

  `id` smallint(5) unsigned NOT NULL DEFAULT '0',

  `age` tinyint(3) unsigned NOT NULL,

  KEY `pid` (`pid`),

  CONSTRAINT `users2_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `provinces` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

------------------+

1 row in set (0.00 sec)

 

 

users2_ibfk_1是上表已經告訴我們的內容,直接拿來用就行

 

刪除外來鍵約束:

mysql> ALTER TABLE users2 DROP FOREIGN KEY users2_ibfk_1;

Query OK, 0 rows affected (0.06 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

 

mysql> SHOW CREATE TABLE users2;

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

------------------+

| Table  | Create Table

 

 

                  |

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

------------------+

| users2 | CREATE TABLE `users2` (

  `username` varchar(10) NOT NULL,

  `pid` smallint(5) unsigned DEFAULT NULL,

  `id` smallint(5) unsigned NOT NULL DEFAULT '0',

  `age` tinyint(3) unsigned NOT NULL,

  KEY `pid` (`pid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

------------------+

1 row in set (0.00 sec)

 

mysql> ALTER TABLE users2 DROP INDEX pid;

Query OK, 0 rows affected (0.05 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> SHOW CREATE TABLE users2;

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

-----------------------------------------------------------------------------+

| Table  | Create Table

 

                                                                             |

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

-----------------------------------------------------------------------------+

| users2 | CREATE TABLE `users2` (

  `username` varchar(10) NOT NULL,

  `pid` smallint(5) unsigned DEFAULT NULL,

  `id` smallint(5) unsigned NOT NULL DEFAULT '0',

  `age` tinyint(3) unsigned NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+--------+----------------------------------------------------------------------

--------------------------------------------------------------------------------

-----------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

 

3.7 結束

3-8 MySQL 修改資料表--修改列定義和更名資料表

修改列定義:

ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]

 

移動id到第一行:

mysql> ALTER TABLE users2 MODIFY id SMALLINT UNSIGNED NOT NULL FIRST;

Query OK, 0 rows affected (0.03 sec)

Records: 0  Duplicates: 0  Warnings: 0

顯示移動的效果:

mysql> SHOW COLUMNS FROM users2;

+----------+----------------------+------+-----+---------+-------+

| Field    | Type                 | Null | Key | Default | Extra |

+----------+----------------------+------+-----+---------+-------+

| id       | smallint(5) unsigned | NO   |     | NULL    |       |

| username | varchar(10)          | NO   |     | NULL    |       |

| pid      | smallint(5) unsigned | YES  |     | NULL    |       |

| age      | tinyint(3) unsigned  | NO   |     | NULL    |       |

+----------+----------------------+------+-----+---------+-------+

4 rows in set (0.03 sec)

 

修改id的型別為TINYINT程式碼:

mysql> ALTER TABLE users2 MODIFY id TINYINT UNSIGNED NOT NULL;

 

由大型別轉為小型別,可能造成資料丟失,因為儲存範圍會縮小。

 

修改列名稱:

ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new _col_name column_definition [FIRST | AFTER col_name]

 

pid名字改為p_id

mysql> ALTER TABLE users2 CHANGE pid p_id TINYINT UNSIGNED NOT NULL;

 

資料表更名:

方法1:

ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name

 

方法2:

RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2]...

 

修改users2名字為users3程式碼:

mysql> ALTER TABLE users2 RENAME users3;

Query OK, 0 rows affected (0.03 sec)

檢視資料庫test裡面所有的table,發現users2確實不見了。

mysql> SHOW TABLES;

+----------------+

| Tables_in_test |

+----------------+

| provinces      |

| tb1            |

| tb2            |

| tb3            |

| tb4            |

| tb5            |

| tb6            |

| users1         |

| users3         |

+----------------+

9 rows in set (0.00 sec)

 

 

把users3又更名回來users2程式碼:

mysql> RENAME TABLE users3 TO users2;

 

 

注意:儘可能少使用資料列和資料表的更名。

3.8總結

約束:

按照功能劃分為:

NOT NULL, PRIMARY KEY, UNIQUE KEY, DEFAULT, FOREIGN KEY

按照資料列的數目化為:

表級約束和列級約束

 

修改資料表:

針對欄位的操作:新增,刪除欄位,修改列定義,修改列名稱等。

針對約束的操作:新增刪除各種約束

針對資料表的操作:資料表更名的兩種方式

 

 

3-9 小結

 

4-1 回顧和概述

 

4-2 MySQL 插入記錄INSERT

插入記錄

INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr|DEFAULT},...),(...),...

 

建立一個表users程式碼:

mysql> CREATE TABLE users(

    ->

    -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

    -> username VARCHAR(20) NOT NULL,

    -> password VARCHAR(20) NOT NULL,

    -> age TINYINT UNSIGNED NOT NULL DEFAULT 10,

    -> sex BOOLEAN

    -> );

Query OK, 0 rows affected (0.03 sec)

 

插入一個值程式碼:

mysql> INSERT users VALUES(NULL, 'Tom', '123', 25, 1);

顯示剛才輸入的內容,程式碼:

mysql> SELECT * FROM users;

+----+----------+----------+-----+------+

| id | username | password | age | sex  |

+----+----------+----------+-----+------+

|  1 | Tom      | 123      |  25 |    1 |

+----+----------+----------+-----+------+

1 row in set (0.00 sec)

 

mysql> INSERT users VALUES(NULL, 'John', '456', 25, 1);

Query OK, 1 row affected (0.01 sec)

 

mysql> INSERT users VALUES(DEFAULT, 'John', '456', 25, 1);

Query OK, 1 row affected (0.01 sec)

可以用表示式:3*7+4

mysql> INSERT users VALUES(DEFAULT, 'John', '456', 3*7+4, 1);

Query OK, 1 row affected (0.01 sec)

預設值:

mysql> INSERT users VALUES(DEFAULT, 'John', '456', DEFAULT, 1);

 

該方法還可以一次性插入多條記錄:

mysql> INSERT users VALUES(DEFAULT, 'John', '456', DEFAULT, 1),(NULL, 'John', '456', 25, 1);

 

 

4-3 MySQL 插入記錄INSERT SET-SELECT

 

插入記錄

INSERT [INTO] tbl_name SET col_name = {expr | DEFAULT}, ...

這種方法可以使用子查詢(subquery)

由比較運算子引發的子查詢。

這種方法一次只能插入一條記錄,

 

 

mysql> INSERT users SET username = 'Ben', password = '456';

 

插入記錄

INSERT [INTO] tbl_name [(col_name,...)] SELECT...

這種方法可以把查詢結果插入到指定資料表中

 

4-4  MySQL 單表更新記錄UPDATE

 

更新記錄(單表更新)

UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}]...[where where_condition]

 

讓表中所有年齡都加上5歲,程式碼:

mysql> UPDATE users set age = age + 5;

Query OK, 6 rows affected (0.01 sec)

Rows matched: 6  Changed: 6  Warnings: 0

 

更改所有年齡減去前面的序號,更改性別為1,程式碼:

mysql> UPDATE users SET age = age - id, sex = 0;

 

更新年齡加上10歲,當取餘數為0才執行的程式碼:

mysql> UPDATE users SET age = age + 10 WHERE id % 2 =0;

 

4-5 MySQL 單表刪除記錄DELETE

刪除記錄:(單標刪除)

DELETE FROM tbl_name [WHERE where_condition]

 

刪除第六條記錄程式碼:

mysql> DELETE FROM users WHERE id = 6;

 

插入一條記錄,id號碼到底為什麼?程式碼:

mysql> INSERT users VALUES(null, '111','222',33,NULL);

Query OK, 1 row affected (0.01 sec)

發現程式碼號在原來的基礎上加1了