MySQL學習筆記(二)SQL基本語法

數據類型

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章