MySQL操做表和表記錄

操做表

建立表語法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

  • tinyint:小整數,有符號:[-128 ~ 127],無符號:[0 ~ 255]
  • smallint:大整數,有符號:[-32768 ~ 32767],無符號:[0 ~ 65535]
  • mediumint:大整數
  • bigint:極大整數
  • int (推薦使用):大整數,有符號:[-2147483648 ~ 2147483647],無符號:[0 ~ 4294967295]

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斷開數據庫鏈接後(服務器不重啓)就會進入安全模式,
# 那麼如今在插入超過範圍內的數據就會報錯

數字(浮點型)

  • float:不必定精確
  • decimal(m,d):存精確的數字,m是數字總個數(負號不算),d是小數點後的數字個數

例子:

# 建立表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:定長
  • varchar:變長

二者區別:

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

時間日期類型

  • year:保存年份
  • date:保存日期
  • time:保存時間
  • datetime:保存格式化後的時間
  • timestamp:保存時間戳

例子:

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的,%表示通配符

相關文章
相關標籤/搜索