數據類型
MySQL支持所有標準的SQL數據類型,主要分3類: 數值類型、字符串類型、時間日期類型;
-
數值類型
mysql支持標準SQL 中的數值類型其中包括嚴格數據類型(INTEGER 、SMALLINT和decimal),以及近似數據類型(FLOAT 和double等)
- 整型
MYSQL 支持在類型名稱後面的小括號內指定寬度,如int(5)表示,如果數值寬度小於5,那麼不足的位置用“ ”填在數值的前面,即890存儲方式爲 890 若不指定寬度默認爲int(11) .一般配合zerodill使用,即將原來的空字符改爲0;
不知道你是否會有疑問,如果我設置的長度是5,我存入一個長度大於5的數會出現什麼結果?
我們來看一下:
我們可以看到他存進去了,而且是你想要存成的樣子。。。實際上當你的數值位數大於預先指定的寬度時,你設置的數值寬度已經沒有任何意義了。
整數數據類型還有個特殊的屬性:AUTO_INCREMENT(每張表最多有一個AUTO_INCREMENT,且對於任何使用此屬性的列必須定義爲 NOT NULL ,並定義爲 PRIMARY KEY 或 unique鍵 ),看詞知意,他會根據你輸入的值自動給行排序,在你需要 產生唯一的標識符或者順序值時,他是個不錯的選擇。如果設置了自增長列,那麼數據表存儲數據時,按自增長升序排列,而不是按插入順序。
- 浮點型
mysql在表示小數時有兩種方式:浮點型和定點型。浮點數包含float(單精度) 和 double(雙精度)。定點數只有一種decimal。浮點數和定點數都可以用數據類型(M,D)的方式表示-(M,D)表示 一共有M位數字(整數位+小數位),小數點後面有D位。
在mysql 中,對於浮點數和定點數來說:如果小數位超了,四捨五入,整數位超了,直接報錯,不會存入數據表。
-
字符串類型
VARCHAR 和 CHAR 的主要區別在於 VARCHAR 列中的值爲可變長度的字符串,而CHAR 則爲指定的固定長度的字符串;在檢索時Char會將尾部的空格刪除,而Varchar 會保留。
- binary和varbinary:與char 和 varchar 類似,不同的是其只存儲二進制字符串,而不存儲非二進制字符串
- 枚舉類型:ENUM :它的值的範圍在創建表的時候通過枚舉的方式指定,0-255個成員需要1個字節存儲,255-65535個成員需要兩個字節存儲,最多允許65535個成員。ENUM 有個特點,每次只能取一個成員,不能一次取多個值
- set類型 與 enum類型一樣也是一個字符串對象,裏面可以包含0-64個成員。
1-8個成員的集合會佔1個字節
9-16個成員的集合會佔2個字節
17-24個成員的集合會佔3個字節
25-32個成員的集合會佔4個字節
33-64個成員的集合會佔8個字節
set允許從集合中任選一個或多個元素進行組合,所以只要你的值在元素中可以組合出來,就能存入集合。
關於set和枚舉,先留白吧,以後探索了在進行補充
-
日期類型
日期類型總共有以下點:
表示年份:year;(高版本mysql 已經不支持)
表示日期:DATE;
表示時間: TIME;
表示年月日時分秒:datetime;
一個關於datetime 的小例子:
create table date1( dt DATETIME);
INSERT INTO DATE1 VALUES('2018-04-15 18:34:25');
INSERT INTO DATE1 VALUES('2018/04/15 18+34+25');
INSERT INTO DATE1 VALUES('20180415183425');
INSERT INTO DATE1 VALUES(20180415183425);
SELECT* FROM DATE1;
由上我們可以看出,datetime 支持的模式
-- date 類型的 四種 format
insert into aimme_order_20181210 values('ZB2L181205',1000,'2018-12-05','A88008801','complete');
insert into aimme_order_20181210 values('ZB2L181205',1000,'2018/12/05','A88008801','complete');
insert into aimme_order_20181210 values('ZB2L181205',1000,'20181205','A88008801','complete');
insert into aimme_order_20181210 values('ZB2L181205',1000,20181205,'A88008801','complete');
select * from aimme_order_20181210 where Order_ID = 'ZB2L181205'
這裏需要注意的是MYSQL 只給第一個TIMESTAMP 設置了默認值是系統當前的DATETIME ,若有第二個 默認值是0;
關於TIMESTAMP 以後在研究。。。。。
SQL語句
sql主要分爲三類:DDL(data definition Language 數據庫定義語句) 、DML(data manipulation language 數據庫操縱語句)、DCL(data control language 數據庫控制語句)。
-
數據庫定義語言 :DDL---包括對數據庫對象的創建、修改和刪除
數據庫對象包括 :數據庫、表、視圖、索引等等
小例子
-- 顯示所有數據庫
show databases ;
-- 刪除數據庫 demo_1
drop database demo_1;
-- 創建數據庫
create database Retail_management_system;
-- 使用數據庫,在創建表之前需執行,目的是讓編輯器知道你要在哪個數據庫創建表
use Retail_management_system;
-- 刪除數據表
drop table Aimme_order_20181210 ;
/*
* 創建表:
訂單表,需包含字段:訂單ID 訂單金額 訂單創建時間 會員ID 訂單狀態
in transit在途 complete 已完成
訂單商品表:ID 訂單ID 商品Id 商品名稱 商品價格 商品數量
*/
create table Aimme_order_20181210 (Order_ID int(16) not null,
Order_Amt double (16,4) not null ,
Order_Date date not null ,
Member_ID varchar(16) not null,
Order_Status varchar(32) not null default 'in transit');
-- 自增長的列必須是key
create table Aimme_GoodsOrder_20181210(
ID int(12) not null auto_increment primary key,
Order_ID int(16) not null ,
Item_ID int(16)not null,
Item_Name varchar(64) not null,
Item_Price double(16,4) not null,
Item_Qty int(8) not null
);
/* 增加列
* 若使用關鍵字after ,表示將新列插入在某一列的後面
* 若不用,默認插入在最後一列
* */
alter table Aimme_order_20181210 add sex varchar(2) not null after Order_ID;
-- 修改列名
alter table Aimme_order_20181210 change sex sex_id varchar(2) not null ;
/* 將某一列放在整個表的第一列 */
alter table aimme_order_20181210 modify sex varchar(2) not null first;
-- 修改列的數據類型
alter table aimme_order_20181210 modify sex int(5) not null
-- 刪除列
alter table Aimme_order_20181210 drop sex;
-- 描述表
desc Aimme_order_20181210;
-
DML
對數據表的增刪改查
- 插入數據:
insert into 表名(列名1,列名2...列名n)values(value1,value2...valuen); 這裏也可以不列舉列名,但是value 的值必須與表的列一一對應;
一次性插入多條數據
insert into 表名(列名1,列名2,列名3...列名n)values
(value1,value2,value3... valuen),
(value11,value12,value13... value1n)
...
(valuen1,valuen2,valuen3... valuenn);
/*
插入:
插入有兩種寫法:
一種是values 前面加列名的,這種方式只需要後面數據一一對應即可,
並不需要對數據表中每一列都賦值(前提是不賦值的列允許非空,或者是有默認值);----這種對於只插入部分字段的情況比較有利
另一種則是Values 前面不附列名,此種方式則要求後面的數值需要與表的列一一對應*/
insert into aimme_order_20181210 (order_id,Order_Amt,Order_Date,Member_ID,Order_Status)
values ('ZB2L181205',80259.450,'2018-12-05','A88008801','complete');
-- 浮點型加不加引號都是可以的,如下執行都是不報錯的
insert into aimme_order_20181210 values ('YVBL181110',228959.450,'2018-12-10','A88008802','in transit');
-- * 依次插入多條數據
insert into aimme_order_20181210 values ('ytro181008',8859.450,'18-10-08','A88008803','complete'),
('1730181024',92959.450,'18-10-24','A88008804','complete');
-- 更新數據---更新會員號爲A88008803 的訂單號爲:Za43180923 如果沒有where語句,則表示對一整列進行賦值,且是相同的值
update aimme_order_20181210 set Order_id = 'Za43180923' where Member_ID = 'A88008803';
/*在mysql中支持同時更新多表數據,語法如下:
-- update t1,t2,t3...,tn set t1.field1=value1,t2.field2=value2,
t3.field3=value3...,t2.fieldn=valuen[where conidition];//where 條件語句,*/
update aimme_order_20181210 set Order_Amt = 12580,
Order_Status = 'in transit',
Order_Date = '2018-12-9' where Order_ID ='ZA43181206' ;
-- 刪除數據
delete from aimme_order_20181210 where Order_ID = 'YVBL181110';
/*與update一樣,刪除數據支持同時刪除多表數據
delete from t1,t2,t3...tn [where codition ];*/
-- 查找
select * from aimme_order_20181210 ;
- 更新記錄
update 表名 set field1=value1,field2=value2,... fieldn=valuen[where conidition];//where 條件語句
在mysql中支持同時更新多表數據,語法如下:
update t1,t2,t3...,tn set t1.field1=value1,t2.field2=value2,t3.field3=value3...,t2.fieldn=valuen[where conidition];//where 條件語句,以後細說
多表同時更新數據多用在更具一個表字段動態更新另一個表字段
- 刪除表數據
delete from 表名[where condition];
與update一樣,刪除數據支持同時刪除多表數據
delete from t1,t2,t3...tn [where codition ];
CREATE TABLE student(id INT(8) AUTO_INCREMENT PRIMARY KEY NOT NULL,
NAME VARCHAR(20) NOT NULL,
grade INT(8) NOT NULL DEFAULT 0,
dept INT(5) NOT NULL);
CREATE TABLE class(dept INT(5),deptname VARCHAR(18));
INSERT INTO student(NAME,grade,dept) VALUES('a',95,11),
('b',99,12),('c',100,10),
('d',89,11),('e',85,15),('f',88,14);
INSERT INTO class VALUES(10,'vocol'),
(11,'cleaning'),(12,'grocery'),(14,'food'),(15,'冷凍');
SELECT* FROM student;
SELECT* FROM class;
同時刪除表中dept=10的數據:
DELETE a ,b FROM student a ,class b WHERE a.`dept`=b.`dept`AND a.`dept`= 10 ;
//a b 是表的別名,如果from後用表的別名,delete後面也要用相應的別名
select* from student;
select* from class;
- 關於查詢
基本注意點,在上面的思維導圖裏已經標註了
再結合例子自己動手執行一下就可以了,這裏就不附結果圖片了,僅將代碼附上,說明實際用法
/*
* 實際工作中我們很少會查詢表的全部數據,實際上是會有諸多限制的
* 1、where 語句
* 2、limit 限制顯示行數
* */
select * from aimme_order_20181210 where Order_Status = 'complete' limit 3;
-- 對查出數據進行排序
-- 升序 按member_id 升序排序
select * from aimme_order_20181210 where Order_Status = 'complete' order by Member_ID asc;
-- 降序排列 desc 按Order_Amt
select * from aimme_order_20181210 where Order_Status = 'complete' order by Order_Amt asc;
-- 去重複 distinct
-- 注意這裏關鍵字 distinct 的位置
select distinct * from aimme_order_20181210 where Order_Status = 'in transit';
-- 比較 小於
select order_id ,Order_Amt from aimme_order_20181210 where Order_Amt<10000.0 ;
-- 小於等於
select order_id from aimme_order_20181210 where Order_Amt <= 10000.0 ;
-- 大於等於
select order_id , Order_Amt from aimme_order_20181210 where Order_Amt >= 10000.0 ;
-- 大於
select order_id from aimme_order_20181210 where Order_Amt>10000.0 ;
-- 不等於
select order_id from aimme_order_20181210 where Order_Amt <> 10000.0 ;
-- 等於
select distinct * from aimme_order_20181210 where Order_Status = 'in transit';
-- between and
select * from aimme_order_20181210 where Order_Amt between 1000 and 8000;
-- in /not in
select*from aimme_order_20181210 where Order_Amt in (3000,5000,6000,8000);
insert into aimme_goodsorder_20181210 values;
insert into aimme_goodsorder_20181210 values;
-- null / not null
-- 爲空
select * from aimme_goodsorder_20181210 where Item_Name is null ;
select * from aimme_goodsorder_20181210 where Item_Name is not null ;
-- 或者,查詢訂單號爲YTES181022 或 1719181024 的記錄
select * from aimme_goodsorder_20181210 where Order_ID = 'YTES181022'or Order_ID = '1719181024';
-- and 查詢訂單號爲 1719181024 並且 單品號 爲 12600073001 的記錄
select * from aimme_goodsorder_20181210 where Item_ID = '12600073001' and Order_ID = '1719181024';
-- 模糊查詢
-- 查詢訂單號以5結尾的記錄
select * from aimme_goodsorder_20181210 where Order_ID like '%3';
select * from aimme_goodsorder_20181210 where Order_ID like '17_918102_';
/*
* Group by
* 用於對相關列進行彙總類的統計
*
* group by 後面的字段: select後面 彙總函數前面的所有字段
* as 用於給表或者列取別名
*/
-- 查詢所有訂單數目總和 並按降序排列
select Order_ID , sum( Item_Qty) as sum_qty from aimme_goodsorder_20181210
group by Order_ID
order by sum( Item_Qty) desc;
-- 查詢每個訂單號的平均訂貨單品數量
select Order_ID , avg( Item_Qty) as avg_qty from aimme_goodsorder_20181210
group by Order_ID
order by sum( Item_Qty) desc;
-- 計數
select Order_ID , count(Member_id) from aimme_order_20181210 group by order_id;
-- 去重計數 --函數後面與括號之間不要有空格
select count( distinct Member_ID) from aimme_order_20181210 ;
-- 最大最小值
select order_id,Order_Status, max(order_amt) from aimme_order_20181210 group by order_status ;
select order_id,Order_Status, min(order_amt) from aimme_order_20181210 group by order_status ;
/*
* having 對彙總後的結果進行過濾
*
* 如果要對沒有彙總的結果進行過濾使用的是where
*
* 對彙總後訂單金額小於100000的進行過濾 用 having
*
*過濾訂單金額大於20000的數據 用 where
*/
select member_id , sum(order_amt) from aimme_order_20181210
group by member_id having sum(order_amt) < 100000;
select member_id ,order_amt from aimme_order_20181210
where order_amt >20000 ;
文章源代碼完整版 下載鏈接
https://download.csdn.net/download/fengkaungdewoniu/10844302