今日內容概要
- Navicat可視化操作
- 安裝
- 使用
- 提示
- 資料庫查詢題目講解(多表操作)
- python如何操作MySQL(pymysql模塊)
- SQL注入問題
- pymysql模塊增刪改查操作
今日內容詳細
- Navicat軟體
""" 一開始學習Python的時候,下載Python解釋器然后直接在終端寫Python陳述句, pycharm能夠更方便快捷的幫助我們書寫python代碼 excle word pdf 我們在終端操作mysql也沒有自動提示,也無法保存等等,不方便開發 Navicat內部封裝了所有的操作資料庫的命令 用戶在使用它的時候,只需要滑鼠點點點就可以完成操作,無需書寫SQL陳述句 """
安裝
使用下列的網址中的步驟即可完成操作 https://www.cnblogs.com/zero-vic/p/12786660.html 如果想用正式版,到期后自己再重新 安裝就好了 Navicat能夠充當多個資料的客戶端
使用
utf8mb4字符集可以存盤表情
創建好表之后,添加欄位時,如果指定欄位為主鍵,一定要選擇自動遞增,如果忘記了也無所謂
Navicat圖形化界面有時候反應速度比較慢,你可以選擇重繪或者關閉當前視窗重新打開
當你有一些需求,該軟體無法滿足的時候,你就自己動手寫SQL陳述句
提示
# 1.MySQL是不區分大小寫的 忽略大小寫 驗證碼忽略 內部統一轉成大寫或者小寫即可 upper() lower() # 2.mysql建議所有的關鍵字大寫 # 3.MySQL的注釋有兩種 __ # # 4.navicat中如何快速注釋和解注釋 ctrl + ? 加注釋,再按一次就可以解開注釋 版本較老的用的ctrl + shift + ? 解開注釋
- 資料庫查詢題目講解(多表操作)
""" 1.查詢所有的課程的名稱以及對應的任課老師姓名 4.查詢平均成績大于80分的同學的姓名和平均成績 7.查詢沒有報李萍老師課的學生姓名 8.查詢沒有同時選修物理課程和體育課程的學生姓名 9.查詢掛科超過兩門(包括兩門)的學生姓名和班級 """ #1.查詢所有的課程的名稱以及對應的任課老師姓名 select course.cname,teacher.tname from course inner join teacher on course.teacher_id = teacher.tid; #4.查詢平均成績大于80分的同學的姓名和平均成績 SELECT student.sname, t1.avg_num FROM student INNER JOIN ( SELECT score.student_id, AVG( num ) AS avg_num FROM score
GROUP BY score.student_id HAVING avg( num ) > 80 ) AS t1 ON student.sid = t1.student_id; -- 7.查詢沒有報李萍老師課的學生姓名 #分步操作 -- 1.先找到李平老師教授的課程id -- 2.再找所有報了李平老師課程的學生id -- 3.之后再去學生表里取反,就可以獲取沒有報李萍老師課程的學生姓名 SELECT student.sname FROM student WHERE student.sid NOT IN ( SELECT DISTINCT score.student_id FROM score WHERE score.course_id IN ( SELECT course.cid FROM course INNER JOIN teacher ON
course.teacher_id = teacher.tid WHERE teacher.tname = '李平老師' )); #8.查詢沒有同時選修物理課程和體育課程的學生姓名 # 方法1: -- SELECT -- student.sname -- FROM -- student -- WHERE -- student.sid IN ( -- SELECT -- score.student_id -- FROM -- score -- INNER JOIN course ON score.course_id = course.cid -- WHERE -- course.cname IN ( "物理", "體育" ) -- GROUP BY -- score.student_id -- HAVING -- COUNT( score.student_id ) = 1 -- ); # 方法2: SELECT student.sname FROM student WHERE student.sid IN ( SELECT score.student_id FROM score WHERE score.course_id IN ( SELECT course.cid FROM course WHERE course.cname IN ( '物理', '體育' )) GROUP BY student_id HAVING COUNT( student_id ) = 1 ); #9.查詢掛科超過兩門(包括兩門)的學生姓名和班級 SELECT student.sname, class.caption FROM class INNER JOIN student ON class.cid = student.class_id WHERE student.sid IN ( SELECT score.student_id FROM score WHERE score.num < 60 GROUP
BY student_id HAVING COUNT( student_id ) >= 2 );
- python如何操作MySQL(pymysql模塊)
""" 支持Python代碼操作資料庫MySQL """ import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123', database = 'day48', charset = 'utf8' ) cursor = conn.cursor(cursor = pymysql.cursors.DictCursor) #產生一個游標物件 """ cursor = pymysql.cursors.DictCursor 將查詢結果以字典的形式回傳 """ sql = 'select * from teacher;' res = cursor.execute(sql) print(res) #execute回傳的是你當前sql陳述句所影響的行數,該回傳值一般不用 #獲取命令執行的查詢結果 print(cursor.fetchone()) #只拿一條結果 print(cursor.fetchall()) #拿所有 print(cursor.fetchmany(4)) #拿括號中指定的條數 print(cursor.fetchone()) print(cursor.fetchone()) #讀取檔案類似于檔案的游標的移動 # cursor.scroll(1,'relative') #相對于游標所在的位置繼續往后移動一位 cursor.scroll(1,'absolute') #相對于資料的開頭往后移動一位 print(cursor.fetchall())
SQL注入問題
""" l利用一些語法的特性,書寫一些特殊的陳述句實作固定的語法 MySQL利用的是MySQL的注釋陳述句 日常生活中,很多軟體注冊時候,都不能含有特殊符號,因為怕你構造出特定的陳述句入侵資料造成不安全 敏感的資料,不要自己作拼接,交給excute方法即可 """ # 版本一、存在的問題 ,當用戶這樣輸入的時候,也能登陸成功 """ >>>>>>:jason' -- ajskdf; >>>>>>: 登陸成功 [{'id': 8, 'name': 'jason', 'password': '123'}] Process finished with exit code 0 或者這樣 >>>>>>:xxx' or 1=1 -- fajdkf;adj >>>>>>: 登陸成功 [{'id': 2, 'name': 'egon', 'password': '123'}, {'id': 3, 'name': 'owen', 'password': '123'},
{'id': 4, 'name': 'jasonNB', 'password': '123'}, {'id': 5, 'name': 'jack', 'password': '123'},
{'id': 6, 'name': 'liili', 'password': '123'}, {'id': 8, 'name': 'jason', 'password': '123'},
{'id': 9, 'name': 'xxx', 'password': '132'}, {'id': 10, 'name': 'ooo', 'password': '123'},
{'id': 11, 'name': 'aaa', 'password': '132'}] #以上現象就是SQL注入問題: """ import pymysql conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', passwd='123', database='day48', charset='utf8' ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) username = input('>>>>>>:').strip() password = input('>>>>>>:').strip() sql = "select * from user where name='%s' and password='%s'" %(username,password) rows = cursor.execute(sql) if rows: print('登陸成功') print(cursor.fetchall()) else: print('賬號密碼錯誤') #版本二:解決方案,不要拼接 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', passwd='123', database='day 48', charset='utf8', autocommit=True ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) while True: username = input('>>>>>:').strip() password = input('>>>>>:').strip() sql = 'select * from user where name=%s and password=%s' # 不要手動拼接,先用%s占位之后將需要拼接的資料交給excute方法即可 rows = cursor.execute(sql,(username,password)) if rows: print('登陸成功') print(cursor.fetchall()) break else: print('賬號密碼錯誤,登錄失敗')
總結
""" 1.Navicat自己玩一玩 2.練習題一定要自己敲會 3.熟悉pymysql模塊 4.SQL注入產生的原因及解決方案 了解 """
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/297718.html
標籤:Python
上一篇:python 中最好用的身份證規則決議工具,地區碼、性別、出生年月、身份證編碼等快速校驗!
下一篇:四十九、MySQL資料庫尾聲
