# SQL I 資料庫
---
### i think you have gotten know what is that in vacational high school

##### HAHA but ...let,s review it
----
### All right What is SQL
> **S**tructure **Q**uery **L**anguage
是一種特定目的程式語言,用於管理關聯式資料庫管理系統(RDBMS),或在關係流資料管理系統(RDSMS)中進行流處理。
(當然還有另一種東西叫NoSQL)
[指令參考](https://blog.xuite.net/towns/hc/65849335-MySQL+%E6%8C%87%E4%BB%A4%E3%80%81%E8%AA%9E%E6%B3%95%E5%8F%8A%E7%AE%A1%E7%90%86)
##### So in summary SQL used for DB(DataBase)
----
### DB(DataBase)
broad sense: that mean the place where we store data
narrow sense: DB is set of a group of common data
Application Example:
phone contact(if we didn,t set up of our DB )
---
### benefit of DB
- 1. Redundancy
- 2. Consistency
- 3. Data Sharing
- 4. Data Indepence
- 5. Integrity
- 6. Reduce Paper
- 7. Security
----
### What are you waiting for Just Download
[SQlite Studio](https://sqlitestudio.pl/)
----
### Yah! introduce DB
[延伸閱讀](https://ithelp.ithome.com.tw/articles/10206222)

DT稍後介紹(先知道DB 有很多的DT)
----
### DataTable
資料庫的儲存方式長的很像Excel

----
橫看Row 直看Col

---
### DataBase 結構
Bit -> Byte -> Field -> Record -> Table -> Data Base

主要要知道
1. 一個DB Server 可以有很多DataBase(資料庫)
2. 一個DataBase 可以有很多 Datatable(資料表)
3. 一個Datatable 可以有很多 Record(資料紀錄)
4. 一個Record 可以有很多Field/Column(資料欄位)
----
### DB VS DBMS
##### DataBase vs DataBase Management System

what DBMS is you know?
---
### Download Example
[Example連結](https://drive.google.com/file/d/1SyAbFDa0uA4ek1XuLW8bbZHYbgSU4pZz/view?usp=sharing)
開啟SQLite Studio 並且匯入這個SQL檔案
----
### You will see Database name and what datatables it involve
---
### 傳說中資料庫有四種基礎命令
也就是SUID
Select Update Insert Delete
選擇 更新 插入 刪除
概念跟CRUD一樣
----
### Select 查詢
```sql=
SELECT * FROM `Class`;
```
"* 為所謂的萬用字元 也就是全部的意思"
那語法總得來說就是
```sql=
SELECT * FROM `資料表`;
```
----
當然我們也可以不一定要Show出全部的Columns(欄位)
也能一次抓多欄/單欄
```sql=
SELECT (`Class_name`) FROM `Class`; --單欄 Class_name
SELECT (`Class_name`,`Class_id`) FROM `Class`; --多欄 Class_id
```
稍微進階的查詢Query我們可以像程式語言一樣加入查詢條件,但...
----
不是If 是Where
來個範例吧
```sql=
SELECT * FROM `Class` WHERE `Class_name` = "四資管二A";
```
你會發現語法是WHERE [condition]
----
### Insert 插入
```sql=
INSERT INTO `Class` (`Class_name`,`Class_id`) VALUES ("四企管二A","4");
INSERT INTO `Class` VALUES ("四企管二A","4");--插入全欄位值 且Value插入順序正確可忽略欄位名稱
INSERT INTO `資料表` (`欄位1`,`欄位2`,...) VALUES ("Value1","Value2",...);
```
做完之後 Class 資料表就多了一個 四企管二A了
----
### Update 更新
```sql=
UPDATE `Class` SET `Class_name`="四企管二Z" WHERE `Class_name` = "四企管二A";
UPDATE `資料表` SET `欄位名稱1`=`欄位值1`,`欄位名稱2`=`欄位值2`... [WHERE {條件式}]
```
四企管二A 變成 四企管二Z 了XD
----
### Delete 刪除
```sql=
DELETE FROM `Class` WHERE `Class_name`="四企管二Z";
DELETE FROM `資料表` WHERE 條件式;
```
企管88
---
### 玩了這麼多 我提供的資料庫是時候自己創建了
----
### Create 創建資料表\資料庫
還記得這張圖嗎

所以我們必須把最外層的DB建立起來
```sql=
CREATE DATABASE [database_name];
```
----
同樣 建立一張DT
```sql=
CREATE DATATABLE [datatable_name](
col1 datatype,
col2 datatype,
col3 datatype,
);
--======
CREATE TABLE customers (
C_Id INT,
Name varchar(50),
Address varchar(255),
Phone varchar(20)
);
```
----
### ALTER 修改資料表
#### 增加欄位
```sql=
ALTER TABLE table_name ADD column_name datatype;
```
##### 更改資料欄位型別(沒錯ALTER 再ALTER)
```sql=
ALTER TABLE table_name ALTER COLUMN column_name datatype;
```
##### 刪除欄位 (DROP COLUMN)
```sql=
ALTER TABLE table_name DROP COLUMN column_name;
```
----
### DROP 刪除資料表
##### 刪除資料表 (DROP TABLE)
完全刪除整個資料表。
##### DROP TABLE table_name;
僅刪除資料表內容,但保留結構 (TRUNCATE TABLE)
```sql=
TRUNCATE TABLE table_name;
```
資料表還在,只是資料清空了。
##### 刪除資料庫 (DROP DATABASE)
```sql=
DROP DATABASE database_name;
```
---
### 蝦 指令超多? 這只是皮毛 接下來講講限制
資料庫限制 SQL Consraints 有六個類別
通常是拿來限制 欄位可/不可 更動或新增的條件
1. NOT NULL 非空值限制
2. UNIQUE 唯一限制
3. PRIMARY KEY 主鍵限制
4. FOREIGN KEY 外鍵限制
5. CHECK 檢查限制
6. DEFAULT 預設值限制
----
### 情境 顧客資料表
由於不能有顧客的編號(ID)為空值 我們會再設計DT的時候添加 NOT NULL
```sql=
CREATE TABLE customer (
C_Id INT NOT NULL,
Name VARCHAR(50) NOT NULL,
Address VARCHAR(255),
Phone VARCHAR(20)
);
```
----
### 承上題情境
由於顧客編號(ID)不能有重複的 為了避免衝突 我們也可以加入UNIQUE
```sql=
CREATE TABLE customer (
C_Id INT NOT NULL UNIQUE,
Name VARCHAR(50) NOT NULL,
Address VARCHAR(255),
Phone VARCHAR(20)
);
--OR
CREATE TABLE customer (
C_Id INT NOT NULL,
Name VARCHAR(50) NOT NULL,
Address VARCHAR(255),
Phone VARCHAR(20),
UNIQUE (C_Id)
);
```
---
### 關聯(Relation)
---
### 指令變化
資料庫有很多廠商 基本上都遵循ISO的SQL標準但是各家的指令與語法還是會有差別(每個DB怎麼操作 有時候需要特別去查)
---
### 雖然SQL指令百百種 但是...
師父領進門修行靠個人
[Link](https://www.hackerrank.com/domains/sql?filters%5B.%28%29%5D%5B%5D=select&filters%5Bsubdomains%5D%5B%5D=join)
----
### 希望各位都理解拉
{"metaMigratedAt":"2023-06-16T19:19:49.596Z","metaMigratedFrom":"YAML","title":"SQL I 資料庫","breaks":true,"contributors":"[{\"id\":\"4c8f8799-9dcd-430b-b7bc-8a5156d39d0b\",\"add\":5055,\"del\":95}]"}