---
# System prepended metadata

title: 寶可夢資料庫

---

# 寶可夢資料庫
* Description:
This Project is going to tranning to setup DBMS, using SQL laguage, Bulding ERD.
* Environment: 
    * System OS: MacOS 16.x arm64
    * DBMS: PostgerSQL
    * support: brew 
* Tpoic: Pokemongo
* Data referenct: https://pokemondb.net/pokedex/charizard/moves/1

# Envirnment Setup
## PostgerSQL
### PostgerSQL Install
1. install postgerSQL server in computer
``` bash
brew install postgersql@12
```
2. install GUI tools that can Control PostgerSQL
``` bash
brew install pgadmin4
```
### Setup PostgerSQL
1. open app pgadmin4
2. create a new server group for pokimongo project, db name pokimongo
![](https://hackmd.io/_uploads/SJoef4k82.png)
3. Register the database
![](https://hackmd.io/_uploads/r1RbfNJUh.png)



4. setting databases' name
![](https://hackmd.io/_uploads/HyhGGN1Lh.png)
5. setting connection
ps: connection url must must localhost
Username must be your computer's username
Password must be your conputer's User's password
![](https://hackmd.io/_uploads/S1utGEkLn.png)

6. setup finish, then you can see the database in the server
![](https://hackmd.io/_uploads/rJ5JMEyL3.png)


## Install
1. Install Python3
``` bash
brew install python3
```
2. Check Python3 is installed
``` bash
python3 --version
```
3. Install Python3-pip
``` bash
brew install python3-pip
```
4. Install virtualenv
``` bash
brew install virtualenv
```
5. using virtualenv to create a python virtualenv
``` bash
virtualenv env
```
6. activaity virtual python envirnment
``` bash
source env/bin/activate
```
if the envirnment is activate, there must a () in front of the command, and the virtual directory in the ().
7. install Django
``` bash
pip install Djangle
```
8. start up the Django Project
``` bash
django-admin startproject porject
```
9. run the server
```bash!
python project/manage.py run server
```
10. open the ip addres 127.0.0.1:8000, there is a running website. 

# Project 
## Schema
### ERD
![](https://hackmd.io/_uploads/H1u6Gtmwh.png)
### Tables Describtion


**pokemon_evolution：**
evol_id INT (11) pk
evolved_species_id INT(11)fk(pokemon_evolution_matchup)
evol_minimum_level INT(11)//進化所需等級
解釋：紀錄寶可夢物種的進化和進化所需等級
![](https://hackmd.io/_uploads/ByvxyzVDn.png)

**base_stats:**
pok_id INT(11)pk fk(pokemon)
b_hp INT (11)
b_atk INT (11)
b_def INT (11)
b_sp_atk INT (11)//特攻
b_sp_def INT (11)
b_speed INT (11)
解釋：紀錄寶可夢的攻擊力、防禦力、速度
![](https://hackmd.io/_uploads/SJ0s0-4w2.png)

**abilities:**
abil_id INT (11)
abil_name VARCHAR (79)
解釋：紀錄能力和能力解釋
![](https://hackmd.io/_uploads/BJG6CbNPn.png)

**pokemon abilities:**
pok_id INT(11)
abil_id INT (11)
is_hidden TINYINT (1)//是否有隱藏屬性
slot INT (11)表示隱藏屬性
解釋：紀錄寶可夢擁有的能力
![](https://hackmd.io/_uploads/SJIqkMNw3.png)


**pokemon_evolution_matchup:**
pok_id INT(11) pk fk
evolves_from_species_id INT (11)//進化物種id
hab_id INT (11) fk(pokemon_habitats) //棲息地的id
gender_rate INT (11)//性別比率
capture_rate INT(11)//捕獲概率
base_happiness INT(11)//基礎親密度
解釋：紀錄進化的相關數值
![](https://hackmd.io/_uploads/BJ6myz4Ph.png)

**pokemon:**
pok_id INT (11)
pok_name VARCHAR(79)
species id INT(11)
pok_height INT(11)
pok_weight INT(11)
pok_base_experience INT (11)
解釋：紀錄寶可夢的基礎數值
![](https://hackmd.io/_uploads/SJ8HJGEvh.png)

**pokemon move methods:**
method_id INT (11) pk
method_name VARCHAR (79)
解釋：紀錄所有技能的基本介紹
![](https://hackmd.io/_uploads/HkFTJfVw3.png)

**pokemon_habitats:**
hab_id INT (11) pk
hab_name VARCHAR (79)
hab_descript VARCHAR (400)
解釋：紀錄棲息地與介紹
![](https://hackmd.io/_uploads/B1Ugef4v3.png)

**pokemon_types:**
pok_id INT (11)pk fk
type_id INT(11)fk(type_efficacy)
slot INT(11)pk//幾個複合屬性:1或2
解釋：紀錄寶可夢擁有的屬性和複合屬性
![](https://hackmd.io/_uploads/H1wfxzVw3.png)


**Dokemon_moves:**
pok id INT(11)pk fk
version_group id INT(11) fk(version_group)
move_id INT (11)fk(moves)
method_id INT (11)//fk(pokemon move methods)技能id
level INT(11)//學習技能等級條件
解釋：紀錄寶可夢技能信息和學習技能條件
![](https://hackmd.io/_uploads/rkaNlGEvh.png)

**types:**
type_id INT(11) pk
type_name VARCHAR (79)
damage_type_id INT (11) fk(type_efficacy)
解釋：紀錄寶可夢所有屬性和解釋
![](https://hackmd.io/_uploads/Hk-wxGVwn.png)


**moves:**
move_id INT(11)pk
move_name VARCHAR (79)
type_id INT(11)fk(type)
move_power SMALLINT(6)
move_pp SMALLINT(6)
move_accuracy SMALLINT (6)
解釋：紀錄寶可夢所有技能和解釋
![](https://hackmd.io/_uploads/HJLtlz4vh.png)

**version_groups:**
version_id INT (11) pk
version_name VARCHAR (79)
order INT(11)
解釋：紀錄寶可夢的版本
![](https://hackmd.io/_uploads/HyPolzVv2.png)

**type_efficacy:**
damage_type_id INT (11) pk fk(types)
//攻擊屬性
target_type_id INT (11) pk//被攻擊屬性
damage_factor INT(11) //傷害係數
解釋：紀錄寶可夢對戰時屬性剋制的傷害百分比
![](https://hackmd.io/_uploads/B1DaezNv3.png)


## search
### 計算出每個寶可夢的總基本統計數值。
``` sql
SELECT pokemon.pok_id, pokemon.pok_name, base_stats.b_atk, base_stats.b_def, base_stats.b_hp, 
base_stats.b_speed, base_stats.b_sp_atk, base_stats.b_sp_def,
sum(base_stats.b_atk + base_stats.b_def + base_stats.b_hp + base_stats.b_speed + base_stats.b_sp_atk + base_stats.b_sp_def) AS total
FROM pokemon
INNER JOIN base_stats
ON pokemon.pok_id = base_stats.pok_id
GROUP BY pokemon.pok_id, pokemon.pok_name, base_stats.b_atk, base_stats.b_def, base_stats.b_hp, base_stats.b_speed, base_stats.b_sp_atk, base_stats.b_sp_def;
```



![](https://hackmd.io/_uploads/SJq74Kmv2.png)


這個查詢的目的是從pokemon表和base_stats表中擷取寶可夢的ID、名稱以及基本統計資料，並計算出每個寶可夢的總基本統計數值。

透過INNER JOIN，將pokemon表和base_stats表以pok_id欄位連接在一起，這個欄位用於表示寶可夢的ID。這樣，我們可以在同一查詢中獲取這兩個表中相關的資料。

查詢使用GROUP BY語句將結果按照pokemon.pok_id、pokemon.pok_name、base_stats.b_atk、base_stats.b_def、base_stats.b_hp、base_stats.b_speed、base_stats.b_sp_atk和base_stats.b_sp_def分組。這意味著對於每個唯一的組合，將計算總基本統計數值。

sum(base_stats.b_atk + base_stats.b_def + base_stats.b_hp + base_stats.b_speed + base_stats.b_sp_atk + base_stats.b_sp_def)是一個計算欄位，它將每個寶可夢的攻擊、防禦、生命值、速度、特殊攻擊和特殊防禦值相加，獲得總基本統計數值。

這個查詢結果將顯示每個寶可夢的ID、名稱以及基本統計資料，並在最後一列顯示總基本統計數值。


---

### 找出所有草屬性
```sql
SELECT pokemon.pok_id, pokemon.pok_name, types.type_name
FROM pokemon
INNER JOIN pokemon_types
ON pokemon.pok_id = pokemon_types.pok_id
INNER JOIN types
ON pokemon_types.type_id = types.type_id
WHERE types.type_name LIKE '%grass%';
```

![](https://hackmd.io/_uploads/HkUc7tQv3.png)


在PostgerSQL中，我們可以使用相同的JOIN語法來執行表之間的連接。要創建一個視圖（View），我們使用CREATE VIEW語句，後面跟著視圖名稱（grass_type_view），然後是SELECT語句，該語句定義了視圖的結構和內容。

這個查詢的目的是創建一個名為grass_type_view的視圖，該視圖將顯示具有"grass"類型的寶可夢的ID、名稱和類型。通過內部連接（INNER JOIN），將pokemon表、pokemon_types表和types表聯繫在一起。pokemon.pok_id和pokemon_types.pok_id之間的連接欄位是寶可夢的ID，pokemon_types.type_id和types.type_id之間的連接欄位是類型的ID。

WHERE子句用於過濾出具有包含"grass"的類型名稱的寶可夢。LIKE運算符用於執行模糊匹配，"%grass%"表示包含"grass"的任何字串。

透過創建這個巢狀結構的視圖，您可以輕鬆地查詢並檢索出符合指定條件的寶可夢資訊，而不需要每次都重新編寫完整的查詢。只需使用SELECT * FROM grass_type_view即可獲取視圖的結果。



---
###    此查詢中使用了巢狀子查詢來獲取前4個總基本統計數值最高的寶可夢。
``` sql
SELECT subquery.pok_id, subquery.pok_name, subquery.b_atk, subquery.b_def, subquery.b_hp, 
       subquery.b_speed, subquery.b_sp_atk, subquery.b_sp_def, subquery.TOTAL
FROM (
    SELECT pokemon.pok_id, pokemon.pok_name, base_stats.b_atk, base_stats.b_def, base_stats.b_hp, 
           base_stats.b_speed, base_stats.b_sp_atk, base_stats.b_sp_def,
           sum(base_stats.b_atk + base_stats.b_def + base_stats.b_hp + base_stats.b_speed + base_stats.b_sp_atk + base_stats.b_sp_def) as TOTAL
    FROM pokemon
    INNER JOIN base_stats
    ON pokemon.pok_id = base_stats.pok_id
    GROUP BY pokemon.pok_id, pokemon.pok_name, base_stats.b_atk, base_stats.b_def, base_stats.b_hp, base_stats.b_speed, base_stats.b_sp_atk, base_stats.b_sp_def
) AS subquery
WHERE subquery.pok_id IN (
    SELECT pokemon.pok_id
    FROM pokemon
    INNER JOIN base_stats
    ON pokemon.pok_id = base_stats.pok_id
    GROUP BY pokemon.pok_id
    ORDER BY sum(base_stats.b_atk + base_stats.b_def + base_stats.b_hp + base_stats.b_speed + base_stats.b_sp_atk + base_stats.b_sp_def) DESC
    LIMIT 4
);
```
![](https://hackmd.io/_uploads/SkJiNFQPh.png)



以下是查詢的解釋：

內部子查詢：在子查詢中，我們根據寶可夢的ID和基本統計資料計算總基本統計數值。這個子查詢將結果按照pokemon.pok_id、pokemon.pok_name、base_stats.b_atk、base_stats.b_def、base_stats.b_hp、base_stats.b_speed、base_stats.b_sp_atk和base_stats.b_sp_def分組。
外部查詢：在外部查詢中，我們從內部子查詢中選擇ID、名稱和基本統計資料，並將其命名為subquery。然後，我們使用WHERE子句來篩選出總基本統計數值最高的4個寶可夢。
子查詢的WHERE條件式中，subquery.pok_id IN (...)，我們使用另一個子查詢來獲取前4個總基本統計數值最高的寶可夢的ID。
內部子查詢中的第二個子查詢用於計算總基本統計數值




