建立表語法mysql
建立一個表,多個字段: create table 表名( 字段名 列類型 [可選的參數], # 記住要加逗號 字段名 列類型 [可選的參數] # 最後一行不加逗號 ... )charset=utf8; # 後面加;號
說明:列約束用來保證數據的完整性和一致性,約束條件都是建立表語法的時候可選參數sql
auto_increment:
表示自增長1數據庫
not null:
標識該字段不能爲空default:爲該字段設置默認值
foreign key:
外鍵索引unique key:
標識字段的值是惟一的,字段值不能重複,能夠有多個primary key:
主鍵索引,能夠加快查詢速度,字段值不能重複,只能有一個unsigned:
無符號,默認是有符號的zerofill:
使用0填充安全
例子服務器
# 建立表 mysql> create table t3( -> id int unsigned auto_increment primary key, -> name char(10) not null default "xxx", -> age int not null default 0 -> )charset=utf8; Query OK, 0 rows affected (0.03 sec) # 向表中插入數據 mysql> insert into t3 (age) values (18); Query OK, 1 row affected (0.00 sec) # 查詢表中數據 mysql> select * from t3; +----+------+-----+ | id | name | age | +----+------+-----+ | 1 | xxx | 18 | +----+------+-----+ 1 row in set (0.00 sec) # 查看錶結構 desc 表名 mysql> desc t3; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | char(10) | NO | | xxx | | | age | int(11) | NO | | 0 | | +-------+------------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
列類型 | 說明 |
---|---|
數字(整數) | 存儲年齡、等級、id等 |
數字(浮點數) | 存儲薪資、身高、體重等 |
字符串 | 存儲姓名、性別等 |
時間日期類型 | 存儲註冊時間、入職時間等 |
枚舉 | 字段的值只能在給定範圍中選擇 |
數字(整形)ui
unsigned
加在列類型後面,表明無符號,不能取負數,默認是有符號,能夠是負數加密
應用場景:根據公司業務場景選擇合適類型code
例子:blog
# 咱們建立一個t4表,限制使用無符號的 mysql> create table t4(x int unsigned); Query OK, 0 rows affected (0.02 sec) # 查看錶結構,默認int數值長度已經設置爲10位 mysql> desc t4; +-------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+-------+ | x | int(10) unsigned | YES | | NULL | | +-------+------------------+------+-----+---------+-------+ 1 row in set (0.00 sec) # 只能插入無符號:[0 ~ 4294967295]範圍值內的數字 # 超過數字的長度也報錯 mysql> insert into t4 values (42949672955); ERROR 1264 (22003): Out of range value for column 'x' at row 1 # 只能插入無符號:[0 ~ 4294967295]範圍值內的數字 # 超過範圍即報錯 mysql> insert into t4 values (4294967296); ERROR 1264 (22003): Out of range value for column 'x' at row 1 # 在這個範圍內則成功 mysql> insert into t4 values (4294967295); Query OK, 1 row affected (0.00 sec) # 查詢插進去的數據,若是數據庫配置是非安全模式的話,插進去的數據是這個數據類型限制的最大數值 mysql> select * from t4; +------------+ | x | +------------+ | 4294967295 | | 4294967295 | +------------+ 2 rows in set (0.00 sec)
注意:那麼有的同窗可能不會報錯,能插進去,那是由於你的mysql5.6 沒有開啓安全模式,mysql5.7 之後的版本默認都是安全模式
# 查看當前數據庫模式: mysql> show variables like "%sql_mode%"; +---------------+--------------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------------+ | sql_mode | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | +---------------+--------------------------------------------+ 1 row in set (0.00 sec) sql_model=no_engine_substitution # 非安全性,默認 sql_model=strict_trans_tables # 安全性 # 臨時設置爲安全模式,服務重啓後會被重置 mysql>: set global sql_mode="strict_trans_tables"; # 在root用戶登陸狀態下 # 在設置後,quit斷開數據庫鏈接後(服務器不重啓)就會進入安全模式, # 那麼如今在插入超過範圍內的數據就會報錯
數字(浮點型)
例子:
# 建立表t5 限制salary字段爲decimal數據類型,num爲float數據類型 mysql> create table t5( -> id int auto_increment primary key, -> salary decimal(16,10), -> num float -> )charset=utf8; Query OK, 0 rows affected (0.02 sec) # 查看錶結構 mysql> desc t5; +--------+----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+----------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | salary | decimal(16,10) | YES | | NULL | | | num | float | YES | | NULL | | +--------+----------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) # 插入數據,salary總數字長度爲16,小數點後面正好爲10位,插入數據 mysql> insert into t5 (salary,num) values (500000.2312345678,5000.232423523534634); Query OK, 1 row affected (0.01 sec) # 查詢沒有問題,精確存,可是num float類型的不精確,存兩位小數點,還四捨五入了 mysql> select * from t5; +----+-------------------+---------+ | id | salary | num | +----+-------------------+---------+ | 1 | 500000.2312345678 | 5000.23 | +----+-------------------+---------+ 1 row in set (0.00 sec) # 插入數據,salary總數字長度爲15,小數點後面小於10位,插入數據mysql> insert into t5 (salary,num) values (500000.231234567,5000.232423523534634); Query OK, 1 row affected (0.01 sec) # 查詢,不精確,缺省的一位用0補齊,可是num float類型的不精確,存兩位小數點,還四捨五入了 mysql> select * from t5; +----+-------------------+---------+ | id | salary | num | +----+-------------------+---------+ | 1 | 500000.2312345678 | 5000.23 | | 2 | 500000.2312345670 | 5000.23 | +----+-------------------+---------+ 2 rows in set (0.00 sec) # 插入數據,salary總數字長度爲17,小數點後面大於10位,插入數據 mysql> insert into t5 (salary,num) values (500000.23123456789,5000.232423523534634); Query OK, 1 row affected, 1 warning (0.01 sec) # 查詢,不精確,只能存指定的長度,多出來的四捨五入了,可是num float類型的不精確,存兩位小數點,還四捨五入了 mysql> select * from t5; +----+-------------------+---------+ | id | salary | num | +----+-------------------+---------+ | 1 | 500000.2312345678 | 5000.23 | | 2 | 500000.2312345670 | 5000.23 | | 3 | 500000.2312345679 | 5000.23 | +----+-------------------+---------+ 3 rows in set (0.00 sec)
字符串
二者區別:
char 定長,不管插入字符是多少個,永遠固定佔規定的長度,使用場景:身份證、手機號、md5加密事後的密碼char(32)
varchar 變長,根據插入的字符串長度計算所佔的字節數,可是總有一個字節是用來保存字符串大小的,
若是不能肯定插入的數據的大小,通常建議使用varchar(255)。
Value | CHAR(4) |
Storage Required | VARCHAR(4) |
Storage Required |
---|---|---|---|---|
'' |
' ' |
4 bytes | '' |
1 byte |
'ab' |
'ab ' |
4 bytes | 'ab' |
3 bytes |
'abcd' |
'abcd' |
4 bytes | 'abcd' |
5 bytes |
'abcdefgh' |
'abcd' |
4 bytes | 'abcd' |
5 bytes |
例子:
# 建立t6表 mysql> create table t6( -> id int unsigned auto_increment primary key, -> name char(10) not null default 'xxx' -> )charset=utf8; Query OK, 0 rows affected (0.02 sec) mysql> desc t6; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | char(10) | NO | | xxx | | +-------+------------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) # 建立t7表 mysql> create table t7( -> id int unsigned auto_increment primary key, -> name varchar(10) not null default 'xxx' -> )charset=utf8; Query OK, 0 rows affected (0.03 sec) mysql> desc t7; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(10) | NO | | xxx | | +-------+------------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> insert into t6 (name) values ("hello"); Query OK, 1 row affected (0.01 sec) mysql> insert into t7 (name) values ("hello"); Query OK, 1 row affected (0.01 sec) mysql> select * from t6; +----+-------+ | id | name | +----+-------+ | 1 | hello | +----+-------+ 1 row in set (0.00 sec) mysql> select * from t7; +----+-------+ | id | name | +----+-------+ | 1 | hello | +----+-------+ 1 row in set (0.00 sec) mysql> insert into t6 (name) values ("hello32dwdsaffgfrthtrhtr"); ERROR 1406 (22001): Data too long for column 'name' at row 1 mysql> insert into t7 (name) values ("hello32dwdsaffgfrthtrhtr"); ERROR 1406 (22001): Data too long for column 'name' at row 1
時間日期類型
例子:
mysql> create table t8( -> d date, -> t time, -> dt datetime -> ); Query OK, 0 rows affected (0.04 sec) mysql> desc t8; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | d | date | YES | | NULL | | | t | time | YES | | NULL | | | dt | datetime | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 3 rows in set (0.00 sec) # now()表示當前時間 mysql> insert into t8 values(now(),now(),now()); Query OK, 1 row affected, 1 warning (0.00 sec) # 按照指定時間類型存時間 mysql> select * from t8; +------------+----------+---------------------+ | d | t | dt | +------------+----------+---------------------+ | 2019-10-29 | 01:23:08 | 2019-10-29 01:23:08 | +------------+----------+---------------------+ 1 row in set (0.00 sec)
枚舉
列出全部選項
mysql> create table t9( -> id int auto_increment primary key, -> gender enum("male","female") -> )charset=utf8; Query OK, 0 rows affected (0.03 sec) mysql> insert into t9 (gender) values ("male"); Query OK, 1 row affected (0.00 sec) mysql> insert into t9 (gender) values ("female"); Query OK, 1 row affected (0.00 sec) # 只能插入枚舉類型的數據 mysql> insert into t9 (gender) values ("femal"); ERROR 1265 (01000): Data truncated for column 'gender' at row 1 mysql> mysql> select * from t9; +----+--------+ | id | gender | +----+--------+ | 1 | male | | 2 | female | +----+--------+ 2 rows in set (0.00 sec)
drop table 表名
語法:
alter table 舊錶名 rename 新表名
語法:
alter table 表名 add 字段名 列類型 [可選的參數];
上面添加的列永遠是添加在最後一列以後,若是須要在指定位置添加字段的話,使用下面的語法
alter table 表名 add 字段名 列類型 [可選的參數] first;
alter table 表名 add 字段名 列類型 [可選的參數] after 字段名
alter table 表名 modify 字段名 列類型 [可選的參數]
alter table 表名 change 舊字段名 新字段名 新列類型 [可選的參數]
alter table 表名 drop 字段名
show tables:
查看錶名
一、 查看被複製表的建立語句:show create table 表名
,而後拷貝sql語句更換表名執行
二、 create table 舊錶名 like 新表名
增長數據,語法:
insert into 表名 (列1,列2) values (值1,值2)
delete from 表名 where 條件
;若是不加條件刪除表中全部數據
truncate 表名
;沒有where條件,刪除表中所有數據,速度比delete快
二者區別:
一、 delete刪除以後再插入數據,自增id從上一次主鍵自增,truncate是從1開始
二、 delete刪除是一行一行刪除,truncate是全選刪除,速度比delete快
update 表名 set 列名1=新值1 where 條件
語法:
select 列1,列2 from 表名 [where 條件]
select * from 表名 where id between ... and ...
;between...and...取值範圍是閉區間
查詢去重
select distinct 列名 from 表名
四則運算
select 列表*10 from 表名
in
select * from 表名 where id in (取值範圍)
like模糊查詢
select * from 表名 where 列名 like 'x%';
以x開頭,%表示通配符
select * from 表名 where 列名 like '%x';
以x結尾,%表示通配符
select * from 表名 where 列名 like '%x%'
包含x的,%表示通配符