視覺化軟體Navicat,python操作MySQL
視覺化軟體Navicat
第三方開發的用來充當資料庫客戶端的簡單快捷的操作介面
無論第三方軟體有多麼的花裡胡哨,底層的本質還是SQL
能夠操作資料庫的第三方視覺化軟體有很多,其中針對MySQL最出名的就是Navicat。
軟體下載與安裝
1.瀏覽器搜尋Navicat直接下載
版本很多、能夠充當的資料庫客戶端也很多
2.破解方式
先試用在破解、直接下載破解版(老版本)、修改試用日期
3.常用操作
有些功能可能需要自己修改SQL預覽
建立庫、表、記錄、外來鍵
逆向資料庫到模型、模型建立
新建查詢可以編寫SQL語句並自帶提示功能
SQL語句註釋語法
--、#、\**\
執行、轉儲SQL檔案
編寫複雜的SQL不要想著一口氣寫完,一定要先明確思路,然後一步步寫一步步查一步步補。
1、查詢所有的課程的名稱以及對應的任課老師姓名
# 1.先確定需要用到幾張表——課程表、講師表
# 2.預覽表中的資料,做到心中有數
-- select * from course; -- select * from teacher;
# 3.確定多表查詢的思路——連表、子查詢、混合操作
SELECT teacher.tname, course.cname FROM course INNER JOIN teacher ON course.teacher_id= teacher.tid
2、查詢平均成績大於八十分的同學的姓名和平均成績
# 1.先確定需要用到幾張表——學生表、分數表
# 2.預覽表中的資料
-- select * from student; -- select * from score;
# 3.根據已知條件80分,選擇切入點——分數表
# 求每個學生的平均成績,按照student_id分組,然後avg求num即可
SELECT student_id, avg(num) as avg_num FROM score GROUP BY student_id HAVING avg_num>80;
# 4.確定最終的結果需要幾張表。需要兩張表,採用連表更加合適
SELECT student.sname, t1.avg_num from student INNER JOIN(SELECT student_id, avg(num) as avg_num FROM score GROUP BY student_id HAVING avg_num>80) as t1 on student.sid = t1.student_id;
3、查詢沒有同時選修物理課程和體育課程的學生姓名(報了兩門或者一門不報的都不算)
# 1.先確定需要的表——學生表、分數表、課程表
# 2.預覽表資料
# 3.根據給出的條件確定起手的表
# 4.根據物理和體育篩選課程id
select cid from course where cname in ('物理','體育');
# 5.根據課程id篩選出所有跟物理、體育相關的學生資訊
select * from score where course_id in (select cid from course where cname in ('物理','體育'));
# 6.統計每個學生報了的課程數,篩選出等於1的
select student_id from score where course_id in (select cid from course where cname in ('物理','體育')) GROUP BY student_id HAVING COUNT(course_id)=1;
# 7.子查詢獲取學生姓名即可
select sname FROM student WHERE sid in(select student_id from score where course_id in (select cid from course where cname in ('物理','體育')) GROUP BY student_id HAVING COUNT(course_id)=1);
4、查詢掛科超過兩門(包括兩門)的學生姓名和班級
# 1.先確定涉及到的表——分數表、學生表、班級表
# 2.預覽表資料
# 3.根據條件確定以分數表作為起手條件
# 步驟1 先篩選掉大於60的資料
select * from score where num < 60;
# 步驟2 統計每個學生掛科的次數
select student_id,count(course_id) from score where num < 60 group by student_id;
# 步驟3 篩選次數大於等於2的資料
select student_id from score where num < 60 group by student_id having count(course_id) >= 2;
# 步驟4 連線班級表與學生表 然後基於學生id篩選即可
select student.sname, class.caption FROM student INNER JOIN class ON student.class_id = class.cid WHERE student.sid IN(select student_id from score where num < 60 group by student_id having count(course_id) >= 2);
pymysql模組下載
pip3 install pymysql
匯入模組
import pymysql
程式碼實操
1.連線MySQL服務端
conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', db='db5_02', charset='utf8mb4' )
2.產生遊標物件
cursor = conn.cursor() # 括號內不填寫額外引數,資料是元組,指定性不強 [(),()]
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 新增引數之後,資料是字典的形式,可以很清楚地識別每個資料所表示的欄位名 [{},{}]
3.編寫SQL語句
sql = 'select * from teacher;' # 查詢老師表中的資訊
# sql = 'select * from score;' # 查詢分數表中的資訊
4.傳送SQL語句
affect_rows = cursor.execute(sql) # execute也有返回值,接收的是SQL語句影響的行數
# 收的是SQL語句影響的行數
print(affect_rows) # 5
5.獲取SQL語句執行之後的結果
res = cursor.fetchall() print(res) # [{'tid': 1, 'tname': '張磊老師'}, {'tid': 2, 'tname': '李平老師'}, {'tid': 3, 'tname': '劉海燕老師'}, {'tid': 4, 'tname': '朱雲海老師'}, {'tid': 5, 'tname': '李傑老師'}]
fetchall() 獲取所有的結果
fetchone() 獲取結果集的第一個資料
fetchmany() 獲取指定數量的結果集,括號裡面可以傳數字引數,表示一次獲取的資料量
ps: 三者都有類似於檔案游標移動的特性
cursor.scroll(1,'relative') # 基於當前位置往後移動
res1 = cursor.fetchone() print(res1) # {'tid': 1, 'tname': '張磊老師'} cursor.scroll(1,'relative') res2 = cursor.fetchone() print(res2) # {'tid': 3, 'tname': '劉海燕老師'}
cursor.scroll(0,'absolute') # 基於資料的開頭往後移動
res1 = cursor.fetchone() print(res1) # {'tid': 1, 'tname': '張磊老師'} cursor.scroll(0,'absolute') res2 = cursor.fetchone() print(res2) # {'tid': 1, 'tname': '張磊老師'}
2.增刪改查
如果想要通過程式碼往上述表格中插入、修改或刪除資料,預設是無法操作的,必須要經過二次確認才可以。
conn.commit() # 針對增、刪、改,二次確認(程式碼確認)
我們也可以直接在連線MySQL服務端的括號內新增一條配製,自動確認
conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', db='db5_02', charset='utf8mb4', autocommit=True # 針對增、刪、改,自動確認(直接配置) )