Datawhale-MySQL-任務三
學習內容
1.MySQL表資料型別:
- MySQL中定義資料欄位的型別對你資料庫的優化是非常重要的。
- MySQL支援多種型別,大致可以分為三類:數值、日期/時間和字串(字元)型別。
- 具體型別介紹見菜鳥教程 | MySQL資料型別
2.用SQL語句建立表
建立方式:
一般有兩種建立表的方法:
多數 DBMS都具有互動式建立和管理資料庫表的工具;
表也可以直接用 SQL語句操縱。
需要注意的是,使用互動式工具時實際上就是使用 SQL語句。這些語句不是使用者編寫的,介面工具會自動生成並執行相應的 SQL語句(更改已有的表時也是這樣)。
設定列型別,大小,約束
利用CREATE TABLE建立表,必須給出下列資訊:
- 新表的名字,在關鍵字CREATE TABLE之後給出;
- 表列的名字和定義,用逗號分隔;
- 有的 DBMS還要求指定表的位置。
設定主鍵
一張表只能有一個欄位可以使用對應的鍵,用來唯一的約束該欄位裡面的資料,不能重複。主鍵本身一定不為空,且不允許重複。
設定主鍵的三種方式:
① 建立表的時候在欄位後面使用 primary key關鍵字;
create table my_default(
id int PRIMARY KEY,--使用關鍵字
name VARCHAR(20) not null unique key ,
gender varchar(4) DEFAULT '男'
)charset utf8;
② 在建立表的時候,在所有的欄位之後使用 primary key(主鍵的欄位 列表)來建立主鍵(如果有多個欄位作為主鍵,稱之為複合主鍵);
create table my_pri(
number char(10),
course char(10),
score TINYINT,
PRIMARY KEY(number,course)--複合主鍵
)charset utf8;
③ 建立表之後,為表追加主鍵。有兩種方式,第一為修改表欄位屬性;第二直接追加。
方式一:
alter TABLE my_pri MODIFY number char(11) PRIMARY KEY;
方式二:
alter table table_name add primary key(column) ;
alter TABLE my_pri add PRIMARY KEY(number,course);--增加複合主鍵
alter table my_pri add CONSTRAINT pk_score PRIMARY KEY(score)--使用關鍵字CONSTRAINT 且指定主鍵名字pk_score
alter table my_pri add CONSTRAINT PRIMARY KEY(score)--使用關鍵字CONSTRAINT 且使用預設名字
刪除主鍵:
alter table my_default drop PRIMARY KEY; -- 刪除主鍵使不需要根據主鍵名字刪除,因為只有一個主鍵
3.用SQL語句向表中新增資料
語句解釋
MySQL 表中使用 INSERT INTO SQL語句來插入資料。
多種新增方式(指定列名;不指定列名)
插入資料有三種方式:
- 插入完整的行;
- 插入行的一部分(指定列名);
- 插入某些查詢的結果(INSERT SELECT)。
注:不指定列名插入高度依賴於表中列的定義次序,還依賴於其容易獲得的次序資訊。即使可以得到這種次序資訊,也不能保證各列在下一次表結構變動後保持完全相同的次序。因此,編寫依賴於特定列次序的 SQL語句是很不安全的,這樣做遲早會出問題。因此指定列名插入,VALUES必須以其指定的次序匹配指定的列名,不一定按各列出現在表中的實際次序。其優點是,即使表的結構改變,這條INSERT語句仍然能正確工作。
4.用SQL語句刪除表
DELETE
DELETE FROM table_name [WHERE Clause]
- 如果沒有指定 WHERE 子句,MySQL 表中的所有記錄將被刪除。
- 你可以在 WHERE 子句中指定任何條件
- 你可以在單個表中一次性刪除記錄。
DROP
DROP TABLE table_name
TRUNCATE
TRUNCATE table_name
不同方式的區別
1.drop和delete只是刪除表的資料(定義),drop語句將刪除表的結構、被依賴的約束(constrain)、觸發器 (trigger)、索引(index);依賴於該表的儲存過程/函式將保留,但是變為invalid狀態。
2.delete語句是DML語言,這個操作會放在rollback segement中,事物提交後才生效;如果有相應的觸發器(trigger),執行的時候將被觸發。truncate、drop是DDL語言,操作後即 生效,原資料不會放到rollback中,不能回滾,操作不會觸發trigger。
3.delete語句不影響表所佔用的extent、高水線(high watermark)保持原位置不動。drop語句將表所佔用的空間全部釋放。truncate語句預設情況下將空間釋放到minextents的 extent,除非使用reuse storage。truncate會將高水線復位(回到最初)。
4.效率方面:drop > truncate > delete。
5.安全性:小心使用drop與truncate,尤其是在 沒有備份的時候,想刪除部分資料可使用delete需要帶上where子句,回滾段要足夠大,想刪除表可以用drop,想保留表只是想刪除表的所有資料、 如果跟事物無關可以使用truncate,如果和事物有關、又或者想觸發 trigger,還是用delete,如果是整理表內部的碎片,可以用truncate跟上reuse stroage,再重新匯入、插入資料。
6.delete是DML語句,不會自動提交。drop/truncate都是DDL語句,執行後會自動提交。
7、drop一般用於刪除整體性資料 如表,模式,索引,檢視,完整性限制等;delete用於刪除區域性性資料 如表中的某一元組。
8、DROP把表結構都刪了;DELETE只是把資料清掉
9.當你不再需要該表時, 用 drop;當你仍要保留該表,但要刪除所有記錄時, 用 truncate;當你要刪除部分記錄時(always with a WHERE clause), 用 delete.
5.用SQL語句修改表
修改列名
ALTER TABLE 表名 CHANGE 列名 新列名 列型別。
修改表中資料
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
刪除行
從一個表中刪除(去掉)資料,使用DELETE語句。有兩種使用DELETE的方式:
- 從表中刪除特定的行;
- 從表中刪除所有行。
注:不要省略 WHERE 子句:在使用 DELETE時一定要細心。因為稍不注意,就會錯誤地刪除表中所有行。如果想從表中刪除所有行,不要使用DELETE。可使用TRUNCATE TABLE語句,它完成相同的工作,而速度更快(因為不記錄資料的變動)。
新建列
alter table 表名 add column 列名 列型別;
新建行
參考第三部分新增資料
6.作業
專案三
超過5名學生的課(難度:簡單)
建立如下所示的courses 表 ,有: student (學生) 和 class (課程)。
例如,表:
student | class |
---|---|
A | Math |
B | English |
C | Math |
D | Biology |
E | Math |
F | Computer |
G | Math |
H | Math |
I | Math |
A | Math |
編寫一個 SQL 查詢,列出所有超過或等於5名學生的課。
應該輸出:
class |
---|
Math |
Note:
學生在每個課中不應被重複計算。
作業程式碼:
專案四
交換工資(難度:簡單)
建立一個 salary表,如下所示,有m=男性 和 f=女性的值 。
例如:
id | name | sex | salary |
---|---|---|---|
1 | A | m | 2500 |
2 | B | f | 1500 |
3 | C | m | 5500 |
4 | D | f | 500 |
交換所有的 f 和 m 值(例如,將所有 f 值更改為 m,反之亦然)。要求使用一個更新查詢,並且沒有中間臨時表。
執行你所編寫的查詢語句之後,將會得到以下表:
id | name | sex | salary |
---|---|---|---|
1 | A | f | 2500 |
2 | B | m | 1500 |
3 | C | f | 5500 |
4 | D | m | 500 |
作業程式碼:
相關文章
- Datawhale-MySQL-任務二MySql
- Datawhale-MySQL-任務五MySql
- Datawhale-MySQL-任務四(表聯結)MySql
- Datawhale-MySQL-任務六(複雜專案)MySql
- gulp原始碼解析(三)—— 任務管理原始碼
- 第三項任務——用例建模
- 任務佇列,巨集任務與微任務佇列
- 巨集任務和微任務
- OkHttp 3.7原始碼分析(三)——任務佇列HTTP原始碼佇列
- JavaScript巨集任務和微任務JavaScript
- 任務
- OkHttp3.7原始碼分析(三)——任務佇列HTTP原始碼佇列
- Java實現定時任務的三種方法Java
- Event Loop、 巨集任務和微任務OOP
- JavaScript的巨集任務與微任務JavaScript
- SpringBoot與非同步任務、定時任務、郵件任務Spring Boot非同步
- Flink on Yarn三部曲之三:提交Flink任務Yarn
- 微任務、巨集任務與Event-LoopOOP
- js中的巨集任務和微任務JS
- 任務系統之Jenkins子任務Jenkins
- macrotask 巨集任務 + microtask 微任務區別Mac
- RabbitMQ訊息佇列(三):任務分發機制MQ佇列
- 任務池
- 任務05
- crontab任務
- 任務四
- 近日任務
- 任務。1
- 任務1
- 任務4
- 任務一
- UI 阻塞行為:微任務與宏任務UI
- laravel框架任務排程(定時執行任務)Laravel框架
- 微任務和巨集任務哪個先執行
- 同步任務與非同步任務執行順序非同步
- 專案任務與運維任務的衝突運維
- 基於Hyperf開發的任務排程系統.支援任務投遞,DAG任務編排(多個任務使用同一個事務).
- go 任務池Go