[TOC]
## 測試數據庫
`mysql -V`

[測試數據](http://pan.baidu.com/s/1kUAXwgv)
tip`source D:/news.sql;`
## 命令行操作
1. 連接命令
`mysql -h host -P port -u user -p password`
2. 步驟 `win + r `->`cmd`->`mysql -u root -p enter`-> `password`


3. 顯示所有數據庫
`show databases;`

4. 指定要使用的數據庫
`use news;`

5. 顯示所有的數據表
`show tables;`

6. 執行sql

**注意**
> 其它sql語句都可以這樣執行
> 并且接下來的所講的都可以這樣執行
> 但為了更方便的學習我們主要采用可視化工具方式教學
## 可視化工具navicat
### select
#### 查詢所有數據
```
select * from article
```

#### 查詢部分列
```
SELECT id,title,author FROM article
```

#### 列別名
```
SELECT id 編號,title as 標題,author FROM article
```


#### Where
1. **>**
```
SELECT * FROM article WHERE id >100
```

2. **<**
```
SELECT * FROM article WHERE id <10
```

3. **=**
```
SELECT * FROM article WHERE id =100
```

4. 區間
```
SELECT * FROM article WHERE id > 95 and id <100
SELECT * FROM article WHERE id BETWEEN 96 AND 99
SELECT * FROM article WHERE id in(96,97,98,99)
```

5. **like**
> 類型自動轉換
1. 沒有通配符
```
SELECT * FROM article WHERE id LIKE '90'
```

2. `_`通配符
```
SELECT * FROM article WHERE id LIKE '_1'
```

3. `%`通配符
```
SELECT * FROM article WHERE id LIKE '%1'
```

4. Count & Concat
```
SELECT count(*) FROM article WHERE id LIKE '%1' #%通配符
```

```
SELECT * FROM article WHERE title = CONCAT('服務','指南')
```

5. Limit & Top
```
SELECT * FROM article limit 4 # 只查詢前4條數據
```

```
SELECT * FROM article limit 2,4 # 第三條開始查詢前4條數據
```

> MSSQL
```
select * from Area
```

```
select top 3 * from Area
```

6. Order by
```
SELECT * FROM article ORDER by id DESC
```

7. 分頁
```
原始數據
1 2 3 4 5 6 7 8 9 10 11
分頁要求
pageSize 4
pageIndex 2
limit 一個參數 or top
1 2 3 4
5 6 7 8
9 10 11
目標分頁數
5 6 7 8
步驟
1 2 3 4 5 6 7 8
SELECT * FROM article LIMIT 8 #2*4
8 7 6 5 4 3 2 1
SELECT * FROM (SELECT * FROM article LIMIT 8) AS First ORDER BY id DESC
8 7 6 5
SELECT * FROM (SELECT * FROM article LIMIT 8) AS First ORDER BY id DESC LIMIT 4
5 6 7 8
SELECT * FROM (SELECT * FROM (SELECT * FROM article LIMIT 8) AS One ORDER BY id DESC LIMIT 4 ) AS Two ORDER BY id ASC
```

**Easy**
```
SELECT * FROM article LIMIT 4,4
```

**More**
```
EXPLAIN SELECT * FROM (SELECT * FROM (SELECT * FROM article LIMIT 8) AS One ORDER BY id DESC LIMIT 4 )AS Two ORDER BY id ASC
```

```
EXPLAIN SELECT * FROM article WHERE id= 3
```

### insert
```
#要插入所有列
INSERT INTO 表名稱 VALUES (值1, 值2,....)
#指定所要插入數據的列:
INSERT INTO 表名稱 (列1, 列2,...) VALUES (值1, 值2,....)
```
### update
```
# 更新指定數據
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
# 所有數據
UPDATE 表名稱 SET 列名稱 = 新值
```
### delete
```
# 刪除某些數據
DELETE FROM 表名稱 WHERE 列名稱 = 值
# 刪除所有數據
DELETE FROM 表名稱
DELETE * FROM 表名稱
```
### SELECT語句的執行的邏輯查詢處理步驟:
> (8) SELECT
> (9)DISTINCT
> (11) <TOP_specification> <select_list>
> (1) FROM <left_table>
> (3) <join_type> JOIN <right_table>
> (2) ON <join_condition>
> (4) WHERE <where_condition>
> (5) GROUP BY <group_by_list>
> (6) WITH {CUBE | ROLLUP}
> (7) HAVING <having_condition>
> (10) ORDER BY <order_by_list>
> 每個步驟產生一個虛擬表,該虛擬表被用作下一個步驟的輸入。只有最后一步生成的表返回給調用者。如
> 果沒有某一子句,則跳過相應的步驟。
1. FROM:對FROM子句中的前兩個表執行笛卡爾積,生成虛擬表VT1。
2. ON:對VT1應用ON篩選器。只有那些使<join_condition>為真的行才被插入VT2。
3. OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行將作為外部行添加到VT2,生成VT3。如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重復執行步驟1到步驟3,直到 處理完所有的表為止。
4. 對VT3應用WHERE篩選器。只有使<where_condition>為TRUE的行才被插入VT4。
5. GROUP BY:按GROUP BY 子句中的列列表對VT4中的行分組,生成VT5。
6. CUBE|ROLLUP:把超組插入VT5,生成VT6。
7. HAVING:對VT6應用HAVING篩選器。只有使<having_condition>為TRUE的組才會被插入VT7。
8. SELECT:處理SELECT列表,產生VT8。
9. DISTINCT:將重復的行從VT8中移除,產生VT9。
10. ORDER BY:將VT9中的行按ORDER BY子句中的列列表排序,生成一個有表(VC10)。
11. TOP:從VC10的開始處選擇指定數量或比例的行,生成表VT11,并返回給調用者。