今日目標
-
表的創建
-
數據庫的數據類型
-
表的約束
-
表結構的修改和調整
-
數據庫的權限管理
-
單表的數據的CRUD
sql的一些規范
SQL的分類
SQL腳本注意點
SQL的注釋
ISO提出SQL官方注釋:
1、多行注釋
/* */
2、當行注釋
-- 注釋 注意,空格是必不可少的!!!
MySQL自身提供一種注釋
后面寫注釋
數據庫相關內容的補充
# 查出數據庫創建的一些信息
show create database db_name;
? # 如果在命令行中,返回SQL很長,導致換行,看起來不太方便時
show create database db_name\G
show指令可以使用模糊查詢
show xxx xxx xx [like 'xx%xxx']; ?
數據編碼校驗集
CREATE DATABASE [if not exists ] `db_zm` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci
表的創建
基本語法:
create table [if not exists ] t_name(column1 type [約束條件,]column2 type [約束條件,]……columnN type [約束條件]
)[engine=innodb];
表結構的查詢
desc t_name;
describe t_name;
show columns from user;
查詢創建表的SQL
show create table t_name;
數據庫的數據類型
數據類型
數值型:int,float, double
Number 類型:
數據類型 | 描述 |
---|---|
TINYINT(size) | -128 到 127 常規。 0 到 255 無符號*。在括號中規定最 大位數。 |
SMALLINT(size) | -32768 到 32767 常規。 0 到 65535 無符號*。在括號中 規定最大位數。 |
MEDIUMINT(size) | -8388608 到 8388607 普通。 0 to 16777215 無符號*。在 括號中規定最大位數。 |
INT(size) | -2147483648 到 2147483647 常規。 0 到 4294967295 無 符號*。在括號中規定最大位數。 |
BIGINT(size) | -9223372036854775808 到 9223372036854775807 常規。 0 到18446744073709551615 無符號*。在括號中規定最大位 數。 |
FLOAT(size,d) | 帶有浮動小數點的小數字。在括號中規定最大位數。在 d 參數中規定小數點右側的最大位數。 |
DOUBLE(size,d) | 帶有浮動小數點的大數字。在括號中規定最大位數。在 d 參數中規定小數點右側的最大位數。 |
DECIMAL(size,d) | 作為字符串存儲的 DOUBLE 類型,允許固定的小數點。 |
字符串
Text 類型:
數據類型 | 描述 |
---|---|
CHAR(size) | 保存固定長度的字符串(可包含字母、數字以及特殊字 符)。在括號中指定字符串的長度。最多 255 個字符。 |
VARCHAR(size) | 保存可變長度的字符串(可包含字母、數字以及特殊字 符)。在括號中指定字符串的最大長度。最多 255 個字 符。 注釋:如果值的長度大于 255,則被轉換為 TEXT 類型。 |
TINYTEXT | 存放最大長度為 255 個字符的字符串。 |
TEXT | 存放最大長度為 65,535 個字符的字符串。 |
BLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字節的數據。 |
binary | 存儲較小的二進制數據 |
MEDIUMTEXT | 存放最大長度為 16,777,215 個字符的字符串。 |
MEDIUMBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字節的數據。 |
LONGTEXT | 存放最大長度為 4,294,967,295 個字符的字符串。 |
LONGBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字節的數據。 |
ENUM(x,y,z,etc.) | 允許你輸入可能值的列表。可以在 ENUM 列表中列出最大 65535 個值。如果列表中不存在插入的值,則插入空值。 注釋:這些值是按照你輸入的順序存儲的。 可以按照此格式輸入可能的值: ENUM('X','Y','Z') |
SET | 與 ENUM 類似, SET 最多只能包含 64 個列表項,不過 SET 可存儲一個以上的值。 |
時間和日期
數據類型 | 描述 |
---|---|
DATE() | 日期。格式: YYYY-MM-DD 注釋:支持的范圍是從 '1000-01-01' 到 '9999-12-31' |
DATETIME() | 日期和時間的組合。格式: YYYY-MM-DD HH:MM:SS 注釋:支持的范圍是'1000-01-01 00:00:00' 到 '9999-12- 31 23:59:59' |
TIMESTAMP() | 時間戳。 TIMESTAMP 值使用 Unix 紀元('1970-01-01 00:00:00' UTC) 至今的描述來存儲。格式: YYYY-MM-DD HH:MM:SS<br/>注釋:支持的范圍是從 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC |
TIME() | 時間。格式: HH:MM:SS 注釋:支持的范圍是從 '-838:59:59' 到 '838:59:59' |
YEAR() | 2 位或 4 位格式的年。<br/>注釋: 4 位格式所允許的值: 1901 到 2155。 2 位格式所允許 的值: 70 到69,表示從 1970 到 2069 |
內容回顧:
-
回顧了第一天的相關知識
-
SQL腳本的注釋
-
編碼相關的知識
-
數據庫表的創建
-
數據庫的數據類型
表的約束
create database 數據庫名稱 default charset="utf8mb4";
create database 數據庫名稱 default charset set utf8mb4;
?
create table `表名稱` (`字段` 該字段的類型 [約束條件,]`字段` 該字段的類型 [約束條件,]-- ……`字段` 該字段的類型 [約束條件]
);
?
// char(20)
MySQL8.0數據庫,存在如下約束條件
1、主鍵約束
2、外鍵約束【需要在后面講解】
3、唯一約束
4、非空約束
5、默認值約束
6、檢查約束
主鍵約束
主鍵(primary key):數據庫中一個獨立無二的字段,該字段不允許數據重復,是一條記錄的唯一標識符。
主鍵約束:強制規范這個字段,特點:不能重復、而且不能為空。
非空約束
非空約束(not null):不允許為空,對應就是允許為空(is null)。
默認值約束
default 值,表示如果在插入數據庫,沒有這個字段對應的值,會插入對應的默認值
唯一約束
unique:該字段,不能存在相同的值
檢查約束
檢查約束:SQL標準中檢查很早就出現了,但是MySQL在8.0之前沒有檢查約束(寫上也不報錯,但是也不生效),在8.0之后,MySQL真正實現了檢查約束。
create table user(id int primary key auto_increment,name varchar(255) not null unique,age int default 18,gender varchar(10) check(gender in ("男", "女")),address varchar(255)
)
修改表結構
alter 指令,該指令,主要用來修改已存在的一種數據庫對象的結構
主要使用在調整和修改表結構
-
增加列
-
刪除列
-
修改列類型或者條件
-
修改列名稱
alter table 表名稱 add 字段名稱 類型 [約束條件];
?
ALTER TABLE 表名稱 drop 字段名稱;
?
ALTER TABLE 表名稱 modify 字段 新類型 [新的約束];
?
ALTER TABLE 表名稱 change 舊字段名稱 新的字段名稱 新類型 [新的約束];
?
# 修改表名稱
ALTER TABLE 表名稱 rename 新名稱;
RENAME TABLE 表名 TO 新表名;
復制表信息
復制表結構
方法一:在create table語句的末尾添加like子句,可以將源表的表結構復制到新表中,語法格式如下。 create table 新表名 like 源表 ? # 注意:會完整的復制表結構,并且連約束也會復制 # 表的數據不會復制
復制表結構和數據
方法二:在create table語句的末尾添加一個select語句,可以實現表結構的復制,甚至可以將源表的表 記錄拷貝到新表中。下面的語法格式將源表的表結構以及源表的所有記錄拷貝到新表中。 create table 新表名 select {*|字段 [, 字段...]} from 源表 ? # 注意:約束中的主鍵和唯一約束復制不了
快速插入數據
方法三:如果已經存在一張機構一致的表,復制數據 insert into 表 select {*|字段 [, 字段...]} from 原表;
用戶管理和權限問題
grant來管理權限
在MySQL8.0之前,grant是集授權、創建用戶、修改密碼到等一系列權限于一身的一個命令。
??grant 權限列表 ?on 庫名.表名 to 用戶名@'客戶端主機' [identified by '密碼' ?with option參數];grant all on *.* TO ljh@'%' indentify by 'ljh';
在8.0之后,主要用來授權,像修改密碼、創建用戶、刪除用戶。
# 創建用戶
create user [if not exists] 用戶名稱@‘localhost’ identified by 密碼;
?
create user if not exists ljh@'%' identified by 'ljh';
?
grant all on db_zm.* to ljh@'%';flush privileges;
撤銷權限
revoke指令
方法1:create和grant結合help CREATE USER;命令:CREATE USER <'用戶名'@'地址'> IDENTIFIED BY ‘密碼’;查看用戶權限: help SHOW GRANTS;命令:show grants ?for '用戶名'@'地址';授權:help GRANT;
?
方法2:直接grant收回權限:REVOKE刪除用戶:DROP USER username
? ?生產環境授權用戶建議:
1、博客,CMS等產品的數據庫授權select,insert,update,delete,create庫生成后收回create權限2、生產環境主庫用戶授權select,insert,update,delete3、生產環境從庫授權select
? ? 創建用戶方法(推薦使用方法三): 方法一:CREATE USER語句創建
CREATE USER user1@’localhost’ IDENTIFIED BY ‘123456’;
方法二: INSERT語句創建
INSERT INTO mysql.user(user,host, authentication_string,ssl_cipher,x509_issuer,x509_subject)VALUES('user2','localhost',password('ABCabc123!'),'','','');
刷新權限:?
FLUSH PRIVILEGES;
? 方法三: GRANT語句創建
GRANT SELECT ON *.* TO user3@’localhost’ IDENTIFIED BY ‘123456’;FLUSH PRIVILEGES;
語法格式:
grant 權限列表 ?on 庫名.表名 to 用戶名@'客戶端主機' [identified by '密碼' ?with option參數];
?? 如:
grant select on testdb.* to common_user@'%' grant insert on testdb.* to common_user@'%' ?grant update on testdb.* to common_user@'%' ?grant delete on testdb.* to common_user@'%' grant select, insert, update, delete on testdb.* to common_user@'%'grant create on testdb.* to developer@'192.168.0.%'; ?grant alter ?on testdb.* to developer@'192.168.0.%'; ?grant drop ? on testdb.* to developer@'192.168.0.%'; ?grant all ? ?on *.* to dba@localhost; -- dba 可以管理 MySQL 中的所有數據庫 ?show grants; ?-- 查看當前用戶(自己)權限show grants for dba@localhost; ?grant all on *.* to ? dba@localhost; # 移除權限# revoke 跟 grant 的語法差不多,只需要把關鍵字 “to” 換成 “from” 即可revoke all on *.* from dba@localhost; with_option參數GRANT OPTION: 授權選項MAX_QUERIES_PER_HOUR: 定義每小時允許執行的查詢數MAX_UPDATES_PER_HOUR: 定義每小時允許執行的更新數MAX_CONNECTIONS_PER_HOUR: 定義每小時可以建立的連接數MAX_USER_CONNECTIONS: 定義單個用戶同時可以建立的連接數??