資料庫進階四
阿新 • • 發佈:2020-08-06
一:Navicat視覺化介面操作資料庫
略
二:資料庫查詢題目講解(多表操作)
""" 課下一定要把握上課將的這幾道題全部自己獨立的理解並寫出來 在解決sql查詢問題的時候 不要慌 一步一步慢慢來 最終能夠東拼西湊出來就過關了!!! """ -- 1、查詢所有的課程的名稱以及對應的任課老師姓名 -- SELECT -- course.cname, -- teacher.tname -- FROM -- course -- INNER JOIN teacher ON course.teacher_id = teacher.tid; -- 4、查詢平均成績大於八十分的同學的姓名和平均成績 -- SELECT -- student.sname, -- t1.avg_num -- FROM -- student -- INNER JOIN ( -- SELECT -- score.student_id, -- avg( num ) AS avg_num -- FROM -- score -- INNER JOIN student ON score.student_id = student.sid -- 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 -- sid NOT IN ( -- SELECT DISTINCT -- score.student_id -- FROM -- score -- WHERE -- score.course_id IN ( SELECT course.cid FROM teacher INNER JOIN course ON teacher.tid = course.teacher_id WHERE teacher.tname = '李平老師' ) -- ); -- 8、 查詢沒有同時選修物理課程和體育課程的學生姓名 -- (只要選了一門的 選了兩門和沒有選的都不要) # 1 先查物理和體育課程的id # 2 再去獲取所有選了物理和體育的學生資料 # 3 按照學生分組 利用聚合函式count篩選出只選了一門的學生id # 4 依舊id獲取學生姓名 -- 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 -- score.student_id -- HAVING -- COUNT( score.course_id ) = 1 -- ); -- 9、 查詢掛科超過兩門(包括兩門)的學生姓名和班級 # 1 先篩選出所有分數小於60的資料 # 2 按照學生分組 對資料進行計數獲取大於等於2的資料 SELECT class.caption, student.sname 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 score.student_id HAVING COUNT( score.course_id ) >= 2 );
三:Python操作MySQL(pymysql模組)
# 支援python程式碼操作資料庫MySQL 安裝pymysql: pip3 install pymysql # 匯入pymysql模組 import pymysql # 連線資料庫 conn = pymysql.connect( host='127.0.0.1', # 'ip' port=3306, # '埠' user='root', # 'mysql使用者名稱' password='yumi_0405', # 'mysql密碼' 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(2)) # 可以指定拿幾條 print(cursor.fetchone()) print(cursor.fetchone()) # 讀取資料類似於檔案游標的移動 # cursor.scroll(1,'relative') # 相對於游標所在的位置繼續往後移動1位 cursor.scroll(1,'absolute') # 相對於資料的開頭往後繼續移動1位 print(cursor.fetchall())
四:sql注入問題
""" 利用一些語法的特性 書寫一些特點的語句實現固定的語法 MySQL利用的是MySQL的註釋語法 select * from user where name='jason' -- jhsadklsajdkla' and password='' select * from user where name='xxx' or 1=1 -- sakjdkljakldjasl' and password='' """ 日常生活中很多軟體在註冊的時候都不能含有特殊符號 因為怕你構造出特定的語句入侵資料庫 不安全 # 敏感的資料不要自己做拼接 交給execute幫你拼接即可 # 結合資料庫完成一個使用者的登入功能? import pymysql conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123456', database = 'day48', charset = 'utf8' # 編碼千萬不要加- ) # 連結資料庫 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) username = input('>>>:') password = input('>>>:') sql = "select * from user where name=%s and password=%s" # 不要手動拼接資料 先用%s佔位 之後將需要拼接的資料直接交給execute方法即可 print(sql) rows = cursor.execute(sql,(username,password)) # 自動識別sql裡面的%s用後面元組裡面的資料替換 if rows: print('登入成功') print(cursor.fetchall()) else: print('使用者名稱密碼錯誤')