PhoneRescue for Mac(iOS資料恢復軟體)中文版
MySQL資料庫
在SQL語言中,資料庫相當於資料夾。
1.檢視資料庫
- 檢視所有資料庫
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test01 | +--------------------+ 5 rows in set (0.16 sec)
- 檢視資料庫定義
mysql> show create database test01; +----------+--------------------------------------------------------------------+ | Database | Create Database | +----------+--------------------------------------------------------------------+ | test01 | CREATE DATABASE `test01` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ | +----------+--------------------------------------------------------------------+ 1 row in set (0.00 sec)
- 檢視正在使用的資料庫
mysql> use test01; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select database(); +------------+ | database() | +------------+ | test01 | +------------+ 1 row in set (0.00 sec)
2.建立資料庫
- 釋義
1.<資料庫名>:建立資料庫的名稱。MySQL 的資料儲存區將以目錄方式表示 MySQL 資料庫,因此資料庫名稱必須符合作業系統的資料夾命名規則,不能以數字開頭,儘量要有實際意義。注意在 MySQL 中不區分大小寫。
2.IF NOT EXISTS:在建立資料庫之前進行判斷,只有該資料庫目前尚不存在時才能執行操作。此選項可以用來避免資料庫已經存在而重複建立的錯誤。
3.[DEFAULT] CHARACTER SET:指定資料庫的字符集。指定字符集的目的是為了避免在資料庫中儲存的資料出現亂碼的情況。如果在建立資料庫時不指定字符集,那麼就使用系統的預設字符集。
4.[DEFAULT] COLLATE:指定字符集的預設校對規則。
- 格式
CREATE DATABASE [IF NOT EXISTS] <資料庫名>
[[DEFAULT] CHARACTER SET <字符集名>]
[[DEFAULT] COLLATE <校對規則名>];
- 案例
mysql> CREATE DATABASE IF NOT EXISTS world CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test01 |
| world |
+--------------------+
6 rows in set (0.00 sec)
3.修改資料庫
在 MySQL 資料庫中只能對資料庫使用的字符集和校對規則進行修改,資料庫的這些特性都儲存在 db.opt 檔案中。
注:字符集和校驗規則是儲存資料庫的一種方式。
在 MySQL 中,可以使用 ALTER DATABASE 來修改已經被建立或者存在的資料庫的相關引數。
修改資料庫的語法格式為:
ALTER DATABASE [資料庫名] {
[ DEFAULT ] CHARACTER SET <字符集名> |
[ DEFAULT ] COLLATE <校對規則名>}
#語法說明如下:
1.ALTER DATABASE 用於更改資料庫的全域性特性。
2.使用 ALTER DATABASE 需要獲得資料庫 ALTER 許可權。
3.資料庫名稱可以忽略,此時語句對應於預設資料庫(最新指定資料庫)。
4.CHARACTER SET 子句用於更改預設的資料庫字符集。
- 案例
mysql> show create database world;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| world | CREATE DATABASE `world` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> ALTER DATABASE world
-> CHARACTER SET utf8mb4
-> COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> show create database world;
+----------+-------------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------------+
| world | CREATE DATABASE `world` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)
4.指定資料庫
在 MySQL 中就有很多系統自帶的資料庫,那麼在操作資料庫之前就必須要確定是哪一個資料庫。在 MySQL 中,USE 語句用來完成一個數據庫到另一個數據庫的跳轉。
當用 CREATE DATABASE 語句建立資料庫之後,該資料庫不會自動成為當前資料庫,需要用 USE 來指定當前資料庫。其語法格式為:
USE [資料庫名稱];
#注:該語句可以通知 MySQL 把<資料庫名>所指示的資料庫作為當前資料庫。該資料庫保持為預設資料庫,直到語段的結尾,或者直到遇見一個不同的 USE 語句。只有使用 USE 語句來指定某個資料庫作為當前資料庫之後,才能對該資料庫及其儲存的資料物件執行操作。
- 案例
mysql> use test01;
Database changed
5.刪除資料庫
當資料庫不再使用時應該將其刪除,以確保資料庫儲存空間中存放的是有效資料。刪除資料庫是將已經存在的資料庫從磁碟空間上清除,清除之後,資料庫中的所有資料也將一同被刪除。
在 MySQL 中,當需要刪除已建立的資料庫時,可以使用 DROP DATABASE 語句。
其語法格式為:
DROP DATABASE [ IF EXISTS ] <資料庫名>
#語法說明如下:
1.<資料庫名>:指定要刪除的資料庫名。
2.IF EXISTS:用於防止當資料庫不存在時發生錯誤。
3.DROP DATABASE:刪除資料庫中的所有表格並同時刪除資料庫。使用此語句時要非常小心,以免錯誤刪除。如果要使用 DROP DATABASE,需要獲得資料庫 DROP 許可權。
- 案例
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test01 |
| world |
+--------------------+
6 rows in set (0.00 sec)
mysql> drop database world;
Query OK, 0 rows affected (0.35 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test01 |
+--------------------+
5 rows in set (0.00 sec)
注意:MySQL 安裝後,系統會自動建立名為 information_schema 和 mysql 的兩個系統資料庫,系統資料庫存放一些和資料庫相關的資訊,如果刪除了這兩個資料庫,MySQL 將不能正常工作。
6.資料庫註釋
1)單行註釋可以使用#註釋符,#註釋符後直接加註釋內容。
格式如下:
#註釋內容
單行註釋使用註釋符#的示例如下:
#從結果中刪除重複行
SELECT DISTINCT product_id, purchase_price FROM Product;
2)單行註釋可以使用--註釋符,--註釋符後需要加一個空格,註釋才能生效。
格式如下:
-- 註釋內容
單行註釋使用註釋符--的示例如下:
-- 從結果中刪除重複行
SELECT DISTINCT product_id, purchase_price FROM Product;
#和--的區別就是:#後面直接加註釋內容,而--的第 2 個破折號後需要跟一個空格符在加註釋內容。
3)MySQL 多行註釋
多行註釋使用/ /註釋符。/用於註釋內容的開頭,*/用於註釋內容的結尾。
多行註釋格式如下:*
/*
第一行註釋內容
第二行註釋內容
*/
MySQL資料庫中的資料型別
資料型別(data_type)是指系統中所允許的資料的型別。MySQL 資料型別定義了列中可以儲存什麼資料以及該資料怎樣儲存的規則。
資料庫中的每個列都應該有適當的資料型別,用於限制或允許該列中儲存的資料。例如,列中儲存的為數字,則相應的資料型別應該為數值型別。
如果使用錯誤的資料型別可能會嚴重影響應用程式的功能和效能,所以在設計表時,應該特別重視資料列所用的資料型別。更改包含資料的列不是一件小事,這樣做可能會導致資料丟失。因此,在建立表時必須為每個列設定正確的資料型別和長度。
MySQL 的資料型別有大概可以分為 5 種,分別是整數型別、浮點數型別和定點數型別、日期和時間型別、字串型別、二進位制型別等。
1.MySQL整數型別
整數型別又稱數值型資料,數值型資料型別主要用來儲存數字。
MySQL 提供了多種數值型資料型別,不同的資料型別提供不同的取值範圍,可以儲存的值範圍越大,所需的儲存空間也會越大。
MySQL 主要提供的整數型別有 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,其屬性欄位可以新增 AUTO_INCREMENT 自增約束條件。
下表中列出了 MySQL 中的數值型別。
型別名稱 | 說明 | 儲存需求 |
---|---|---|
TINYINT | 很小的整數 | 1個位元組 |
SMALLINT | 小的整數 | 2個宇節 |
MEDIUMINT | 中等大小的整數 | 3個位元組 |
INT (INTEGHR) | 普通大小的整數 | 4個位元組 |
BIGINT | 大整數 | 8個位元組 |
從上表中可以看到,不同型別的整數儲存所需的位元組數不相同,佔用位元組數最小的是 TINYINT 型別,佔用位元組最大的是 BIGINT 型別,佔用的位元組越多的型別所能表示的數值範圍越大。
根據佔用位元組數可以求出每一種資料型別的取值範圍。例如,TINYINT 需要 1 個位元組(8bit)來儲存,那麼 TINYINT 無符號數的最大值為 28-1,即 255;TINYINT 有符號數的最大值為 27-1,即 127。其他型別的整數的取值範圍計算方法相同,
如下表所示。
型別名稱 | 說明 | 儲存需求 |
---|---|---|
TINYINT | -128〜127 | 0 〜255 |
SMALLINT | -32768〜32767 | 0〜65535 |
MEDIUMINT | -8388608〜8388607 | 0〜16777215 |
INT (INTEGER) | -2147483648〜2147483647 | 0〜4294967295 |
BIGINT | -9223372036854775808〜9223372036854775807 | 0〜18446744073709551615 |
- 測試int資料型別
#用utf8mb4建立world庫
mysql> CREATE DATABASE world CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)
#建表;
mysql> use world;
Database changed
mysql> CREATE TABLE t2(id int);
Query OK, 0 rows affected (0.17 sec)
#檢視建表語句
mysql> show create table t2;
+-------+-----------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------+
| t2 | CREATE TABLE `t2` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
#查看錶結構
mysql> desc t2;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
#插入資料
mysql> insert t2 values('-2147483647');
Query OK, 1 row affected (0.00 sec)
mysql> insert t2 values('123212321');
Query OK, 1 row affected (0.00 sec)
#插入的資料超出int類型範圍
mysql> insert t2 values('-2147483649');
ERROR 1264 (22003): Out of range value for column 'id' at row 1
#插入的資料超出int型別長度
mysql> insert t2 values('12321232112');
ERROR 1264 (22003): Out of range value for column 'id' at row 1
2.MySQL小數型別
MySQL 中使用浮點數和定點數來表示小數。
浮點型別有兩種,分別是單精度浮點數(FLOAT)和雙精度浮點數(DOUBLE);定點型別只有一種,就是 DECIMAL。
浮點型別和定點型別都可以用(M, D)來表示,其中M稱為精度,表示總共的位數;D稱為標度,表示小數的位數。
浮點數型別的取值範圍為 M(1~255)和 D(1~30,且不能大於 M-2),分別表示顯示寬度和小數位數。M 和 D 在 FLOAT 和DOUBLE 中是可選的,FLOAT 和 DOUBLE 型別將被儲存為硬體所支援的最大精度。DECIMAL 的預設 D 值為 0、M 值為 10。
下表中列出了 MySQL 中的小數型別和儲存需求。
型別名稱 | 說明 | 儲存需求 |
---|---|---|
FLOAT | 單精度浮點數 | 4 個位元組 |
DOUBLE | 雙精度浮點數 | 8 個位元組 |
DECIMAL (M, D) | 壓縮的“嚴格”定點數 | M+2 個位元組 |
DECIMAL 型別不同於 FLOAT 和 DOUBLE。DOUBLE 實際上是以字串的形式存放的,DECIMAL 可能的最大取值範圍與 DOUBLE 相同,但是有效的取值範圍由 M 和 D 決定。如果改變 M 而固定 D,則取值範圍將隨 M 的變大而變大。
從上表中可以看到,DECIMAL 的儲存空間並不是固定的,而由精度值 M 決定,佔用 M+2 個位元組。
FLOAT 型別的取值範圍如下:
- 有符號的取值範圍:-3.402823466E+38~-1.175494351E-38。
- 無符號的取值範圍:0 和 -1.175494351E-38~-3.402823466E+38。
DOUBLE 型別的取值範圍如下:
- 有符號的取值範圍:-1.7976931348623157E+308~-2.2250738585072014E-308。
- 無符號的取值範圍:0 和 -2.2250738585072014E-308~-1.7976931348623157E+308。
3、MySQL字串型別
字串型別用來儲存字串資料,還可以儲存圖片和聲音的二進位制資料。字串可以區分或者不區分大小寫的串比較,還可以進行正則表示式的匹配查詢。
MySQL 中的字串型別有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。
下表中列出了 MySQL 中的字串資料型別,括號中的M表示可以為其指定長度。
型別名稱 | 說明 | 儲存需求 |
---|---|---|
CHAR(M) | 固定長度非二進位制字串 | M 位元組,1<=M<=255 |
VARCHAR(M) | 變長非二進位制字串 | L+1位元組,在此,L< = M和 1<=M<=255 |
TINYTEXT | 非常小的非二進位制字串 | L+1位元組,在此,L<2^8 |
TEXT | 小的非二進位制字串 | L+2位元組,在此,L<2^16 |
MEDIUMTEXT | 中等大小的非二進位制字串 | L+3位元組,在此,L<2^24 |
LONGTEXT | 大的非二進位制字串 | L+4位元組,在此,L<2^32 |
ENUM | 列舉型別,只能有一個列舉字串值 | 1或2個位元組,取決於列舉值的數目 (最大值為65535) |
VARCHAR 和 TEXT 型別是變長型別,其儲存需求取決於列值的實際長度(在前面的表格中用 L 表示),而不是取決於型別的最大可能尺寸。
例如,一個 VARCHAR(10) 列能儲存一個最大長度為 10 個字元的字串,實際的儲存需要字串的長度 L 加上一個位元組以記錄字串的長度。對於字元 “abcd”,L 是 4,而儲存要求 5 個位元組。
- 測試char和varchar型別
#建表
mysql> CREATE TABLE t1(id int,name varchar(12));
Query OK, 0 rows affected (0.01 sec)
#插入資料
mysql> INSERT INTO t1 values('1','張三');
Query OK, 1 row affected (0.00 sec)
#字元超過資料型別的限制值
mysql> INSERT INTO t1 values('2','zhangsanlinsi');
ERROR 1406 (22001): Data too long for column 'name' at row 1
- 測試enum型別
#建表
mysql> CREATE TABLE t3(id int,name varchar(10),sex enum('man','girl'));
Query OK, 0 rows affected (0.32 sec)
#插入資料
mysql> INSERT INTO t3 values('1','張三','man');
Query OK, 1 row affected (0.00 sec)
#列舉型別,只能插入指定的值,不能插入額外的值
mysql> INSERT INTO t3 values('1','李四','nan');
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
- 建表測試
#建學生表
mysql> CREATE TABLE student(id int,name varchar(10),sex enum('男','女'),age tinyint,cometime datetime);
Query OK, 0 rows affected (0.01 sec)
#插入資料
mysql> INSERT INTO student values('1','張三','男','19',now());
Query OK, 1 row affected (0.01 sec)
#檢視
mysql> select * from student;
+------+--------+------+------+---------------------+
| id | name | sex | age | cometime |
+------+--------+------+------+---------------------+
| 1 | 張三 | 男 | 19 | 2021-09-28 11:13:11 |
+------+--------+------+------+---------------------+
1 row in set (0.00 sec)
4.建表的資料屬性
not null: 非空
primary key: 主鍵(唯一且非空的)
auto_increment: 自增(此列必須是:primary key或者unique key)
unique key: 唯一鍵(單獨的唯一的)
default: 預設值
unsigned: 非負數
comment: 註釋
- 案例
#建表
mysql> CREATE TABLE student(
-> id int unsigned primary key auto_increment comment '學生id',
-> name varchar(10) not null comment '學會姓名',
-> sex enum('男','女') default '男' comment '性別',
-> age tinyint unsigned comment '年齡',
-> cometime datetime default now() comment '入學時間',
-> class varchar(12) not null comment '班級',
-> status enum('0','1') default 1 comment '狀態');
Query OK, 0 rows affected (0.39 sec)
#檢視建表語句
mysql> show create table student;
| student | CREATE TABLE `student` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '學生id',
`name` varchar(10) NOT NULL COMMENT '學會姓名',
`sex` enum('男','女') DEFAULT '男' COMMENT '性別',
`age` tinyint(3) unsigned DEFAULT NULL COMMENT '年齡',
`cometime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '入學時間',
`class` varchar(12) NOT NULL COMMENT '班級',
`status` enum('0','1') DEFAULT '0' COMMENT '狀態',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
1 row in set (0.00 sec)
#插入資料
mysql> INSERT INTO student(name,class) values('張三','高二3班');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO student(name,class) values('李四','高二3班');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO student(name,class) values('林五','高二3班');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO student(name,sex,age,class) values('楊雪','女','16','高二3班');
Query OK, 1 row affected (0.01 sec)
#檢視資料
mysql> select * from student;
+----+--------+------+------+---------------------+------------+--------+
| id | name | sex | age | cometime | class | status |
+----+--------+------+------+---------------------+------------+--------+
| 1 | 張三 | 男 | NULL | 2021-09-28 11:26:42 | 高二3班 | 0 |
| 2 | 李四 | 男 | NULL | 2021-09-28 11:27:33 | 高二3班 | 0 |
| 3 | 林五 | 男 | NULL | 2021-09-28 11:28:11 | 高二3班 | 0 |
| 4 | 楊雪 | 女 | 16 | 2021-09-28 11:32:25 | 高二3班 | 0 |
+----+--------+------+------+---------------------+------------+--------+
4 rows in set (0.00 sec)
5.MySQL日期和時間
MySQL 中有多處表示日期的資料型別:YEAR、TIME、DATE、DTAETIME、TIMESTAMP。當只記錄年資訊的時候,可以只使用 YEAR 型別。
每一個型別都有合法的取值範圍,當指定確定不合法的值時,系統將“零”值插入資料庫中。
下表中列出了 MySQL 中的日期與時間型別。
型別名稱 | 日期格式 | 日期範圍 | 儲存需求 |
---|---|---|---|
YEAR | YYYY | 1901 ~ 2155 | 1 個位元組 |
TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 3 個位元組 |
DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-3 | 3 個位元組 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8 個位元組 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC | 4 個位元組 |
- 案例
mysql> create table d1(id int,name char, date1 date, date2 time, date3 datetime, date4 timestamp,date5 year);
Query OK, 0 rows affected (0.12 sec)
mysql> insert into d1 values (1, '1', '2021-09-09','12:12:12','2021-09-09','2021-09-09','2021');
Query OK, 1 row affected (0.00 sec)
mysql> select * from d1;
+------+------+------------+----------+---------------------+---------------------+-------+
| id | name | date1 | date2 | date3 | date4 | date5 |
+------+------+------------+----------+---------------------+---------------------+-------+
| 1 | 1 | 2021-09-09 | 12:12:12 | 2021-09-09 00:00:00 | 2021-09-09 00:00:00 | 2021 |
+------+------+------------+----------+---------------------+---------------------+-------+
1 row in set (0.00 sec)
datetime 和 timestamp 之間的區別?
1、兩者的儲存方式不一樣
對於TIMESTAMP,它把客戶端插入的時間從當前時區轉化為UTC(世界標準時間)進行儲存。查詢時,將其又轉化為客戶端當前時區進行返回。
對於DATETIME,不做任何改變,基本上是原樣輸入和輸出。
2、兩者所能儲存的時間範圍不一樣
timestamp所能儲存的時間範圍為:‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’。
datetime所能儲存的時間範圍為:‘1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。
mysql> insert into t1 values (1, '1', '2021-09-09','12:12:12','2221-09-09 12','2221-09-09','2021');
1292 - Incorrect datetime value: '2221-09-09' for column 'date4' at row 1