1. 程式人生 > 其它 >視覺化軟體Navicat,python操作MySQL

視覺化軟體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);

python操作MySQL

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': '李傑老師'}]

pymysql補充說明

上述步驟5中,如果多次使用fetchall()獲取執行之後的結果,會發現除第一次外,其他獲取到的都是空,相當於第一次獲取了所有的資料,指標移到了末尾,第二次從當前指標的位置往後獲取,後面什麼都沒有,所以獲取到的是空。

1.獲取資料

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     # 針對增、刪、改,自動確認(直接配置)
)