1. 程式人生 > 實用技巧 >資料庫進階四

資料庫進階四

一: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('使用者名稱密碼錯誤')