├── .devcontainer └── devcontainer.json ├── .github └── dependabot.yml ├── .gitignore ├── README.md ├── lesson10 ├── lesson10_1.ipynb ├── lesson10_2.ipynb └── names.txt ├── lesson10_1.ipynb ├── lesson11_1.ipynb ├── lesson13 ├── lesson13_0.ipynb └── lesson13_1.py ├── lesson14 ├── lesson14_1.py ├── lesson14_2.py ├── lesson14_3.py ├── lesson14_4.py └── lesson14_5.py ├── lesson15 ├── lesson15_1.ipynb ├── lesson15_1.py ├── lesson15_2.py ├── lesson15_3.ipynb └── lesson15_3.py ├── lesson16 ├── lesson16_1.py ├── lesson16_2.py └── requirements.txt ├── lesson18 ├── lesson18_1.ipynb ├── lesson18_2.ipynb ├── lesson18_3.ipynb ├── lesson18_4.py └── requirements.txt ├── lesson1_0.ipynb ├── lesson1_0.py ├── lesson1_1.ipynb ├── lesson1_2.ipynb ├── lesson8_1.ipynb ├── lesson8_2.ipynb ├── lesson9_1.ipynb ├── lesson9_2.ipynb ├── link └── README.md ├── requirements.txt └── sql ├── lesson1.sql ├── lesson10_1.sql ├── lesson15_1.sql ├── lesson18_1.sql ├── lesson2.sql ├── lesson3.sql ├── lesson3_1.sql ├── lesson3_2.sql ├── lesson3_3.sql ├── lesson4_1.sql ├── lesson4_2.sql ├── lesson4_3.sql ├── lesson4_4.sql ├── lesson5_1.sql ├── lesson5_2.sql ├── lesson5_3.sql ├── lesson5_4.sql ├── lesson5_5.sql ├── lesson5_6.sql ├── lesson6_1.sql ├── lesson6_2.sql ├── lesson6_3.sql └── lesson7_1.sql /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the 2 | // README at: https://github.com/devcontainers/templates/tree/main/src/python 3 | { 4 | "name": "Python 3", 5 | // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile 6 | "image": "mcr.microsoft.com/devcontainers/python:1-3.10-bullseye", 7 | "features": { 8 | "ghcr.io/devcontainers/features/git:1": {}, 9 | "ghcr.io/devcontainers/features/github-cli:1": {}, 10 | "ghcr.io/wxw-matt/devcontainer-features/command_runner:0": {}, 11 | "ghcr.io/wxw-matt/devcontainer-features/script_runner:0": {} 12 | } 13 | 14 | // Features to add to the dev container. More info: https://containers.dev/features. 15 | // "features": {}, 16 | 17 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 18 | // "forwardPorts": [], 19 | 20 | // Use 'postCreateCommand' to run commands after the container is created. 21 | // "postCreateCommand": "pip3 install --user -r requirements.txt", 22 | 23 | // Configure tool-specific properties. 24 | // "customizations": {}, 25 | 26 | // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. 27 | // "remoteUser": "root" 28 | } 29 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for more information: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | # https://containers.dev/guide/dependabot 6 | 7 | version: 2 8 | updates: 9 | - package-ecosystem: "devcontainers" 10 | directory: "/" 11 | schedule: 12 | interval: weekly 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # __112_gov_Python_sql__ 2 | 112政-新北-Python程式設計與SQL庫 3 | 4 | ## 上課教室連結 5 | - https://meet.google.com/ptx-fxwn-odh 6 | 7 | ## [link連結](./link) 8 | -------------------------------------------------------------------------------- /lesson10/lesson10_1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "#讀取names.txt\n", 10 | "#建立file物件\n", 11 | "file = open('names.txt',encoding='utf-8')\n", 12 | "#讀取檔案文字\n", 13 | "content:str = file.read()\n", 14 | "print(content)\n", 15 | "#關閉stream\n", 16 | "file.close()\n", 17 | "print(file.closed)" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": null, 23 | "metadata": {}, 24 | "outputs": [], 25 | "source": [ 26 | "#with as 自動close()\n", 27 | "with open('names.txt',encoding='utf-8') as file:\n", 28 | " content:str = file.read()\n", 29 | "\n", 30 | "names:list[str] = content.split(sep='\\n')\n", 31 | "for name in names:\n", 32 | " print(name)\n" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 32, 38 | "metadata": {}, 39 | "outputs": [ 40 | { 41 | "data": { 42 | "text/plain": [ 43 | "100" 44 | ] 45 | }, 46 | "execution_count": 32, 47 | "metadata": {}, 48 | "output_type": "execute_result" 49 | } 50 | ], 51 | "source": [ 52 | "import random\n", 53 | "random.randint(100,105)" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 35, 59 | "metadata": {}, 60 | "outputs": [ 61 | { 62 | "data": { 63 | "text/plain": [ 64 | "'楊少亮'" 65 | ] 66 | }, 67 | "execution_count": 35, 68 | "metadata": {}, 69 | "output_type": "execute_result" 70 | } 71 | ], 72 | "source": [ 73 | "random.choice(names)" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 40, 79 | "metadata": {}, 80 | "outputs": [ 81 | { 82 | "data": { 83 | "text/plain": [ 84 | "['陳倩妮', '陳建豪', '吳晴洋']" 85 | ] 86 | }, 87 | "execution_count": 40, 88 | "metadata": {}, 89 | "output_type": "execute_result" 90 | } 91 | ], 92 | "source": [ 93 | "student_names:list[str] = random.choices(names,k=3)\n", 94 | "student_names" 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "execution_count": 44, 100 | "metadata": {}, 101 | "outputs": [ 102 | { 103 | "data": { 104 | "text/plain": [ 105 | "[{'name': '陳倩妮', '國文': 58, '英文': 83, '數學': 85},\n", 106 | " {'name': '陳建豪', '國文': 79, '英文': 56, '數學': 93},\n", 107 | " {'name': '吳晴洋', '國文': 90, '英文': 58, '數學': 52}]" 108 | ] 109 | }, 110 | "execution_count": 44, 111 | "metadata": {}, 112 | "output_type": "execute_result" 113 | } 114 | ], 115 | "source": [ 116 | "students:list[dict] = []\n", 117 | "for student_name in student_names:\n", 118 | " student:dict = dict() \n", 119 | " student['name'] = student_name\n", 120 | " student['國文'] = random.randint(50,100)\n", 121 | " student['英文'] = random.randint(50,100)\n", 122 | " student['數學'] = random.randint(50,100)\n", 123 | " students.append(student)\n", 124 | "students" 125 | ] 126 | } 127 | ], 128 | "metadata": { 129 | "kernelspec": { 130 | "display_name": "Python 3", 131 | "language": "python", 132 | "name": "python3" 133 | }, 134 | "language_info": { 135 | "codemirror_mode": { 136 | "name": "ipython", 137 | "version": 3 138 | }, 139 | "file_extension": ".py", 140 | "mimetype": "text/x-python", 141 | "name": "python", 142 | "nbconvert_exporter": "python", 143 | "pygments_lexer": "ipython3", 144 | "version": "3.10.13" 145 | } 146 | }, 147 | "nbformat": 4, 148 | "nbformat_minor": 2 149 | } 150 | -------------------------------------------------------------------------------- /lesson10/lesson10_2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 5, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import psycopg2\n", 10 | "conn = psycopg2.connect(\"\")\n", 11 | "cur = conn.cursor()\n", 12 | "sql = '''\n", 13 | "CREATE TABLE IF NOT EXISTS student(\n", 14 | "\tid SERIAL PRIMARY KEY,\n", 15 | "\tname VARCHAR(20),\n", 16 | "\tchinese SMALLINT,\n", 17 | "\tenglish SMALLINT,\n", 18 | "\tmath SMALLINT\n", 19 | ");\n", 20 | "'''\n", 21 | "cur.execute(sql)\n", 22 | "conn.commit()\n", 23 | "cur.close()\n", 24 | "conn.close()" 25 | ] 26 | } 27 | ], 28 | "metadata": { 29 | "kernelspec": { 30 | "display_name": "Python 3", 31 | "language": "python", 32 | "name": "python3" 33 | }, 34 | "language_info": { 35 | "codemirror_mode": { 36 | "name": "ipython", 37 | "version": 3 38 | }, 39 | "file_extension": ".py", 40 | "mimetype": "text/x-python", 41 | "name": "python", 42 | "nbconvert_exporter": "python", 43 | "pygments_lexer": "ipython3", 44 | "version": "3.10.13" 45 | } 46 | }, 47 | "nbformat": 4, 48 | "nbformat_minor": 2 49 | } 50 | -------------------------------------------------------------------------------- /lesson10/names.txt: -------------------------------------------------------------------------------- 1 | 陳怡伶 2 | 馮芳如 3 | 蒙淑惠 4 | 張軒宸 5 | 陳向愛 6 | 賴心怡 7 | 王怡珊 8 | 林詠斌 9 | 陳淑娟 10 | 崔孝憲 11 | 林希啟 12 | 楊韋廷 13 | 陳文賢 14 | 王士銘 15 | 賴昌韻 16 | 黃名明 17 | 吳麗卿 18 | 游治旺 19 | 蔡嘉音 20 | 黃靜怡 21 | 黃淑芬 22 | 龔姵君 23 | 景歡燦 24 | 李政成 25 | 楊綺芬 26 | 昌嘉洋 27 | 李慈啟 28 | 游倫城 29 | 林淑安 30 | 蔡士賢 31 | 林世城 32 | 林佳蓉 33 | 柯宜臻 34 | 傅佳琳 35 | 林瑞喬 36 | 林佳慧 37 | 鍾俞禎 38 | 劉慧君 39 | 劉林中 40 | 林怡偉 41 | 余丞苓 42 | 黃佩玲 43 | 林建宏 44 | 方雅慧 45 | 林柏洋 46 | 郭舜昇 47 | 艾巧夫 48 | 童建霖 49 | 蔡至剛 50 | 黃心航 51 | 張凡成 52 | 郭淑枝 53 | 黃必琪 54 | 楊健麟 55 | 林建勳 56 | 鄭琇亞 57 | 王雅琴 58 | 李美洋 59 | 楊少亮 60 | 王泓泰 61 | 黃江旭 62 | 王梅劭 63 | 林佳光 64 | 盧必妍 65 | 林思賢 66 | 鄧哲榮 67 | 陳家年 68 | 張俊傑 69 | 洪阿惠 70 | 陳彥治 71 | 盧冠發 72 | 程玫靖 73 | 潘俊賢 74 | 呂傑宣 75 | 鄭孟芳 76 | 彭茹靖 77 | 王孝純 78 | 吳昕婷 79 | 朱惠儀 80 | 盧文啟 81 | 謝佳穎 82 | 鄭憲定 83 | 馮淑芬 84 | 聶心怡 85 | 黃志福 86 | 馬彥文 87 | 郭淑真 88 | 吳欣書 89 | 鄭佳玲 90 | 黃健發 91 | 胡姿婷 92 | 林義皓 93 | 胡芳瑜 94 | 楊易政 95 | 王德城 96 | 劉依婷 97 | 吳俐芷 98 | 黃詩妃 99 | 柯韋成 100 | 鄧亭聿 101 | 王雅慧 102 | 陳凱翔 103 | 藍哲嘉 104 | 趙偉銘 105 | 張韋成 106 | 林向鈺 107 | 周琬婷 108 | 尚偉倫 109 | 賴佳雯 110 | 陳姵彬 111 | 林群清 112 | 趙家豪 113 | 李政白 114 | 林俊翔 115 | 李進慧 116 | 楊韻如 117 | 藍姿婷 118 | 劉嘉泰 119 | 王柏聖 120 | 孫宜珊 121 | 戴萱能 122 | 高士凱 123 | 楊又源 124 | 劉昀天 125 | 王怡君 126 | 余月修 127 | 劉萬季 128 | 陳信宏 129 | 陳孝邦 130 | 朱彥志 131 | 陳奇瑄 132 | 鄧淑娟 133 | 陳逸凡 134 | 張牧聿 135 | 唐雪豪 136 | 林康亮 137 | 黃旻林 138 | 蕭淑華 139 | 劉雯芬 140 | 陳美惠 141 | 孫火清 142 | 溫法堯 143 | 錢欣潔 144 | 陳倩潔 145 | 李雅怡 146 | 白美珍 147 | 葉志峰 148 | 黃佩芬 149 | 黃麗美 150 | 黃奎紹 151 | 邱亭君 152 | 詹忠光 153 | 戚亨 154 | 賴又琦 155 | 林佳人 156 | 黃善迪 157 | 賴苑禾 158 | 溫重意 159 | 周怡啟 160 | 王明昇 161 | 羅佩樺 162 | 陳家維 163 | 張莉雯 164 | 高俊男 165 | 林冠蕙 166 | 王品星 167 | 吳孟穎 168 | 黃雅慧 169 | 馮耀中 170 | 元延辛 171 | 王坤安 172 | 陳慧君 173 | 張伊映 174 | 林士凱 175 | 蘇婷婷 176 | 陳淑萍 177 | 林玉佩 178 | 謝貞妃 179 | 杜儀鳳 180 | 陳倩妮 181 | 胡淑貞 182 | 楊偉翔 183 | 姜琬婷 184 | 張雅芬 185 | 葉祖雄 186 | 沈心利 187 | 彭虹屏 188 | 余宗儒 189 | 李立偉 190 | 臧怡君 191 | 吳振瑋 192 | 陳建豪 193 | 蕭怡伶 194 | 周芷蓁 195 | 黃偉剛 196 | 黃婷婷 197 | 郎慧萍 198 | 林昱芳 199 | 趙宛真 200 | 白世宏 201 | 杜明延 202 | 許淑婷 203 | 林珍旺 204 | 蔡孟泉 205 | 吳晴洋 206 | 游一鈺 207 | 朱士弘 208 | 黃政甫 209 | 游淑惠 210 | 張婕妤 211 | 陳逸華 212 | 張天亨 213 | 張嘉韋 214 | 王志謙 215 | 黎惠雯 216 | 高信宏 217 | 梁柏宇 218 | 林志喜 219 | 金宜芳 220 | 簡國瑋 221 | 林清英 222 | 黃彥孝 223 | 鄭奇翰 224 | 李慶亮 225 | 李蓉瑞 226 | 張明惟 227 | 游詩亞 228 | 黃嘉琪 229 | 張家秀 230 | 吳柏誠 231 | 陳得映 232 | 郭致恬 233 | 林麗萍 234 | 陳樂紫 235 | 翁鈺婷 236 | 蔡世馨 237 | 楊建安 238 | 李湘婷 239 | 鞠冠宇 240 | 林志成 241 | 陳信念 242 | 林益妏 243 | 蔡偉成 244 | 王惠皓 245 | 王筱婷 246 | 楊火帆 247 | 陳怡珊 248 | 張慧君 249 | 翁羽威 250 | 羅幸娥 251 | 陳俊憲 252 | 洪奎夫 253 | 翁均安 254 | 吳明妮 255 | 高智超 256 | 王人仰 257 | 劉旭士 258 | 蘇凡菁 259 | 謝哲維 260 | 彭偉妃 261 | 劉耿琦 262 | 黃柏宇 263 | 李佳彥 264 | 唐翊修 265 | 陳建香 266 | 葉軍仰 267 | 吳志宣 268 | 林珈發 269 | 黃翔杰 270 | 郭坤花 271 | 吳淑惠 272 | 簡美君 273 | 許芳如 274 | 謝水儒 275 | 陳怡容 276 | 蔡欣汝 277 | 王良斌 278 | 周家銘 279 | 張凱妮 280 | 鄭淑珍 281 | 陳嘉淑 282 | 魏秋萍 283 | 簡佳樺 284 | 劉佳佩 285 | 李彥伸 286 | 陳筱涵 287 | 蔡明平 288 | 王展人 289 | 方筠紹 290 | 陳志偉 291 | 錢佩豪 292 | 陳冠霞 293 | 潘英迪 294 | 陳冠竹 295 | 李淑芳 296 | 謝南慧 297 | 趙家豪 298 | 龐皓芳 299 | 張彥博 -------------------------------------------------------------------------------- /lesson10_1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import psycopg2" 10 | ] 11 | } 12 | ], 13 | "metadata": { 14 | "kernelspec": { 15 | "display_name": "Python 3", 16 | "language": "python", 17 | "name": "python3" 18 | }, 19 | "language_info": { 20 | "codemirror_mode": { 21 | "name": "ipython", 22 | "version": 3 23 | }, 24 | "file_extension": ".py", 25 | "mimetype": "text/x-python", 26 | "name": "python", 27 | "nbconvert_exporter": "python", 28 | "pygments_lexer": "ipython3", 29 | "version": "3.10.13" 30 | } 31 | }, 32 | "nbformat": 4, 33 | "nbformat_minor": 2 34 | } 35 | -------------------------------------------------------------------------------- /lesson11_1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 建立環境變數" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 14, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "data": { 17 | "text/plain": [ 18 | "True" 19 | ] 20 | }, 21 | "execution_count": 14, 22 | "metadata": {}, 23 | "output_type": "execute_result" 24 | } 25 | ], 26 | "source": [ 27 | "import psycopg2\n", 28 | "import os\n", 29 | "from psycopg2 import connect\n", 30 | "from dotenv import load_dotenv\n", 31 | "\n", 32 | "#初始化環境變數\n", 33 | "load_dotenv()" 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": {}, 39 | "source": [ 40 | "## 建立資料表student" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 15, 46 | "metadata": {}, 47 | "outputs": [], 48 | "source": [ 49 | "#使用環境變數POSTGRE_PASSWORD,取得密碼,並建立connect(連線)的實體\n", 50 | "conn:connect = psycopg2.connect(os.environ['POSTGRE_PASSWORD'])\n", 51 | "\n", 52 | "# 建立cursor實體,準備執行SQL\n", 53 | "cur = conn.cursor()\n", 54 | "\n", 55 | "sql = '''\n", 56 | "CREATE TABLE IF NOT EXISTS student(\n", 57 | "\tid SERIAL PRIMARY KEY,\n", 58 | "\tname VARCHAR(20),\n", 59 | "\tchinese SMALLINT,\n", 60 | "\tenglish SMALLINT,\n", 61 | "\tmath SMALLINT\n", 62 | ");\n", 63 | "'''\n", 64 | "\n", 65 | "#執行sql\n", 66 | "cur.execute(sql)\n", 67 | "\n", 68 | "#確認SQL可以執行\n", 69 | "conn.commit()\n", 70 | "\n", 71 | "#關閉cursor\n", 72 | "cur.close()\n", 73 | "\n", 74 | "#關閉連線\n", 75 | "conn.close()" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": {}, 81 | "source": [ 82 | "## 新增資料" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 19, 88 | "metadata": {}, 89 | "outputs": [], 90 | "source": [ 91 | "#使用環境變數POSTGRE_PASSWORD,取得密碼,並建立connect(連線)的實體\n", 92 | "conn:connect = psycopg2.connect(os.environ['POSTGRE_PASSWORD'])\n", 93 | "\n", 94 | "# 建立cursor實體,準備執行SQL\n", 95 | "cur = conn.cursor()\n", 96 | "\n", 97 | "sql = '''\n", 98 | "INSERT INTO student(name, chinese, english, math)\n", 99 | "VALUES(%(name)s,%(chinese)s,%(english)s,%(math)s);\n", 100 | "'''\n", 101 | "\n", 102 | "#執行sql\n", 103 | "cur.execute(sql,{'name':'張國堂','chinese':89, 'english':90, 'math':78})\n", 104 | "\n", 105 | "#確認SQL可以執行\n", 106 | "conn.commit()\n", 107 | "\n", 108 | "#關閉cursor\n", 109 | "cur.close()\n", 110 | "\n", 111 | "#關閉連線\n", 112 | "conn.close()" 113 | ] 114 | }, 115 | { 116 | "cell_type": "markdown", 117 | "metadata": {}, 118 | "source": [ 119 | "## 新增多筆資料" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 21, 125 | "metadata": {}, 126 | "outputs": [], 127 | "source": [ 128 | "#使用環境變數POSTGRE_PASSWORD,取得密碼,並建立connect(連線)的實體\n", 129 | "conn:connect = psycopg2.connect(os.environ['POSTGRE_PASSWORD'])\n", 130 | "\n", 131 | "# 建立cursor實體,準備執行SQL\n", 132 | "cur = conn.cursor()\n", 133 | "\n", 134 | "sql = '''\n", 135 | "INSERT INTO student(name, chinese, english, math)\n", 136 | "VALUES(%(name)s,%(chinese)s,%(english)s,%(math)s);\n", 137 | "'''\n", 138 | "\n", 139 | "#執行sql\n", 140 | "data:list[dict] = [\n", 141 | " {'name':'王國堂','chinese':89, 'english':75, 'math':92},\n", 142 | " {'name':'陳國堂','chinese':65, 'english':93, 'math':59},\n", 143 | " {'name':'邱國堂','chinese':71, 'english':64, 'math':92}\n", 144 | "]\n", 145 | "for item in data:\n", 146 | " cur.execute(sql,item)\n", 147 | "\n", 148 | "#確認SQL可以執行\n", 149 | "conn.commit()\n", 150 | "\n", 151 | "#關閉cursor\n", 152 | "cur.close()\n", 153 | "\n", 154 | "#關閉連線\n", 155 | "conn.close()" 156 | ] 157 | }, 158 | { 159 | "cell_type": "markdown", 160 | "metadata": {}, 161 | "source": [ 162 | "## 顯示資料表" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 22, 168 | "metadata": {}, 169 | "outputs": [ 170 | { 171 | "name": "stdout", 172 | "output_type": "stream", 173 | "text": [ 174 | "[(1, '徐國堂', 78, 65, 73), (2, '張國堂', 89, 90, 78), (3, '王國堂', 89, 75, 92), (4, '陳國堂', 65, 93, 59), (5, '邱國堂', 71, 64, 92)]\n" 175 | ] 176 | } 177 | ], 178 | "source": [ 179 | "#使用環境變數POSTGRE_PASSWORD,取得密碼,並建立connect(連線)的實體\n", 180 | "conn:connect = psycopg2.connect(os.environ['POSTGRE_PASSWORD'])\n", 181 | "\n", 182 | "# 建立cursor實體,準備執行SQL\n", 183 | "cur = conn.cursor()\n", 184 | "\n", 185 | "sql = '''\n", 186 | "SELECT *\n", 187 | "FROM student\n", 188 | "'''\n", 189 | "\n", 190 | "#執行sql\n", 191 | "cur.execute(sql)\n", 192 | "\n", 193 | "#取得資料\n", 194 | "print(cur.fetchall())\n", 195 | "\n", 196 | "#確認SQL可以執行\n", 197 | "conn.commit()\n", 198 | "\n", 199 | "#關閉cursor\n", 200 | "cur.close()\n", 201 | "\n", 202 | "#關閉連線\n", 203 | "conn.close()" 204 | ] 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "metadata": {}, 209 | "source": [ 210 | "## 刪除表格\n" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 13, 216 | "metadata": {}, 217 | "outputs": [], 218 | "source": [ 219 | "#使用環境變數POSTGRE_PASSWORD,取得密碼,並建立connect(連線)的實體\n", 220 | "conn:connect = psycopg2.connect(os.environ['POSTGRE_PASSWORD'])\n", 221 | "\n", 222 | "# 建立cursor實體,準備執行SQL\n", 223 | "cur = conn.cursor()\n", 224 | "\n", 225 | "sql = '''\n", 226 | "DROP TABLE IF EXISTS student;\n", 227 | "'''\n", 228 | "\n", 229 | "#執行sql\n", 230 | "cur.execute(sql)\n", 231 | "\n", 232 | "\n", 233 | "#確認SQL可以執行\n", 234 | "conn.commit()\n", 235 | "\n", 236 | "#關閉cursor\n", 237 | "cur.close()\n", 238 | "\n", 239 | "#關閉連線\n", 240 | "conn.close()" 241 | ] 242 | } 243 | ], 244 | "metadata": { 245 | "kernelspec": { 246 | "display_name": "Python 3", 247 | "language": "python", 248 | "name": "python3" 249 | }, 250 | "language_info": { 251 | "codemirror_mode": { 252 | "name": "ipython", 253 | "version": 3 254 | }, 255 | "file_extension": ".py", 256 | "mimetype": "text/x-python", 257 | "name": "python", 258 | "nbconvert_exporter": "python", 259 | "pygments_lexer": "ipython3", 260 | "version": "3.10.13" 261 | } 262 | }, 263 | "nbformat": 4, 264 | "nbformat_minor": 2 265 | } 266 | -------------------------------------------------------------------------------- /lesson13/lesson13_0.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "data": { 10 | "text/plain": [ 11 | "True" 12 | ] 13 | }, 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "output_type": "execute_result" 17 | } 18 | ], 19 | "source": [ 20 | "#建立電腦的環境變數(不是真實的,是模擬的),並且載入\n", 21 | "from dotenv import load_dotenv\n", 22 | "load_dotenv()\n" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 3, 28 | "metadata": {}, 29 | "outputs": [], 30 | "source": [ 31 | "#連線資料庫\n", 32 | "#使用電腦的環境變數\n", 33 | "import psycopg2\n", 34 | "import os\n", 35 | "conn = psycopg2.connect(os.environ['POSTGRE_PASSWORD'])\n", 36 | "\n", 37 | "conn.commit()\n", 38 | "conn.close()" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 5, 44 | "metadata": {}, 45 | "outputs": [], 46 | "source": [ 47 | "#使用with as的語法,可以自動commit(),close()\n", 48 | "with psycopg2.connect(os.environ['POSTGRE_PASSWORD']) as conn:\n", 49 | " cursor = conn.cursor()\n", 50 | " sql = '''\n", 51 | " CREATE TABLE IF NOT EXISTS 客戶(\n", 52 | "\t 客戶_id SERIAL,\n", 53 | "\t 客戶名稱 VARCHAR(255) NOT NULL,\n", 54 | "\t PRIMARY KEY(客戶_id)\n", 55 | " );\n", 56 | " '''\n", 57 | " cursor.execute(sql)\n", 58 | " \n", 59 | " sql = '''\n", 60 | " CREATE TABLE IF NOT EXISTS 聯絡人(\n", 61 | "\t 聯絡人id SERIAL,\n", 62 | "\t 客戶id INT,\n", 63 | "\t 聯絡人姓名 VARCHAR(255) NOT NULL,\n", 64 | "\t 電話 VARCHAR(15),\n", 65 | "\t 郵件 VARCHAR(100),\n", 66 | "\t PRIMARY KEY(聯絡人id),\n", 67 | "\t FOREIGN KEY(客戶id) REFERENCES 客戶(客戶_id)\n", 68 | " );\n", 69 | " '''\n", 70 | " cursor.execute(sql)\n", 71 | " cursor.close()\n", 72 | "\n" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 6, 78 | "metadata": {}, 79 | "outputs": [], 80 | "source": [ 81 | "conn = psycopg2.connect(os.environ['POSTGRE_PASSWORD'])\n", 82 | "with conn:\n", 83 | " with conn.cursor() as cursor:\n", 84 | " sql='''\n", 85 | " INSERT INTO 客戶(客戶名稱)\n", 86 | " VALUES('遠傳電信'),\n", 87 | " ('台灣大車隊');\n", 88 | " '''\n", 89 | " cursor.execute(sql)\n", 90 | " \n", 91 | "conn.close()" 92 | ] 93 | }, 94 | { 95 | "cell_type": "code", 96 | "execution_count": 7, 97 | "metadata": {}, 98 | "outputs": [], 99 | "source": [ 100 | "with psycopg2.connect(os.environ['POSTGRE_PASSWORD']) as conn:\n", 101 | " with conn.cursor() as cursor:\n", 102 | " sql='''\n", 103 | " INSERT INTO 聯絡人(客戶id,聯絡人姓名,電話,郵件)\n", 104 | " VALUES (1,'John Doe','(408)-111-1234','john.doe@bluebird.dev'),\n", 105 | "\t (1,'Jane Doe','(408)-111-1235','jane.doe@bluebird.dev'),\n", 106 | "\t (2,'David Wright','(408)-222-1234','david.wright@dolphin.dev');\n", 107 | " '''\n", 108 | " cursor.execute(sql)\n", 109 | "\n" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": 10, 115 | "metadata": {}, 116 | "outputs": [ 117 | { 118 | "name": "stdout", 119 | "output_type": "stream", 120 | "text": [ 121 | "[]\n", 122 | "(1, '遠傳電信', 'John Doe', '(408)-111-1234', 'john.doe@bluebird.dev')\n", 123 | "(2, '遠傳電信', 'Jane Doe', '(408)-111-1235', 'jane.doe@bluebird.dev')\n", 124 | "(3, '台灣大車隊', 'David Wright', '(408)-222-1234', 'david.wright@dolphin.dev')\n" 125 | ] 126 | } 127 | ], 128 | "source": [ 129 | "with psycopg2.connect(os.environ['POSTGRE_PASSWORD']) as conn:\n", 130 | " with conn.cursor() as cursor:\n", 131 | " sql='''\n", 132 | " SELECT 聯絡人id,客戶名稱,聯絡人姓名,電話,郵件\n", 133 | " FROM 聯絡人 LEFT JOIN 客戶 ON 聯絡人.客戶id = 客戶.客戶_id\n", 134 | " '''\n", 135 | " cursor.execute(sql)\n", 136 | " datas:list = cursor.fetchmany(10)\n", 137 | " \n", 138 | "\n", 139 | "for item in datas:\n", 140 | " print(item)" 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": 13, 146 | "metadata": {}, 147 | "outputs": [ 148 | { 149 | "name": "stdout", 150 | "output_type": "stream", 151 | "text": [ 152 | "(1, '遠傳電信', 'John Doe', '(408)-111-1234', 'john.doe@bluebird.dev')\n", 153 | "(2, '遠傳電信', 'Jane Doe', '(408)-111-1235', 'jane.doe@bluebird.dev')\n", 154 | "(3, '台灣大車隊', 'David Wright', '(408)-222-1234', 'david.wright@dolphin.dev')\n" 155 | ] 156 | } 157 | ], 158 | "source": [ 159 | "with psycopg2.connect(os.environ['POSTGRE_PASSWORD']) as conn:\n", 160 | " with conn.cursor() as cursor:\n", 161 | " sql='''\n", 162 | " SELECT 聯絡人id,客戶名稱,聯絡人姓名,電話,郵件\n", 163 | " FROM 聯絡人 LEFT JOIN 客戶 ON 聯絡人.客戶id = 客戶.客戶_id\n", 164 | " '''\n", 165 | " cursor.execute(sql)\n", 166 | " while True:\n", 167 | " oneItem = cursor.fetchone()\n", 168 | " if oneItem is not None:\n", 169 | " print(oneItem)\n", 170 | " else:\n", 171 | " break\n", 172 | " \n", 173 | " \n", 174 | "\n" 175 | ] 176 | } 177 | ], 178 | "metadata": { 179 | "kernelspec": { 180 | "display_name": "Python 3", 181 | "language": "python", 182 | "name": "python3" 183 | }, 184 | "language_info": { 185 | "codemirror_mode": { 186 | "name": "ipython", 187 | "version": 3 188 | }, 189 | "file_extension": ".py", 190 | "mimetype": "text/x-python", 191 | "name": "python", 192 | "nbconvert_exporter": "python", 193 | "pygments_lexer": "ipython3", 194 | "version": "3.10.13" 195 | } 196 | }, 197 | "nbformat": 4, 198 | "nbformat_minor": 2 199 | } 200 | -------------------------------------------------------------------------------- /lesson13/lesson13_1.py: -------------------------------------------------------------------------------- 1 | from dotenv import load_dotenv 2 | import psycopg2 3 | import os 4 | load_dotenv() 5 | 6 | with psycopg2.connect(os.environ['POSTGRE_PASSWORD']) as conn: 7 | with conn.cursor() as cursor: 8 | sql=''' 9 | SELECT 聯絡人id,客戶名稱,聯絡人姓名,電話,郵件 10 | FROM 聯絡人 LEFT JOIN 客戶 ON 聯絡人.客戶id = 客戶.客戶_id 11 | ''' 12 | cursor.execute(sql) 13 | datas:list = cursor.fetchmany(10) 14 | 15 | 16 | for item in datas: 17 | print(item) -------------------------------------------------------------------------------- /lesson14/lesson14_1.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | 3 | st.write('Hello, *World!* :sunglasses:') 4 | st.markdown('## 這是標題!') 5 | st.title("我是title!") 6 | st.header("我是header") 7 | st.subheader("我是sub header") -------------------------------------------------------------------------------- /lesson14/lesson14_2.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | 3 | st.title("森永動物園") 4 | 5 | col1, col2, col3 = st.columns(3) 6 | 7 | with col1: 8 | st.header("A cat") 9 | st.image("https://static.streamlit.io/examples/cat.jpg") 10 | 11 | with col2: 12 | st.header("A dog") 13 | st.image("https://static.streamlit.io/examples/dog.jpg") 14 | 15 | with col3: 16 | st.header("An owl") 17 | st.image("https://static.streamlit.io/examples/owl.jpg") -------------------------------------------------------------------------------- /lesson14/lesson14_3.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | 3 | with st.sidebar: 4 | st.write("主題:") 5 | st.title("我是title") 6 | st.header("我是header") 7 | st.subheader("我是subHeader") -------------------------------------------------------------------------------- /lesson14/lesson14_4.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | from dotenv import load_dotenv 3 | import psycopg2 4 | import os 5 | load_dotenv() 6 | 7 | @st.cache_resource 8 | def get_contacts() -> list: 9 | with psycopg2.connect(os.environ['POSTGRE_PASSWORD']) as conn: 10 | with conn.cursor() as cursor: 11 | sql=''' 12 | SELECT 聯絡人id,客戶名稱,聯絡人姓名,電話,郵件 13 | FROM 聯絡人 LEFT JOIN 客戶 ON 聯絡人.客戶id = 客戶.客戶_id 14 | ''' 15 | cursor.execute(sql) 16 | datas:list = cursor.fetchmany(10) 17 | contacts = [] 18 | for item in datas: 19 | contacts.append({'id':item[0],'客戶名稱':item[1],'姓名':item[2],'電話':item[3],'郵件':item[4]}) 20 | return contacts 21 | 22 | 23 | source_data:list[dict] = get_contacts() 24 | 25 | st.dataframe(source_data,width=1200) 26 | -------------------------------------------------------------------------------- /lesson14/lesson14_5.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | from dotenv import load_dotenv 3 | import psycopg2 4 | import os 5 | load_dotenv() 6 | 7 | @st.cache_resource 8 | def get_contacts() -> list: 9 | with psycopg2.connect(os.environ['POSTGRE_PASSWORD']) as conn: 10 | with conn.cursor() as cursor: 11 | sql=''' 12 | SELECT 聯絡人id,客戶名稱,聯絡人姓名,電話,郵件 13 | FROM 聯絡人 LEFT JOIN 客戶 ON 聯絡人.客戶id = 客戶.客戶_id 14 | ''' 15 | cursor.execute(sql) 16 | datas:list = cursor.fetchmany(10) 17 | contacts = [] 18 | for item in datas: 19 | contacts.append({'id':item[0],'客戶名稱':item[1],'姓名':item[2],'電話':item[3],'郵件':item[4]}) 20 | return contacts 21 | 22 | @st.cache_resource 23 | def get_names() -> list: 24 | with psycopg2.connect(os.environ['POSTGRE_PASSWORD']) as conn: 25 | with conn.cursor() as cursor: 26 | sql=''' 27 | SELECT DISTINCT 客戶名稱 28 | FROM 聯絡人 LEFT JOIN 客戶 ON 聯絡人.客戶id = 客戶.客戶_id 29 | ''' 30 | cursor.execute(sql) 31 | datas:list[tuple] = cursor.fetchmany(10) 32 | names = [] 33 | for item in datas: 34 | names.append(item[0]) 35 | return names 36 | 37 | 38 | 39 | with st.sidebar: 40 | option = st.selectbox("請輸入客戶",get_names()) 41 | st.write('You selected:', option) 42 | 43 | 44 | -------------------------------------------------------------------------------- /lesson15/lesson15_1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "data": { 10 | "text/plain": [ 11 | "[1, 2, 3, 4, 5]" 12 | ] 13 | }, 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "output_type": "execute_result" 17 | } 18 | ], 19 | "source": [ 20 | "number_list = [number for number in range(1,6)] \n", 21 | "number_list" 22 | ] 23 | } 24 | ], 25 | "metadata": { 26 | "kernelspec": { 27 | "display_name": "Python 3", 28 | "language": "python", 29 | "name": "python3" 30 | }, 31 | "language_info": { 32 | "codemirror_mode": { 33 | "name": "ipython", 34 | "version": 3 35 | }, 36 | "file_extension": ".py", 37 | "mimetype": "text/x-python", 38 | "name": "python", 39 | "nbconvert_exporter": "python", 40 | "pygments_lexer": "ipython3", 41 | "version": "3.10.13" 42 | } 43 | }, 44 | "nbformat": 4, 45 | "nbformat_minor": 2 46 | } 47 | -------------------------------------------------------------------------------- /lesson15/lesson15_1.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | from dotenv import load_dotenv 3 | import psycopg2 4 | import os 5 | load_dotenv() 6 | 7 | def getCity()->list[str]: 8 | with psycopg2.connect(os.environ['POSTGRE_PASSWORD']) as conn: 9 | with conn.cursor() as cursor: 10 | sql=''' 11 | SELECT DISTINCT SUBSTRING(地址, 1, 3) AS county 12 | FROM stations; 13 | ''' 14 | cursor.execute(sql) 15 | queryDatas:list[tuple[str]] = cursor.fetchall() 16 | #print(queryDatas) 17 | city_names:list[str] = [item[0] for item in queryDatas] 18 | #print(city_names) 19 | return city_names 20 | 21 | def getStation(city_name:str)->list[str]: 22 | with psycopg2.connect(os.environ['POSTGRE_PASSWORD']) as conn: 23 | with conn.cursor() as cursor: 24 | sql=''' 25 | SELECT DISTINCT 名稱 26 | FROM stations 27 | WHERE SUBSTRING(地址, 1, 3) = %(city)s; 28 | ''' 29 | cursor.execute(sql,{'city':city_name} ) 30 | queryDatas:list[tuple[str]] = cursor.fetchall() 31 | station_names:list[str] = [item[0] for item in queryDatas] 32 | #print(station_names) 33 | return station_names 34 | 35 | with st.sidebar: 36 | source_data:list[str] = getCity() 37 | selected_city:str = st.selectbox("選擇縣市",options=source_data) 38 | #print(selected_city) 39 | selected_station:list[str] = getStation(selected_city) 40 | st.selectbox('選擇車站', selected_station) -------------------------------------------------------------------------------- /lesson15/lesson15_2.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | 3 | if 'count' not in st.session_state: 4 | st.session_state.count = 0 5 | 6 | st.title("計數器的範例") 7 | 8 | increment = st.button("增加計數器的值",key="mybutton") 9 | if increment: 10 | st.session_state.count += 1 11 | 12 | st.write("計數器:",st.session_state.count) -------------------------------------------------------------------------------- /lesson15/lesson15_3.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 5, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "有a1的key\n", 13 | "10\n", 14 | "============\n", 15 | "有a2的key\n", 16 | "20\n" 17 | ] 18 | } 19 | ], 20 | "source": [ 21 | "mydict:dict[str,int] = {'a1':10,'a2':20}\n", 22 | "if 'a1' in mydict:\n", 23 | " print('有a1的key')\n", 24 | " print(mydict['a1'])\n", 25 | "print(\"============\")\n", 26 | "if 'a2' in mydict:\n", 27 | " print(\"有a2的key\")\n", 28 | " print(mydict['a2'])\n", 29 | "\n", 30 | "if 'a3' in mydict:\n", 31 | " print(\"有a3的key\")\n", 32 | " print(mydict['a3'])\n" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 7, 38 | "metadata": {}, 39 | "outputs": [ 40 | { 41 | "data": { 42 | "text/plain": [ 43 | "{'a1': 100, 'a2': 200, 'a3': 300}" 44 | ] 45 | }, 46 | "execution_count": 7, 47 | "metadata": {}, 48 | "output_type": "execute_result" 49 | } 50 | ], 51 | "source": [ 52 | "mydict:dict[str,int] = {}\n", 53 | "\n", 54 | "if 'a1' not in mydict:\n", 55 | " mydict['a1'] = 100\n", 56 | " \n", 57 | "\n", 58 | "if 'a2' not in mydict:\n", 59 | " mydict['a2'] = 200\n", 60 | "\n", 61 | "\n", 62 | "\n", 63 | "if 'a3' not in mydict:\n", 64 | " mydict['a3'] = 300\n", 65 | "\n", 66 | "mydict" 67 | ] 68 | } 69 | ], 70 | "metadata": { 71 | "kernelspec": { 72 | "display_name": "Python 3", 73 | "language": "python", 74 | "name": "python3" 75 | }, 76 | "language_info": { 77 | "codemirror_mode": { 78 | "name": "ipython", 79 | "version": 3 80 | }, 81 | "file_extension": ".py", 82 | "mimetype": "text/x-python", 83 | "name": "python", 84 | "nbconvert_exporter": "python", 85 | "pygments_lexer": "ipython3", 86 | "version": "3.10.13" 87 | } 88 | }, 89 | "nbformat": 4, 90 | "nbformat_minor": 2 91 | } 92 | -------------------------------------------------------------------------------- /lesson15/lesson15_3.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | 3 | #建立預設的session_state的key 4 | if 'a1' not in st.session_state: 5 | st.session_state['a1'] = 100 6 | 7 | if 'a2' not in st.session_state: 8 | st.session_state['a2'] = 200 9 | 10 | if 'a3' not in st.session_state: 11 | st.session_state['a3'] = 300 12 | 13 | st.write(st.session_state) -------------------------------------------------------------------------------- /lesson16/lesson16_1.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | 3 | st.title("Sessin_state基礎") 4 | #st.write(st.session_state) 5 | ##使用 input widget 6 | number:int = st.slider("數值",min_value=1,max_value=10,value=5,key='mySlider') 7 | #st.write("加入slider後的session_state",st.session_state) 8 | next = st.button("下一個選項") 9 | if next: 10 | if st.session_state.radio_option == "a": 11 | st.session_state.radio_option = "b" 12 | elif st.session_state.radio_option == "b": 13 | st.session_state.radio_option = "c" 14 | else: 15 | st.session_state.radio_option = "a" 16 | 17 | col1, buff, col2 = st.columns([1, 0.5, 3]) 18 | 19 | 20 | 21 | with col1: 22 | option_names = ["a", "b", "c"] 23 | option = st.radio("請選擇1個",option_names,key="radio_option") 24 | #st.write("加入radio後的session_state",st.session_state) 25 | 26 | with col2: 27 | if option == 'a': 28 | st.write("您選擇的是'a' :smile:") 29 | elif option == 'b': 30 | st.write("您選擇的是'b' :heart:") 31 | elif option == 'c': 32 | st.write("您選擇的是'c' :rocket:") 33 | 34 | -------------------------------------------------------------------------------- /lesson16/lesson16_2.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | 3 | st.title("Session 和 Callback") 4 | 5 | col1, buff, col2 = st.columns([2,1,2]) 6 | def lbs_to_kg(): 7 | st.session_state.kg = st.session_state.lbs / 2.2046 8 | 9 | def kg_to_lbs(): 10 | st.session_state.lbs = st.session_state.kg * 2.2046 11 | 12 | with col1: 13 | st.number_input("磅:",key='lbs',on_change=lbs_to_kg) 14 | 15 | with col2: 16 | st.number_input("公斤",key="kg",on_change=kg_to_lbs) -------------------------------------------------------------------------------- /lesson16/requirements.txt: -------------------------------------------------------------------------------- 1 | streamlit -------------------------------------------------------------------------------- /lesson18/lesson18_1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import requests\n", 10 | "from requests import Response\n", 11 | "\n", 12 | "url:str = 'https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json'\n", 13 | "r:Response = requests.get(url)\n", 14 | "if r.status_code == 200:\n", 15 | " print(\"下載成功\")\n" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": null, 21 | "metadata": {}, 22 | "outputs": [], 23 | "source": [ 24 | "youbikeData:list[dict] = r.json()\n", 25 | "for item in youbikeData:\n", 26 | " print(item)\n" 27 | ] 28 | } 29 | ], 30 | "metadata": { 31 | "kernelspec": { 32 | "display_name": "Python 3", 33 | "language": "python", 34 | "name": "python3" 35 | }, 36 | "language_info": { 37 | "codemirror_mode": { 38 | "name": "ipython", 39 | "version": 3 40 | }, 41 | "file_extension": ".py", 42 | "mimetype": "text/x-python", 43 | "name": "python", 44 | "nbconvert_exporter": "python", 45 | "pygments_lexer": "ipython3", 46 | "version": "3.10.13" 47 | } 48 | }, 49 | "nbformat": 4, 50 | "nbformat_minor": 2 51 | } 52 | -------------------------------------------------------------------------------- /lesson18/lesson18_2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "資料表建立完成\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "#建立資料表\n", 18 | "import psycopg2\n", 19 | "import os\n", 20 | "from dotenv import load_dotenv\n", 21 | "load_dotenv()\n", 22 | "\n", 23 | "with psycopg2.connect(os.environ['POSTGRE_PASSWORD1']) as conn:\n", 24 | " with conn.cursor() as cursor:\n", 25 | " #建立資料表\n", 26 | " sql = '''\n", 27 | " CREATE TABLE IF NOT EXISTS 站點資訊(\n", 28 | " 站點編號 VARCHAR(10),\n", 29 | " 站點名稱 VARCHAR(30) NOT NULL,\n", 30 | " 行政區 VARCHAR(10) NOT NULL,\n", 31 | " 站點地址 VARCHAR(50),\n", 32 | " lat NUMERIC(15,11),\n", 33 | " lng NUMERIC(15,11),\n", 34 | " PRIMARY KEY(站點編號)\n", 35 | " );\n", 36 | "\n", 37 | " CREATE TABLE IF NOT EXISTS youbike(\n", 38 | " 日期 TIMESTAMP,\n", 39 | " 編號 VARCHAR(10),\n", 40 | " 總車輛 INTEGER,\n", 41 | " 可借 INTEGER,\n", 42 | " 可還 INTEGER,\n", 43 | " 活動 BOOLEAN,\n", 44 | " PRIMARY KEY(日期,編號),\n", 45 | " FOREIGN KEY(編號) REFERENCES 站點資訊(站點編號)\n", 46 | " ON DELETE CASCADE\n", 47 | " ON UPDATE CASCADE\t\n", 48 | " );\n", 49 | " '''\n", 50 | " cursor.execute(sql)\n", 51 | "\n", 52 | "print('資料表建立完成')" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 2, 58 | "metadata": {}, 59 | "outputs": [ 60 | { 61 | "name": "stdout", 62 | "output_type": "stream", 63 | "text": [ 64 | "資料表插入一筆完成\n" 65 | ] 66 | } 67 | ], 68 | "source": [ 69 | "#插入一筆資料\n", 70 | "with psycopg2.connect(os.environ['POSTGRE_PASSWORD1']) as conn:\n", 71 | " with conn.cursor() as cursor:\n", 72 | " #建立資料表\n", 73 | " sql = '''\n", 74 | " INSERT INTO 站點資訊\n", 75 | " VALUES (%s,%s,%s,%s,%s,%s)\n", 76 | " ON CONFLICT DO NOTHING;\n", 77 | " '''\n", 78 | " cursor.execute(sql,('500101001','YouBike2.0_捷運科技大樓站','大安區','復興南路二段235號前',25.02605,121.5436))\n", 79 | "\n", 80 | " sql ='''\n", 81 | " INSERT INTO youbike\n", 82 | " VALUES (%s,%s,%s,%s,%s,%s)\n", 83 | " ON CONFLICT DO NOTHING; \n", 84 | " '''\n", 85 | " cursor.execute(sql,('2024-02-16 10:48:19','500101001',28,1,27,True))\n", 86 | "print('資料表插入一筆完成')" 87 | ] 88 | } 89 | ], 90 | "metadata": { 91 | "kernelspec": { 92 | "display_name": "Python 3", 93 | "language": "python", 94 | "name": "python3" 95 | }, 96 | "language_info": { 97 | "codemirror_mode": { 98 | "name": "ipython", 99 | "version": 3 100 | }, 101 | "file_extension": ".py", 102 | "mimetype": "text/x-python", 103 | "name": "python", 104 | "nbconvert_exporter": "python", 105 | "pygments_lexer": "ipython3", 106 | "version": "3.10.13" 107 | } 108 | }, 109 | "nbformat": 4, 110 | "nbformat_minor": 2 111 | } 112 | -------------------------------------------------------------------------------- /lesson18/lesson18_4.py: -------------------------------------------------------------------------------- 1 | import psycopg2 2 | import os 3 | import streamlit as st 4 | from dotenv import load_dotenv 5 | load_dotenv() 6 | 7 | @st.cache_resource 8 | def get_sarea()->tuple: 9 | conn = psycopg2.connect(os.environ['POSTGRE_PASSWORD1']) 10 | with conn: 11 | with conn.cursor() as cursor: 12 | #取出最新日期各站點資料 13 | sql = ''' 14 | SELECT 行政區 15 | FROM 站點資訊 16 | GROUP BY 行政區 17 | ''' 18 | cursor.execute(sql) 19 | allArea:tuple = cursor.fetchall() 20 | return allArea 21 | 22 | conn.close() 23 | 24 | @st.cache_resource 25 | def info_sarea(name:str): 26 | conn = psycopg2.connect(os.environ['POSTGRE_PASSWORD1']) 27 | with conn: 28 | with conn.cursor() as cursor: 29 | #取出各區最新資料 30 | sql = ''' 31 | SELECT 日期,站點資訊.站點名稱,行政區,站點地址,lat,lng,總車輛,可借,可還,活動 32 | FROM youbike 33 | JOIN 站點資訊 ON youbike.編號 = 站點資訊.站點編號 34 | WHERE (日期,編號) IN ( 35 | SELECT MAX(日期),編號 36 | FROM youbike 37 | GROUP BY 編號 38 | ) AND 行政區 = %s; 39 | ''' 40 | cursor.execute(sql,(name,)) 41 | return cursor.fetchall() 42 | conn.close() 43 | 44 | col1, col2 = st.columns([1, 2]) 45 | data = [tuple1[0] for tuple1 in get_sarea()] 46 | #print(data) 47 | 48 | st.radio('選擇行政區:',data,key='sarea',horizontal=True) 49 | 50 | area = st.session_state.sarea 51 | data = info_sarea(name=area) 52 | 53 | 54 | data1 = [{'日期':item[0],'站點':item[1],'總車輛':item[6],'可借':item[7],'可還':item[8],'活動':item[9]} for item in data] 55 | #print(data1) 56 | st.dataframe(data1) 57 | -------------------------------------------------------------------------------- /lesson18/requirements.txt: -------------------------------------------------------------------------------- 1 | psycopg2-binary 2 | python-dotenv 3 | streamlit 4 | requests -------------------------------------------------------------------------------- /lesson1_0.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "Hello! Python!\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "print('Hello! World!')" 18 | ] 19 | } 20 | ], 21 | "metadata": { 22 | "kernelspec": { 23 | "display_name": "Python 3", 24 | "language": "python", 25 | "name": "python3" 26 | }, 27 | "language_info": { 28 | "codemirror_mode": { 29 | "name": "ipython", 30 | "version": 3 31 | }, 32 | "file_extension": ".py", 33 | "mimetype": "text/x-python", 34 | "name": "python", 35 | "nbconvert_exporter": "python", 36 | "pygments_lexer": "ipython3", 37 | "version": "3.10.13" 38 | } 39 | }, 40 | "nbformat": 4, 41 | "nbformat_minor": 2 42 | } 43 | -------------------------------------------------------------------------------- /lesson1_0.py: -------------------------------------------------------------------------------- 1 | print('Hello! Pytnon!') -------------------------------------------------------------------------------- /lesson1_1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "Hello! python again!\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "print(\"Hello! python again!\")" 18 | ] 19 | } 20 | ], 21 | "metadata": { 22 | "kernelspec": { 23 | "display_name": "Python 3", 24 | "language": "python", 25 | "name": "python3" 26 | }, 27 | "language_info": { 28 | "codemirror_mode": { 29 | "name": "ipython", 30 | "version": 3 31 | }, 32 | "file_extension": ".py", 33 | "mimetype": "text/x-python", 34 | "name": "python", 35 | "nbconvert_exporter": "python", 36 | "pygments_lexer": "ipython3", 37 | "version": "3.10.13" 38 | } 39 | }, 40 | "nbformat": 4, 41 | "nbformat_minor": 2 42 | } 43 | -------------------------------------------------------------------------------- /lesson1_2.ipynb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roberthsu2003/__112_gov_Python_sql__/cb9104c1452051ec66c8a5b678d804d521f225bb/lesson1_2.ipynb -------------------------------------------------------------------------------- /lesson8_1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "Hello! Python!\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "print(\"Hello! Python!\")" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 8, 23 | "metadata": {}, 24 | "outputs": [], 25 | "source": [ 26 | "n = 10 #int\n", 27 | "m = 5.0 #float\n", 28 | "name = '徐國堂' #str\n", 29 | "is_google = True #bool" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 9, 35 | "metadata": {}, 36 | "outputs": [ 37 | { 38 | "name": "stdout", 39 | "output_type": "stream", 40 | "text": [ 41 | "10\n", 42 | "5.0\n", 43 | "徐國堂\n", 44 | "True\n" 45 | ] 46 | } 47 | ], 48 | "source": [ 49 | "print(n)\n", 50 | "print(m)\n", 51 | "print(name)\n", 52 | "print(is_google)" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 13, 58 | "metadata": {}, 59 | "outputs": [ 60 | { 61 | "name": "stdout", 62 | "output_type": "stream", 63 | "text": [ 64 | "\n" 65 | ] 66 | }, 67 | { 68 | "data": { 69 | "text/plain": [ 70 | "('a', 'b', 'c')" 71 | ] 72 | }, 73 | "execution_count": 13, 74 | "metadata": {}, 75 | "output_type": "execute_result" 76 | } 77 | ], 78 | "source": [ 79 | "#tuple\n", 80 | "t1 = (1, 2, 3, 4, 5)\n", 81 | "print(type(t1))\n", 82 | "\n", 83 | "t2 = ('a', 'b', 'c')\n", 84 | "t2" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 16, 90 | "metadata": {}, 91 | "outputs": [], 92 | "source": [ 93 | "#tuple,暫時的資料\n", 94 | "#tuple的內容不可以修改\n", 95 | "#tuple最常使用在拆解法(拆解tuple,給變數)\n", 96 | "\n", 97 | "name,chinese,math,english = '徐國堂',78,92,65" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 17, 103 | "metadata": {}, 104 | "outputs": [ 105 | { 106 | "name": "stdout", 107 | "output_type": "stream", 108 | "text": [ 109 | "徐國堂\n", 110 | "78\n", 111 | "92\n", 112 | "65\n" 113 | ] 114 | } 115 | ], 116 | "source": [ 117 | "print(name)\n", 118 | "print(chinese)\n", 119 | "print(math)\n", 120 | "print(english)" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 18, 126 | "metadata": {}, 127 | "outputs": [ 128 | { 129 | "data": { 130 | "text/plain": [ 131 | "[1, 2, 3, 4]" 132 | ] 133 | }, 134 | "execution_count": 18, 135 | "metadata": {}, 136 | "output_type": "execute_result" 137 | } 138 | ], 139 | "source": [ 140 | "mylist = [1, 2, 3, 4]\n", 141 | "mylist" 142 | ] 143 | }, 144 | { 145 | "cell_type": "code", 146 | "execution_count": 19, 147 | "metadata": {}, 148 | "outputs": [ 149 | { 150 | "name": "stdout", 151 | "output_type": "stream", 152 | "text": [ 153 | "\n" 154 | ] 155 | } 156 | ], 157 | "source": [ 158 | "print(type(mylist))" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": 20, 164 | "metadata": {}, 165 | "outputs": [ 166 | { 167 | "data": { 168 | "text/plain": [ 169 | "['徐國堂', 78, 92, 65]" 170 | ] 171 | }, 172 | "execution_count": 20, 173 | "metadata": {}, 174 | "output_type": "execute_result" 175 | } 176 | ], 177 | "source": [ 178 | "student1 = ['徐國堂',78,92,65]\n", 179 | "student1" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 22, 185 | "metadata": {}, 186 | "outputs": [ 187 | { 188 | "name": "stdout", 189 | "output_type": "stream", 190 | "text": [ 191 | "徐國堂\n", 192 | "78\n", 193 | "92\n", 194 | "65\n" 195 | ] 196 | } 197 | ], 198 | "source": [ 199 | "#subscript\n", 200 | "print(student1[0])\n", 201 | "print(student1[1])\n", 202 | "print(student1[2])\n", 203 | "print(student1[3])" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": 24, 209 | "metadata": {}, 210 | "outputs": [ 211 | { 212 | "name": "stdout", 213 | "output_type": "stream", 214 | "text": [ 215 | "徐國堂\n", 216 | "78\n", 217 | "92\n", 218 | "65\n" 219 | ] 220 | } 221 | ], 222 | "source": [ 223 | "#list iterable\n", 224 | "for element in student1:\n", 225 | " print(element)" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 25, 231 | "metadata": {}, 232 | "outputs": [ 233 | { 234 | "name": "stdout", 235 | "output_type": "stream", 236 | "text": [ 237 | "H\n", 238 | "e\n", 239 | "l\n", 240 | "l\n", 241 | "o\n", 242 | "!\n", 243 | " \n", 244 | "P\n", 245 | "y\n", 246 | "t\n", 247 | "h\n", 248 | "o\n", 249 | "n\n", 250 | "!\n" 251 | ] 252 | } 253 | ], 254 | "source": [ 255 | "greeting = 'Hello! Python!'\n", 256 | "for ele in greeting:\n", 257 | " print(ele)" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": 29, 263 | "metadata": {}, 264 | "outputs": [ 265 | { 266 | "data": { 267 | "text/plain": [ 268 | "'徐國堂'" 269 | ] 270 | }, 271 | "execution_count": 29, 272 | "metadata": {}, 273 | "output_type": "execute_result" 274 | } 275 | ], 276 | "source": [ 277 | "#dictionary\n", 278 | "stu1 = {'name':'徐國堂',\n", 279 | " 'chinese':78,\n", 280 | " 'english':92,\n", 281 | " 'math':65}\n", 282 | "\n", 283 | "stu1\n", 284 | "\n", 285 | "stu1['name']" 286 | ] 287 | }, 288 | { 289 | "cell_type": "code", 290 | "execution_count": 27, 291 | "metadata": {}, 292 | "outputs": [ 293 | { 294 | "name": "stdout", 295 | "output_type": "stream", 296 | "text": [ 297 | "\n" 298 | ] 299 | } 300 | ], 301 | "source": [ 302 | "print(type(stu1))" 303 | ] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "execution_count": 30, 308 | "metadata": {}, 309 | "outputs": [ 310 | { 311 | "name": "stdout", 312 | "output_type": "stream", 313 | "text": [ 314 | "徐國堂\n", 315 | "78\n", 316 | "92\n", 317 | "65\n" 318 | ] 319 | } 320 | ], 321 | "source": [ 322 | "for key in stu1:\n", 323 | " print(stu1[key])" 324 | ] 325 | } 326 | ], 327 | "metadata": { 328 | "kernelspec": { 329 | "display_name": "Python 3", 330 | "language": "python", 331 | "name": "python3" 332 | }, 333 | "language_info": { 334 | "codemirror_mode": { 335 | "name": "ipython", 336 | "version": 3 337 | }, 338 | "file_extension": ".py", 339 | "mimetype": "text/x-python", 340 | "name": "python", 341 | "nbconvert_exporter": "python", 342 | "pygments_lexer": "ipython3", 343 | "version": "3.10.13" 344 | } 345 | }, 346 | "nbformat": 4, 347 | "nbformat_minor": 2 348 | } 349 | -------------------------------------------------------------------------------- /lesson8_2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "students = [{'name':'徐國堂', 'chinese':78, 'english':92, 'math':65},\n", 10 | " {'name':'張國堂', 'chinese':98, 'english':65, 'math':89},\n", 11 | " {'name':'陳國堂', 'chinese':68, 'english':65, 'math':92}]" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 4, 17 | "metadata": {}, 18 | "outputs": [ 19 | { 20 | "name": "stdout", 21 | "output_type": "stream", 22 | "text": [ 23 | "徐國堂\n", 24 | "78\n", 25 | "92\n", 26 | "65\n", 27 | "==========\n", 28 | "張國堂\n", 29 | "98\n", 30 | "65\n", 31 | "89\n", 32 | "==========\n", 33 | "陳國堂\n", 34 | "68\n", 35 | "65\n", 36 | "92\n", 37 | "==========\n" 38 | ] 39 | } 40 | ], 41 | "source": [ 42 | "for student in students:\n", 43 | " for key in student:\n", 44 | " print(student[key])\n", 45 | " print(\"==========\")" 46 | ] 47 | } 48 | ], 49 | "metadata": { 50 | "kernelspec": { 51 | "display_name": "Python 3", 52 | "language": "python", 53 | "name": "python3" 54 | }, 55 | "language_info": { 56 | "codemirror_mode": { 57 | "name": "ipython", 58 | "version": 3 59 | }, 60 | "file_extension": ".py", 61 | "mimetype": "text/x-python", 62 | "name": "python", 63 | "nbconvert_exporter": "python", 64 | "pygments_lexer": "ipython3", 65 | "version": "3.10.13" 66 | } 67 | }, 68 | "nbformat": 4, 69 | "nbformat_minor": 2 70 | } 71 | -------------------------------------------------------------------------------- /lesson9_1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 8, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "徐國堂\n", 13 | "78\n", 14 | "92\n", 15 | "91\n" 16 | ] 17 | } 18 | ], 19 | "source": [ 20 | "#使用dictionary建立一筆資料\n", 21 | "#建立dict的實體\n", 22 | "student:dict[str,any] = {\n", 23 | " 'name':'徐國堂',\n", 24 | " '國文':78,\n", 25 | " '英文':92,\n", 26 | " '數學':91\n", 27 | "}\n", 28 | "print(student['name'])\n", 29 | "print(student['國文'])\n", 30 | "print(student['英文'])\n", 31 | "print(student['數學'])\n" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 5, 37 | "metadata": {}, 38 | "outputs": [ 39 | { 40 | "name": "stdout", 41 | "output_type": "stream", 42 | "text": [ 43 | "10\n", 44 | "20\n", 45 | "30\n" 46 | ] 47 | } 48 | ], 49 | "source": [ 50 | "#建立list實體\n", 51 | "\n", 52 | "values:list[int] = [10, 20, 30]\n", 53 | "print(values[0])\n", 54 | "print(values[1])\n", 55 | "print(values[2])" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 16, 61 | "metadata": {}, 62 | "outputs": [ 63 | { 64 | "name": "stdout", 65 | "output_type": "stream", 66 | "text": [ 67 | "10\n", 68 | "20\n", 69 | "30\n" 70 | ] 71 | } 72 | ], 73 | "source": [ 74 | "values:list[int] = [10, 20, 30]\n", 75 | "for value in values:\n", 76 | " print(value)" 77 | ] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": 17, 82 | "metadata": {}, 83 | "outputs": [ 84 | { 85 | "name": "stdout", 86 | "output_type": "stream", 87 | "text": [ 88 | "\n", 89 | "key=name\n", 90 | "value=徐國堂\n", 91 | "=========\n", 92 | "\n", 93 | "key=國文\n", 94 | "value=78\n", 95 | "=========\n", 96 | "\n", 97 | "key=英文\n", 98 | "value=92\n", 99 | "=========\n", 100 | "\n", 101 | "key=數學\n", 102 | "value=91\n", 103 | "=========\n" 104 | ] 105 | } 106 | ], 107 | "source": [ 108 | "student:dict[str,any] = {\n", 109 | " 'name':'徐國堂',\n", 110 | " '國文':78,\n", 111 | " '英文':92,\n", 112 | " '數學':91\n", 113 | "}\n", 114 | "\n", 115 | "for key in student:\n", 116 | " print(type(key))\n", 117 | " print(f'key={key}')\n", 118 | " print(f'value={student[key]}')\n", 119 | " print(\"=========\")" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 19, 125 | "metadata": {}, 126 | "outputs": [ 127 | { 128 | "name": "stdout", 129 | "output_type": "stream", 130 | "text": [ 131 | "404\n", 132 | "沒有網頁發現\n" 133 | ] 134 | } 135 | ], 136 | "source": [ 137 | "#tupe的拆解法\n", 138 | "code, error = 404,'沒有網頁發現'\n", 139 | "print(code)\n", 140 | "print(error)" 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": 22, 146 | "metadata": {}, 147 | "outputs": [ 148 | { 149 | "name": "stdout", 150 | "output_type": "stream", 151 | "text": [ 152 | "索引編號:0\n", 153 | "值是:10\n", 154 | "===========\n", 155 | "索引編號:1\n", 156 | "值是:20\n", 157 | "===========\n", 158 | "索引編號:2\n", 159 | "值是:30\n", 160 | "===========\n" 161 | ] 162 | } 163 | ], 164 | "source": [ 165 | "values:list[int] = [10, 20, 30]\n", 166 | "for idx,value in enumerate(values):\n", 167 | " print(f'索引編號:{idx}')\n", 168 | " print(f'值是:{value}')\n", 169 | " print(\"===========\")" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 23, 175 | "metadata": {}, 176 | "outputs": [ 177 | { 178 | "data": { 179 | "text/plain": [ 180 | "{'name': '徐國堂', '國文': 78, '英文': 92, '數學': 91}" 181 | ] 182 | }, 183 | "execution_count": 23, 184 | "metadata": {}, 185 | "output_type": "execute_result" 186 | } 187 | ], 188 | "source": [ 189 | "student:dict[str,any] = {\n", 190 | " 'name':'徐國堂',\n", 191 | " '國文':78,\n", 192 | " '英文':92,\n", 193 | " '數學':91\n", 194 | "}\n", 195 | "student" 196 | ] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": 25, 201 | "metadata": {}, 202 | "outputs": [ 203 | { 204 | "name": "stdout", 205 | "output_type": "stream", 206 | "text": [ 207 | "name\n", 208 | "國文\n", 209 | "英文\n", 210 | "數學\n" 211 | ] 212 | } 213 | ], 214 | "source": [ 215 | "for key in student.keys():\n", 216 | " print(key)" 217 | ] 218 | }, 219 | { 220 | "cell_type": "code", 221 | "execution_count": 27, 222 | "metadata": {}, 223 | "outputs": [ 224 | { 225 | "name": "stdout", 226 | "output_type": "stream", 227 | "text": [ 228 | "徐國堂\n", 229 | "78\n", 230 | "92\n", 231 | "91\n" 232 | ] 233 | } 234 | ], 235 | "source": [ 236 | "for value in student.values():\n", 237 | " print(value)" 238 | ] 239 | }, 240 | { 241 | "cell_type": "code", 242 | "execution_count": 29, 243 | "metadata": {}, 244 | "outputs": [ 245 | { 246 | "name": "stdout", 247 | "output_type": "stream", 248 | "text": [ 249 | "name\n", 250 | "徐國堂\n", 251 | "==========\n", 252 | "國文\n", 253 | "78\n", 254 | "==========\n", 255 | "英文\n", 256 | "92\n", 257 | "==========\n", 258 | "數學\n", 259 | "91\n", 260 | "==========\n" 261 | ] 262 | } 263 | ], 264 | "source": [ 265 | "for key,value in student.items():\n", 266 | " print(key)\n", 267 | " print(value)\n", 268 | " print(\"==========\")\n" 269 | ] 270 | }, 271 | { 272 | "cell_type": "code", 273 | "execution_count": 31, 274 | "metadata": {}, 275 | "outputs": [], 276 | "source": [ 277 | "students:list[dict] = [\n", 278 | " {'name':'徐國堂','國文':78,'英文':92,'數學':91},\n", 279 | " {'name':'王國堂','國文':78,'英文':92,'數學':91},\n", 280 | " {'name':'張國堂','國文':78,'英文':92,'數學':91}\n", 281 | "]" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": 34, 287 | "metadata": {}, 288 | "outputs": [ 289 | { 290 | "name": "stdout", 291 | "output_type": "stream", 292 | "text": [ 293 | "key=name,value=徐國堂\n", 294 | "key=國文,value=78\n", 295 | "key=英文,value=92\n", 296 | "key=數學,value=91\n", 297 | "==============\n", 298 | "key=name,value=王國堂\n", 299 | "key=國文,value=78\n", 300 | "key=英文,value=92\n", 301 | "key=數學,value=91\n", 302 | "==============\n", 303 | "key=name,value=張國堂\n", 304 | "key=國文,value=78\n", 305 | "key=英文,value=92\n", 306 | "key=數學,value=91\n", 307 | "==============\n" 308 | ] 309 | } 310 | ], 311 | "source": [ 312 | "for student in students:\n", 313 | " for key,value in student.items():\n", 314 | " print(f'key={key},value={value}')\n", 315 | " \n", 316 | " print(\"==============\")" 317 | ] 318 | } 319 | ], 320 | "metadata": { 321 | "kernelspec": { 322 | "display_name": "Python 3", 323 | "language": "python", 324 | "name": "python3" 325 | }, 326 | "language_info": { 327 | "codemirror_mode": { 328 | "name": "ipython", 329 | "version": 3 330 | }, 331 | "file_extension": ".py", 332 | "mimetype": "text/x-python", 333 | "name": "python", 334 | "nbconvert_exporter": "python", 335 | "pygments_lexer": "ipython3", 336 | "version": "3.10.13" 337 | } 338 | }, 339 | "nbformat": 4, 340 | "nbformat_minor": 2 341 | } 342 | -------------------------------------------------------------------------------- /lesson9_2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "#自訂function,參數\n", 10 | "def say_hello():\n", 11 | " print(\"Hello\")" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 3, 17 | "metadata": {}, 18 | "outputs": [ 19 | { 20 | "name": "stdout", 21 | "output_type": "stream", 22 | "text": [ 23 | "Hello\n" 24 | ] 25 | } 26 | ], 27 | "source": [ 28 | "#呼叫function,引數值\n", 29 | "say_hello()" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 5, 35 | "metadata": {}, 36 | "outputs": [], 37 | "source": [ 38 | "def say_hello(name):\n", 39 | " print(f'Hello!{name}')" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 6, 45 | "metadata": {}, 46 | "outputs": [ 47 | { 48 | "name": "stdout", 49 | "output_type": "stream", 50 | "text": [ 51 | "Hello!徐國堂\n" 52 | ] 53 | } 54 | ], 55 | "source": [ 56 | "#引數值的呼叫\n", 57 | "say_hello(\"徐國堂\")" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 8, 63 | "metadata": {}, 64 | "outputs": [ 65 | { 66 | "name": "stdout", 67 | "output_type": "stream", 68 | "text": [ 69 | "Hello!徐國堂\n" 70 | ] 71 | } 72 | ], 73 | "source": [ 74 | "#引數名稱的呼叫\n", 75 | "say_hello(name=\"徐國堂\")" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 10, 81 | "metadata": {}, 82 | "outputs": [], 83 | "source": [ 84 | "def menu(wine, entree, dessert):\n", 85 | " print(f'前酒:{wine}')\n", 86 | " print(f'主餐:{entree}')\n", 87 | " print(f'甜點:{dessert}')" 88 | ] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "execution_count": 11, 93 | "metadata": {}, 94 | "outputs": [ 95 | { 96 | "name": "stdout", 97 | "output_type": "stream", 98 | "text": [ 99 | "前酒:白酒\n", 100 | "主餐:牛排\n", 101 | "甜點:蛋糕\n" 102 | ] 103 | } 104 | ], 105 | "source": [ 106 | "#引數值呼叫,必需依照參數的順序\n", 107 | "menu('白酒','牛排','蛋糕')" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 12, 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "name": "stdout", 117 | "output_type": "stream", 118 | "text": [ 119 | "前酒:白酒\n", 120 | "主餐:牛排\n", 121 | "甜點:蛋糕\n" 122 | ] 123 | } 124 | ], 125 | "source": [ 126 | "#引數名稱的呼叫,不需要依順序\n", 127 | "menu(entree=\"牛排\",dessert='蛋糕',wine='白酒')" 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": 13, 133 | "metadata": {}, 134 | "outputs": [ 135 | { 136 | "name": "stdout", 137 | "output_type": "stream", 138 | "text": [ 139 | "前酒:白酒\n", 140 | "主餐:牛排\n", 141 | "甜點:蛋糕\n" 142 | ] 143 | } 144 | ], 145 | "source": [ 146 | "#混合呼叫\n", 147 | "#前面使用引數值\n", 148 | "#後引數名稱呼叫\n", 149 | "menu('白酒',dessert='蛋糕',entree='牛排')" 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": 18, 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [ 158 | "#參數可以有type hint\n", 159 | "\n", 160 | "def menu(wine:str, entree:str, dessert:str):\n", 161 | " print(f'前酒:{wine}')\n", 162 | " print(f'主餐:{entree}')\n", 163 | " print(f'甜點:{dessert}')" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 17, 169 | "metadata": {}, 170 | "outputs": [ 171 | { 172 | "name": "stdout", 173 | "output_type": "stream", 174 | "text": [ 175 | "前酒:白酒\n", 176 | "主餐:牛排\n", 177 | "甜點:蛋糕\n" 178 | ] 179 | } 180 | ], 181 | "source": [ 182 | "menu('白酒',dessert='蛋糕',entree='牛排')" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": 22, 188 | "metadata": {}, 189 | "outputs": [], 190 | "source": [ 191 | "#function傳出的值\n", 192 | "def menu(wine:str, entree:str, dessert:str)->dict[str,str]: \n", 193 | " return {'前酒':wine,'主餐':entree,'甜點':dessert}" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 21, 199 | "metadata": {}, 200 | "outputs": [ 201 | { 202 | "data": { 203 | "text/plain": [ 204 | "{'前酒': '白酒', '主餐': '牛排', '甜點': '蛋糕'}" 205 | ] 206 | }, 207 | "execution_count": 21, 208 | "metadata": {}, 209 | "output_type": "execute_result" 210 | } 211 | ], 212 | "source": [ 213 | "my_menu = menu('白酒',dessert='蛋糕',entree='牛排')\n", 214 | "my_menu" 215 | ] 216 | }, 217 | { 218 | "cell_type": "code", 219 | "execution_count": 25, 220 | "metadata": {}, 221 | "outputs": [], 222 | "source": [ 223 | "#參數的default value\n", 224 | "def menu(wine:str, entree:str, dessert:str='蛋糕')->dict[str,str]: \n", 225 | " return {'前酒':wine,'主餐':entree,'甜點':dessert}" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 27, 231 | "metadata": {}, 232 | "outputs": [ 233 | { 234 | "name": "stdout", 235 | "output_type": "stream", 236 | "text": [ 237 | "{'前酒': '白酒', '主餐': '牛排', '甜點': '蛋糕'}\n", 238 | "{'前酒': '白酒', '主餐': '牛排', '甜點': '水果'}\n" 239 | ] 240 | } 241 | ], 242 | "source": [ 243 | "print(menu('白酒','牛排'))\n", 244 | "print(menu('白酒','牛排',dessert='水果'))" 245 | ] 246 | }, 247 | { 248 | "cell_type": "code", 249 | "execution_count": 28, 250 | "metadata": {}, 251 | "outputs": [], 252 | "source": [ 253 | "def menu(wine:str, entree:str='牛排', dessert:str='蛋糕')->dict[str,str]: \n", 254 | " return {'前酒':wine,'主餐':entree,'甜點':dessert}" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "execution_count": 31, 260 | "metadata": {}, 261 | "outputs": [ 262 | { 263 | "name": "stdout", 264 | "output_type": "stream", 265 | "text": [ 266 | "{'前酒': '白酒', '主餐': '牛排', '甜點': '蛋糕'}\n", 267 | "{'前酒': '白酒', '主餐': '牛排', '甜點': '水果'}\n", 268 | "{'前酒': '白酒', '主餐': '雞排', '甜點': '水果'}\n" 269 | ] 270 | } 271 | ], 272 | "source": [ 273 | "print(menu('白酒'))\n", 274 | "print(menu('白酒',dessert='水果'))\n", 275 | "print(menu('白酒',dessert='水果',entree='雞排'))" 276 | ] 277 | }, 278 | { 279 | "cell_type": "code", 280 | "execution_count": 33, 281 | "metadata": {}, 282 | "outputs": [ 283 | { 284 | "data": { 285 | "text/plain": [ 286 | "{'前酒': '白酒', '主餐': '牛排', '甜點': '蛋糕'}" 287 | ] 288 | }, 289 | "execution_count": 33, 290 | "metadata": {}, 291 | "output_type": "execute_result" 292 | } 293 | ], 294 | "source": [ 295 | "def menu(wine:str='白酒', entree:str='牛排', dessert:str='蛋糕')->dict[str,str]: \n", 296 | " return {'前酒':wine,'主餐':entree,'甜點':dessert}\n", 297 | "\n", 298 | "menu()" 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "execution_count": 36, 304 | "metadata": {}, 305 | "outputs": [ 306 | { 307 | "name": "stdout", 308 | "output_type": "stream", 309 | "text": [ 310 | "()\n", 311 | "('白酒', '紅酒', '黑酒')\n" 312 | ] 313 | } 314 | ], 315 | "source": [ 316 | "def menu(*args):\n", 317 | " print(args)\n", 318 | "\n", 319 | "menu()\n", 320 | "menu('白酒','紅酒','黑酒')" 321 | ] 322 | }, 323 | { 324 | "cell_type": "code", 325 | "execution_count": 39, 326 | "metadata": {}, 327 | "outputs": [ 328 | { 329 | "name": "stdout", 330 | "output_type": "stream", 331 | "text": [ 332 | "{}\n", 333 | "{'酒1': '白酒', '酒2': '紅酒', '酒3': '黑酒'}\n" 334 | ] 335 | } 336 | ], 337 | "source": [ 338 | "def menu(**kwargs):\n", 339 | " print(kwargs)\n", 340 | "\n", 341 | "menu()\n", 342 | "menu(酒1='白酒',酒2='紅酒',酒3='黑酒')" 343 | ] 344 | }, 345 | { 346 | "cell_type": "code", 347 | "execution_count": 42, 348 | "metadata": {}, 349 | "outputs": [ 350 | { 351 | "name": "stdout", 352 | "output_type": "stream", 353 | "text": [ 354 | "1-2-3.0-True.\n" 355 | ] 356 | } 357 | ], 358 | "source": [ 359 | "print('1', 2, 3.0, True,sep='-',end='.\\n')" 360 | ] 361 | } 362 | ], 363 | "metadata": { 364 | "kernelspec": { 365 | "display_name": "Python 3", 366 | "language": "python", 367 | "name": "python3" 368 | }, 369 | "language_info": { 370 | "codemirror_mode": { 371 | "name": "ipython", 372 | "version": 3 373 | }, 374 | "file_extension": ".py", 375 | "mimetype": "text/x-python", 376 | "name": "python", 377 | "nbconvert_exporter": "python", 378 | "pygments_lexer": "ipython3", 379 | "version": "3.10.13" 380 | } 381 | }, 382 | "nbformat": 4, 383 | "nbformat_minor": 2 384 | } 385 | -------------------------------------------------------------------------------- /link/README.md: -------------------------------------------------------------------------------- 1 | #### [2022_02_24_早上](https://youtube.com/live/xCYgORSmgxc) 2 | #### [2022_02_24_下午](https://youtube.com/live/PigT63BK_-g) 3 | #### [2022_03_02_早上](https://youtube.com/live/LLBW-TWIErA) 4 | #### [2022_03_02_下午](https://youtube.com/live/ESAKaVEpoj0) 5 | #### [2022_03_09_早上](https://youtube.com/live/LKPe3y4udF4) 6 | #### [2022_03_09_下午](https://youtube.com/live/aC5Bfm_4chY) 7 | #### [2024_03_16_早上](https://youtube.com/live/GEDG_esRGYc) 8 | #### [2024_03_16_下午](https://youtube.com/live/NvVIV10MLOk) 9 | #### [2024_03_23_早上](https://youtube.com/live/Q3B_M-7ZyOo) 10 | #### [2024_03_23_下午](https://youtube.com/live/wOij96-gtQg) 11 | #### [2024_03_30_早上](https://youtube.com/live/e5KMncVA98M) 12 | #### [2024_03_30_下午](https://youtube.com/live/a8wl5jYuAks) 13 | #### [2024_04_13_早上](https://youtube.com/live/sNdiCzQfTsQ) 14 | #### [2024_04_13_下午](https://youtube.com/live/VdPbLGUR9_Y) 15 | #### [2024_04_20_早上](https://youtube.com/live/498TamFvDek) 16 | #### [2024_04_20_下午](https://youtube.com/live/2_Agn7ROxhk) 17 | #### [2024_04_27_早上](https://youtube.com/live/g5-4Z-cwB4I) 18 | #### [2024_04_27_下午](https://youtube.com/live/zs6baTJLFIU) 19 | 20 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | psycopg2-binary 2 | python-dotenv 3 | streamlit 4 | requests -------------------------------------------------------------------------------- /sql/lesson1.sql: -------------------------------------------------------------------------------- 1 | SELECT NOW() AS 現在時間 -------------------------------------------------------------------------------- /sql/lesson10_1.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS student; 2 | 3 | CREATE TABLE IF NOT EXISTS student( 4 | id SERIAL PRIMARY KEY, 5 | name VARCHAR(20), 6 | chinese SMALLINT, 7 | english SMALLINT, 8 | math SMALLINT 9 | ); 10 | 11 | INSERT INTO student(name, chinese, english, math) 12 | VALUES('徐國堂',60,72,85); 13 | 14 | SELECT * 15 | FROM student -------------------------------------------------------------------------------- /sql/lesson15_1.sql: -------------------------------------------------------------------------------- 1 | SELECT DISTINCT SUBSTRING(地址, 1, 3) AS county 2 | FROM stations; 3 | 4 | SELECT DISTINCT 地址 AS county 5 | FROM stations; 6 | 7 | SELECT DISTINCT 名稱 8 | FROM stations 9 | WHERE SUBSTRING(地址, 1, 3) = '基隆市'; 10 | 11 | SELECT DISTINCT 名稱,地址 12 | FROM stations -------------------------------------------------------------------------------- /sql/lesson18_1.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS 站點資訊( 2 | 站點編號 VARCHAR(10), 3 | 站點名稱 VARCHAR(30) NOT NULL, 4 | 行政區 VARCHAR(10) NOT NULL, 5 | 站點地址 VARCHAR(50), 6 | lat NUMERIC(15,11), 7 | lng NUMERIC(15,11), 8 | PRIMARY KEY(站點編號) 9 | ); 10 | 11 | CREATE TABLE IF NOT EXISTS youbike( 12 | 日期 TIMESTAMP, 13 | 編號 VARCHAR(10), 14 | 總車輛 INTEGER, 15 | 可借 INTEGER, 16 | 可還 INTEGER, 17 | 活動 BOOLEAN, 18 | PRIMARY KEY(日期,編號), 19 | FOREIGN KEY(編號) REFERENCES 站點資訊(站點編號) 20 | ON DELETE CASCADE 21 | ON UPDATE CASCADE 22 | ); 23 | 24 | DROP TABLE youbike; 25 | DROP TABLE 站點資訊; 26 | 27 | INSERT INTO 站點資訊 28 | VALUES ('500101001','YouBike2.0_捷運科技大樓站','大安區','復興南路二段235號前',25.02605,121.5436) 29 | ON CONFLICT DO NOTHING; 30 | 31 | INSERT INTO youbike 32 | VALUES ('2024-02-16 10:48:19','500101001',28,1,27,true) 33 | ON CONFLICT DO NOTHING; 34 | 35 | 36 | SELECT count(*) AS 筆數 37 | FROM youbike 38 | 39 | /*先測試這筆,才可以了解下面*/ 40 | SELECT MAX(日期),編號 41 | FROM youbike 42 | GROUP BY 編號; 43 | 44 | /*取出最新時間youbike資料*/ 45 | SELECT 日期,站點資訊.站點名稱,行政區,站點地址,lat,lng,總車輛,可借,可還,可借,活動 46 | FROM youbike 47 | JOIN 站點資訊 ON youbike.編號 = 站點資訊.站點編號 48 | WHERE (日期,編號) IN ( 49 | SELECT MAX(日期),編號 50 | FROM youbike 51 | GROUP BY 編號 52 | ) 53 | 54 | /*取出行政區*/ 55 | SELECT 行政區 56 | FROM 站點資訊 57 | GROUP BY 行政區 58 | 59 | /*取出最新時間youbike資料,依據行政區*/ 60 | SELECT 日期,站點資訊.站點名稱,行政區,站點地址,lat,lng,總車輛,可借,可還,可借,活動 61 | FROM youbike 62 | JOIN 站點資訊 ON youbike.編號 = 站點資訊.站點編號 63 | WHERE (日期,編號) IN ( 64 | SELECT MAX(日期),編號 65 | FROM youbike 66 | GROUP BY 編號 67 | ) AND 行政區 = '大安區'; 68 | 69 | -------------------------------------------------------------------------------- /sql/lesson2.sql: -------------------------------------------------------------------------------- 1 | SELECT 'Hello PostgreSQL' -------------------------------------------------------------------------------- /sql/lesson3.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roberthsu2003/__112_gov_Python_sql__/cb9104c1452051ec66c8a5b678d804d521f225bb/sql/lesson3.sql -------------------------------------------------------------------------------- /sql/lesson3_1.sql: -------------------------------------------------------------------------------- 1 | SELECT now() AS 現在UTC時間 2 | 3 | CREATE DATABASE test; 4 | 5 | DROP DATABASE test; -------------------------------------------------------------------------------- /sql/lesson3_2.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS student( 2 | student_id SERIAL PRIMARY KEY, 3 | name VARCHAR(20), 4 | major VARCHAR(20) 5 | ); 6 | 7 | DROP TABLE student; 8 | 9 | CREATE TABLE IF NOT EXISTS artists( 10 | id SERIAL PRIMARY KEY, 11 | name VARCHAR 12 | ); 13 | 14 | DROP TABLE artists; 15 | 16 | SELECT * 17 | FROM artists; -------------------------------------------------------------------------------- /sql/lesson3_3.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS city( 2 | id SERIAL, 3 | name VARCHAR(30), 4 | population INT, 5 | PRIMARY KEY(id) 6 | ); 7 | 8 | SELECT * 9 | FROM city; 10 | 11 | -------------------------------------------------------------------------------- /sql/lesson4_1.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE dvdrental -------------------------------------------------------------------------------- /sql/lesson4_2.sql: -------------------------------------------------------------------------------- 1 | /*Field constraints*/ 2 | /* 3 | PRIMARY KEY 4 | NOT NULL (不可以是空的) 5 | UNIQUE (不可以重覆) 6 | DEFAULT (新增值時,可以不設) 7 | */ 8 | 9 | DROP TABLE student; 10 | 11 | CREATE TABLE student( 12 | student_id SERIAL PRIMARY KEY, 13 | name VARCHAR(20) NOT NULL, 14 | major VARCHAR(20) UNIQUE 15 | ); 16 | 17 | SELECT * 18 | FROM student 19 | 20 | INSERT INTO student VALUES (2,'小白','歷史') 21 | RETURNING *; 22 | /*指定欄位都要有*/ 23 | INSERT INTO student(name,major) VALUES ('小黑','地理') 24 | RETURNING *; 25 | 26 | /*錯誤的 NOT NULL*/ 27 | INSERT INTO student(name,major) VALUES (NULL,'地理') 28 | RETURNING *; 29 | 30 | /*新增多筆*/ 31 | INSERT INTO student(name,major) 32 | VALUES ('小白','國文'),('小藍','英文') 33 | RETURNING *; 34 | 35 | -------------------------------------------------------------------------------- /sql/lesson4_3.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE student; 2 | 3 | CREATE TABLE student( 4 | student_id SERIAL PRIMARY KEY, 5 | name VARCHAR(20), 6 | major VARCHAR(20), 7 | score INT 8 | ); 9 | 10 | INSERT INTO student VALUES(1, '小白','英語',50); 11 | INSERT INTO student VALUES(2, '小黃','生物',90); 12 | INSERT INTO student VALUES(3, '小綠','歷史',70); 13 | INSERT INTO student VALUES(4, '小藍','英語',80); 14 | INSERT INTO student VALUES(5, '小黑','化學',20); 15 | 16 | SELECT * 17 | FROM student; 18 | 19 | SELECT name 20 | FROM student; 21 | 22 | SELECT name,major 23 | FROM student; 24 | 25 | SELECT name AS 姓名,major AS 主修 26 | FROM student; 27 | 28 | SELECT * 29 | FROM student 30 | ORDER BY score ASC; 31 | 32 | SELECT * 33 | FROM student 34 | ORDER BY score DESC; 35 | 36 | SELECT * 37 | FROM student 38 | ORDER BY score DESC 39 | LIMIT 3; 40 | 41 | SELECT * 42 | FROM student 43 | ORDER BY score 44 | LIMIT 2; 45 | 46 | 47 | SELECT * 48 | FROM student 49 | WHERE major = '英語' 50 | ORDER BY score DESC 51 | LIMIT 1 52 | 53 | SELECT * 54 | FROM student 55 | WHERE major='英語' AND score < 60 56 | 57 | SELECT * 58 | FROM student 59 | WHERE major = '英語' OR score > 60 60 | 61 | SELECT * 62 | FROM student 63 | WHERE major = '英語' OR major='生物' OR major='歷史' 64 | 65 | 66 | SELECT * 67 | FROM student 68 | WHERE major IN ('英語','生物','歷史'); 69 | 70 | SELECT * 71 | FROM student 72 | WHERE score >= 80 AND score <= 100; 73 | 74 | SELECT * 75 | FROM student 76 | WHERE score BETWEEN 80 AND 100; 77 | 78 | SELECT * 79 | FROM student 80 | WHERE NOT name='小黃' 81 | 82 | /*第1個字為小的*/ 83 | SELECT * 84 | FROM student 85 | WHERE name LIKE '小%' 86 | 87 | SELECT * 88 | FROM student 89 | WHERE name LIKE '%黃%' 90 | -------------------------------------------------------------------------------- /sql/lesson4_4.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE student; 2 | CREATE TABLE student( 3 | student_id SERIAL, 4 | name VARCHAR(20), 5 | major VARCHAR(20), 6 | score INT, 7 | PRIMARY KEY(student_id) 8 | ); 9 | INSERT INTO student VALUES(1, '小白','英語',50); 10 | INSERT INTO student VALUES(2, '小黃','生物',90); 11 | INSERT INTO student VALUES(3, '小綠','歷史',70); 12 | INSERT INTO student VALUES(4, '小藍','英語',80); 13 | INSERT INTO student VALUES(5, '小黑','化學',20); 14 | 15 | SELECT * FROM student; 16 | 17 | UPDATE student 18 | SET major='生物' 19 | WHERE student_id = 3 20 | 21 | DELETE FROM student 22 | WHERE name='小白' AND major='英語' 23 | 24 | DELETE FROM student -------------------------------------------------------------------------------- /sql/lesson5_1.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS 聯絡人; 2 | DROP TABLE IF EXISTS 客戶; 3 | 4 | CREATE TABLE IF NOT EXISTS 客戶( 5 | 客戶_id SERIAL, 6 | 客戶名稱 VARCHAR(255) NOT NULL, 7 | PRIMARY KEY(客戶_id) 8 | ); 9 | 10 | CREATE TABLE IF NOT EXISTS 聯絡人( 11 | 聯絡人id SERIAL, 12 | 客戶id INT, 13 | 聯絡人姓名 VARCHAR(255) NOT NULL, 14 | 電話 VARCHAR(15), 15 | 郵件 VARCHAR(100), 16 | PRIMARY KEY(聯絡人id), 17 | FOREIGN KEY(客戶id) REFERENCES 客戶(客戶_id) 18 | ); 19 | 20 | INSERT INTO 客戶(客戶名稱) 21 | VALUES('遠傳電信'), 22 | ('台灣大車隊'); 23 | 24 | INSERT INTO 聯絡人(客戶id,聯絡人姓名,電話,郵件) 25 | VALUES (1,'John Doe','(408)-111-1234','john.doe@bluebird.dev'), 26 | (1,'Jane Doe','(408)-111-1235','jane.doe@bluebird.dev'), 27 | (2,'David Wright','(408)-222-1234','david.wright@dolphin.dev'); 28 | 29 | 30 | DELETE FROM 客戶 31 | WHERE 客戶_id = 1; 32 | 33 | SELECT COUNT(*) 34 | FROM 客戶; 35 | 36 | SELECT COUNT(*) 37 | FROM 聯絡人; -------------------------------------------------------------------------------- /sql/lesson5_2.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS 聯絡人; 2 | DROP TABLE IF EXISTS 客戶; 3 | 4 | CREATE TABLE IF NOT EXISTS 客戶( 5 | 客戶_id SERIAL, 6 | 客戶名稱 VARCHAR(255) NOT NULL, 7 | PRIMARY KEY(客戶_id) 8 | ); 9 | 10 | CREATE TABLE IF NOT EXISTS 聯絡人( 11 | 聯絡人id SERIAL, 12 | 客戶id INT, 13 | 聯絡人姓名 VARCHAR(255) NOT NULL, 14 | 電話 VARCHAR(15), 15 | 郵件 VARCHAR(100), 16 | PRIMARY KEY(聯絡人id), 17 | FOREIGN KEY(客戶id) REFERENCES 客戶(客戶_id) 18 | ON DELETE SET NULL 19 | 20 | ); 21 | 22 | INSERT INTO 客戶(客戶名稱) 23 | VALUES('遠傳電信'), 24 | ('台灣大車隊'); 25 | 26 | INSERT INTO 聯絡人(客戶id,聯絡人姓名,電話,郵件) 27 | VALUES (1,'John Doe','(408)-111-1234','john.doe@bluebird.dev'), 28 | (1,'Jane Doe','(408)-111-1235','jane.doe@bluebird.dev'), 29 | (2,'David Wright','(408)-222-1234','david.wright@dolphin.dev'); 30 | 31 | 32 | DELETE FROM 客戶 33 | WHERE 客戶_id = 1; 34 | 35 | SELECT * FROM 客戶; 36 | SELECT * FROM 聯絡人; -------------------------------------------------------------------------------- /sql/lesson5_3.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS 聯絡人; 2 | DROP TABLE IF EXISTS 客戶; 3 | 4 | CREATE TABLE IF NOT EXISTS 客戶( 5 | 客戶_id SERIAL, 6 | 客戶名稱 VARCHAR(255) NOT NULL, 7 | PRIMARY KEY(客戶_id) 8 | ); 9 | 10 | CREATE TABLE IF NOT EXISTS 聯絡人( 11 | 聯絡人id SERIAL, 12 | 客戶id INT, 13 | 聯絡人姓名 VARCHAR(255) NOT NULL, 14 | 電話 VARCHAR(15), 15 | 郵件 VARCHAR(100), 16 | PRIMARY KEY(聯絡人id), 17 | FOREIGN KEY(客戶id) REFERENCES 客戶(客戶_id) 18 | ON DELETE CASCADE 19 | 20 | ); 21 | 22 | INSERT INTO 客戶(客戶名稱) 23 | VALUES('遠傳電信'), 24 | ('台灣大車隊'); 25 | 26 | INSERT INTO 聯絡人(客戶id,聯絡人姓名,電話,郵件) 27 | VALUES (1,'John Doe','(408)-111-1234','john.doe@bluebird.dev'), 28 | (1,'Jane Doe','(408)-111-1235','jane.doe@bluebird.dev'), 29 | (2,'David Wright','(408)-222-1234','david.wright@dolphin.dev'); 30 | 31 | 32 | DELETE FROM 客戶 33 | WHERE 客戶_id = 1; 34 | 35 | SELECT * FROM 客戶; 36 | SELECT * FROM 聯絡人; -------------------------------------------------------------------------------- /sql/lesson5_4.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE basket_a( 2 | a INT PRIMARY KEY, 3 | fruit_a VARCHAR(100) NOT NULL 4 | ); 5 | 6 | CREATE TABLE basket_b( 7 | b INT PRIMARY KEY, 8 | fruit_b VARCHAR(100) NOT NULL 9 | ); 10 | 11 | INSERT INTO basket_a (a, fruit_a) 12 | VALUES 13 | (1, 'Apple'), 14 | (2, 'Orange'), 15 | (3, 'Banana'), 16 | (4, 'Cucumber'); 17 | 18 | INSERT INTO basket_b (b, fruit_b) 19 | VALUES 20 | (1, 'Orange'), 21 | (2, 'Apple'), 22 | (3, 'Watermelon'), 23 | (4, 'Pear'); 24 | 25 | SELECT * FROM basket_a; 26 | SELECT * FROM basket_b; 27 | 28 | 29 | /*inner join*/ 30 | SELECT a,fruit_a,b,fruit_b 31 | FROM basket_a INNER JOIN basket_b ON fruit_a = fruit_b 32 | 33 | /*left join*/ 34 | SELECT a,fruit_a,b,fruit_b 35 | FROM basket_a LEFT JOIN basket_b ON fruit_a = fruit_b 36 | 37 | /*left join*/ 38 | SELECT a,fruit_a,b,fruit_b 39 | FROM basket_a LEFT JOIN basket_b ON fruit_a = fruit_b 40 | WHERE b IS NULL 41 | 42 | /*right join*/ 43 | SELECT a,fruit_a,b,fruit_b 44 | FROM basket_a RIGHT JOIN basket_b ON fruit_a = fruit_b 45 | 46 | /*right join*/ 47 | SELECT a,fruit_a,b,fruit_b 48 | FROM basket_a RIGHT JOIN basket_b ON fruit_a = fruit_b 49 | WHERE a IS NULL 50 | 51 | /*full outer join*/ 52 | 53 | SELECT a,fruit_a,b,fruit_b 54 | FROM basket_a FULL OUTER JOIN basket_b ON fruit_a = fruit_b 55 | 56 | /* full outer join with where */ 57 | SELECT a,fruit_a,b,fruit_b 58 | FROM basket_a FULL OUTER JOIN basket_b ON fruit_a = fruit_b 59 | WHERE a IS NULL OR b IS NULL 60 | 61 | -------------------------------------------------------------------------------- /sql/lesson5_5.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS 聯絡人; 2 | DROP TABLE IF EXISTS 客戶; 3 | 4 | CREATE TABLE IF NOT EXISTS 客戶( 5 | 客戶_id SERIAL, 6 | 客戶名稱 VARCHAR(255) NOT NULL, 7 | PRIMARY KEY(客戶_id) 8 | ); 9 | 10 | CREATE TABLE IF NOT EXISTS 聯絡人( 11 | 聯絡人id SERIAL, 12 | 客戶id INT, 13 | 聯絡人姓名 VARCHAR(255) NOT NULL, 14 | 電話 VARCHAR(15), 15 | 郵件 VARCHAR(100), 16 | PRIMARY KEY(聯絡人id), 17 | FOREIGN KEY(客戶id) REFERENCES 客戶(客戶_id) 18 | ); 19 | 20 | INSERT INTO 客戶(客戶名稱) 21 | VALUES('遠傳電信'), 22 | ('台灣大車隊'); 23 | 24 | INSERT INTO 聯絡人(客戶id,聯絡人姓名,電話,郵件) 25 | VALUES (1,'John Doe','(408)-111-1234','john.doe@bluebird.dev'), 26 | (1,'Jane Doe','(408)-111-1235','jane.doe@bluebird.dev'), 27 | (2,'David Wright','(408)-222-1234','david.wright@dolphin.dev'); 28 | 29 | SELECT * from 客戶; 30 | select * from 聯絡人; 31 | 32 | SELECT 聯絡人id,客戶名稱,聯絡人姓名,電話,郵件 33 | FROM 聯絡人 LEFT JOIN 客戶 ON 聯絡人.客戶id = 客戶.客戶_id 34 | 35 | SELECT DISTINCT 客戶名稱 36 | FROM 聯絡人 LEFT JOIN 客戶 ON 聯絡人.客戶id = 客戶.客戶_id 37 | 38 | 39 | SELECT 聯絡人id,客戶名稱,聯絡人姓名,電話,郵件 40 | FROM 聯絡人 LEFT JOIN 客戶 ON 聯絡人.客戶id = 客戶.客戶_id 41 | WHERE 客戶名稱 = '遠傳電信' 42 | 43 | -------------------------------------------------------------------------------- /sql/lesson5_6.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS stations; 2 | CREATE TABLE IF NOT EXISTS stations( 3 | 編號 INT PRIMARY KEY, 4 | 名稱 VARCHAR(20) NOT NULL, 5 | 英文名稱 VARCHAR(50), 6 | 地名 VARCHAR(20), 7 | 英文地名 VARCHAR(50), 8 | 地址 VARCHAR(255), 9 | 英文地址 VARCHAR(255), 10 | 電話 VARCHAR(20), 11 | gps VARCHAR(50), 12 | youbike BOOL 13 | ); 14 | 15 | SELECT * FROM stations; 16 | 17 | SELECT COUNT(*) AS 筆數 18 | FROM stations; -------------------------------------------------------------------------------- /sql/lesson6_1.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS gate_count; 2 | DROP TABLE IF EXISTS stations; 3 | 4 | 5 | CREATE TABLE IF NOT EXISTS stations( 6 | 編號 INT PRIMARY KEY, 7 | 名稱 VARCHAR(20) NOT NULL, 8 | 英文名稱 VARCHAR(50), 9 | 地名 VARCHAR(20), 10 | 英文地名 VARCHAR(50), 11 | 地址 VARCHAR(255), 12 | 英文地址 VARCHAR(255), 13 | 電話 VARCHAR(20), 14 | gps VARCHAR(50), 15 | youbike BOOL 16 | ); 17 | 18 | CREATE TABLE IF NOT EXISTS gate_count( 19 | id SERIAL, 20 | 日期 DATE NOT NULL, 21 | 站點編號 INT, 22 | 進站人數 INT DEFAULT 0, 23 | 出站人數 INT DEFAULT 0, 24 | PRIMARY KEY(id), 25 | FOREIGN KEY(站點編號) REFERENCES stations(編號) 26 | ON DELETE SET NULL 27 | ON UPDATE CASCADE 28 | ); 29 | 30 | SELECT * FROM stations; 31 | SELECT * FROM gate_count; 32 | 33 | SELECT COUNT(*) AS 筆數 34 | FROM stations; 35 | 36 | SELECT COUNT(*) AS 筆數 37 | FROM gate_count; -------------------------------------------------------------------------------- /sql/lesson6_2.sql: -------------------------------------------------------------------------------- 1 | SELECT * 2 | FROM gate_count LEFT JOIN stations ON 站點編號=編號; 3 | 4 | SELECT 日期,進站人數,出站人數,名稱,地名,地址,youbike 5 | FROM gate_count LEFT JOIN stations ON 站點編號=編號; 6 | 7 | /*取出基隆市有那些火車站*/ 8 | SELECT DISTINCT 名稱 9 | FROM gate_count LEFT JOIN stations ON 站點編號=編號 10 | WHERE 地址 LIKE '高雄市%'; 11 | 12 | /*取出基隆火車站2022年3月1日資料,'2022-03-01'*/ 13 | 14 | SELECT 日期,進站人數,出站人數,名稱,地名,地址,youbike 15 | FROM gate_count LEFT JOIN stations ON 站點編號=編號 16 | WHERE 名稱 = '基隆' AND 日期 = '2022-03-01'; 17 | 18 | /*取出基隆火車站2022年3月份資料,時間由小到大排序*/ 19 | 20 | SELECT 日期,進站人數,出站人數,名稱,地名,地址,youbike 21 | FROM gate_count LEFT JOIN stations ON 站點編號=編號 22 | WHERE 名稱 = '基隆' AND (日期 BETWEEN '2022-03-01' AND '2022-03-31') 23 | ORDER BY 日期 ASC; 24 | 25 | /*取出基隆火車站和臺北火車站2022年3月份資料,時間由小到大排序*/ 26 | SELECT 日期,進站人數,出站人數,名稱,地名,地址,youbike 27 | FROM gate_count LEFT JOIN stations ON 站點編號=編號 28 | WHERE 名稱 IN('基隆','臺北') AND (日期 BETWEEN '2022-03-01' AND '2022-03-31') 29 | ORDER BY 日期 ASC; 30 | 31 | /*取出資料進站人數最多的前10筆資料*/ 32 | SELECT 日期,進站人數,出站人數,名稱,地名,地址,youbike 33 | FROM gate_count LEFT JOIN stations ON 站點編號=編號 34 | ORDER BY 進站人數 DESC 35 | LIMIT 10; 36 | 37 | 38 | -------------------------------------------------------------------------------- /sql/lesson6_3.sql: -------------------------------------------------------------------------------- 1 | /*取出payment的所有客戶的coutomer_id(不重覆)*/ 2 | SELECT customer_id, COUNT(*) AS 筆數 3 | FROM payment 4 | GROUP BY customer_id 5 | 6 | /*取出payment的所有客戶的的應收帳款總合,SUM()*/ 7 | SELECT customer_id, SUM(amount) AS 總合 8 | FROM payment 9 | GROUP BY customer_id 10 | ORDER BY 總合 DESC; 11 | 12 | SELECT first_name || ' ' || last_name AS full_name, 13 | SUM(amount) AS 總合 14 | FROM payment LEFT JOIN customer ON payment.customer_id=customer.customer_id 15 | GROUP BY full_name 16 | ORDER BY 總合 DESC; 17 | 18 | SELECT first_name || ' ' || last_name AS full_name, 19 | SUM(amount) AS 總合 20 | FROM payment LEFT JOIN customer USING (customer_id) 21 | GROUP BY full_name 22 | ORDER BY 總合 DESC; 23 | 24 | 25 | SELECT first_name || ' ' || last_name AS full_name, 26 | SUM(amount) AS 總合 27 | FROM payment LEFT JOIN customer USING (customer_id) 28 | GROUP BY full_name 29 | HAVING SUM(amount) >= 200 30 | ORDER BY 總合 DESC; 31 | 32 | -------------------------------------------------------------------------------- /sql/lesson7_1.sql: -------------------------------------------------------------------------------- 1 | /*進站人數最多的一筆*/ 2 | 3 | SELECT * 4 | FROM gate_count LEFT JOIN stations ON 站點編號 = 編號 5 | WHERE 進站人數 = 82586 6 | 7 | SELECT MAX(進站人數) 8 | FROM gate_count 9 | 10 | SELECT * 11 | FROM gate_count LEFT JOIN stations ON 站點編號 = 編號 12 | WHERE 進站人數 = ( 13 | SELECT MAX(進站人數) 14 | FROM gate_count 15 | ); 16 | 17 | /*各站點進站人數最多的一筆*/ 18 | 19 | SELECT 站點編號,進站人數 20 | FROM gate_count LEFT JOIN stations ON 站點編號 = 編號 21 | WHERE (站點編號,進站人數) IN( 22 | SELECT 站點編號,MAX(進站人數) 23 | FROM gate_count 24 | GROUP BY 站點編號 25 | ) 26 | /*GROUP BY 站點編號,進站人數*/ 27 | 28 | SELECT 站點編號,MAX(進站人數) 29 | FROM gate_count 30 | GROUP BY 站點編號; 31 | 32 | 33 | 34 | --------------------------------------------------------------------------------