學習Python第14天_mysql操作1

2020-08-12 10:12:18

僅記錄個人學習Python所學,學識淺薄,若有錯誤歡迎指出。文章可能會不太完善,後續可能會繼續更新。


SQL分類
數據庫並不對大小寫敏感 ,一般用小寫比較易讀。

一、DDL

DDL【Data Definition Language】,數據定義語言,使用者建立、修改、刪除表結構

# 建立數據庫
CREATE DATABASE database_name charset='utf8';
# 這裏的charset=utf8 是設定數據庫的字元集
# UTF-8 可以接受中文,這裏不需要寫- 
# CREATE TABLE 表名 (
#		欄位1 欄位型別[列級別約束條件][預設值],
#		欄位2 欄位型別[列級別約束條件][預設值],
#		….
#		欄位n 欄位型別[列級別約束條件][預設值]
#		[表級別約束條件]
# );
# 語句後都要加; mysql 中預設的結束語句符號爲;
# 可以通過delimiter 空格 加想要作爲結束符的符號 ##、&...都可以,一般不會修改。
# 在輸入結束符+回車之前 回車不會執行語句 只會換行。

# 查詢當前數據庫伺服器中所有的數據庫
show databases;

# 檢視當前正在使用的數據庫
select database();

# 使用數據庫
# use 數據庫名

# 退出數據庫
# exit
# quit
# ctrl + z

alter操作
修改

# 1.修改表名
# 語法規則:ALTER TABLE old_table_name RENAME [TO] new_table_name

# 2.修改欄位的數據型別
# 語法規則:ALTER TABLE table_name MODIFY 欄位名 數據型別
# 修改完成之後可以檢視DESC table_name檢驗結果

# 3.修改欄位名
# 語法規則:ALTER TABLE table_name CHANGE 舊欄位名 新欄位名 數據型別

# 4.新增欄位
# 語法規則:ALTER TABLE table_name ADD 新欄位名 數據型別 [約束條件] [FIRST|AFTER 已經存在的欄位名]

# 5.刪除欄位
# 語法規則:ALTER TABLE table_name DROP 欄位名

# 6.修改欄位的排列位置
# 語法規則:ALTER TABLE table_name MODIFY 欄位1 數據型別 FIRST|AFTER 欄位2
#	first: 設定成第一個
#	after 欄位2: 在指定欄位2的後面

# 7.刪除數據表
# 刪除沒有被關聯的表
# 語法規則:DROP TABLE [IF EXISTS] 表1,表2...
# 刪除被其他表關聯的的表
# 直接刪除會出現錯誤的,操作: 先解除關聯 再進行刪除

#8.刪除表的外來鍵約束
# 語法規則:ALTER TABLE table_name DROP FOREIGN KEY 外來鍵約束名

# 刪除數據庫
# drop database database_name

# 刪除表
# drop table user;

二、DML

DML【Data Manipulation Language】,數據操作語言,用於對錶數據進行增刪改的操作
以下 mysql> 並不是寫入的語句
插入:insert into

# 單行插入
# INSERT INTO table_name (field1, field2,...fieldN) VALUES(value1, value2,...valueN);

# 多行插入[批次插入]
INSERT INTO table_name (field1, field2,...fieldN)
                   VALUES
                  (value1, value2,...valueN),
                  (value12, value22,...valueNN)...;

注意:
a.列名和列值的型別、個數以及順序一一對應
b.可以把列名當做Python中的形參,把列值當做實參
c.值不能超出列定義的長度
d.如果插入的是空值,寫Null/null
e.插入的是日期,和字串一樣,使用引號括起來 「1988-11-22 10:11:12」

演示:

mysql> use mydb1;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> create table worker(
 -> id int(11),
 -> name varchar(20),
 -> gender varchar(10),
 -> salary double
 -> );
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;                                                             +-----------------+
| Tables_in_mydb1 |
+-----------------+
| worker          |
+-----------------+
1 row in set (0.00 sec)

mysql> desc worker;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | YES  |     | NULL    |       |
| name   | varchar(20) | YES  |     | NULL    |       |
| gender | varchar(10) | YES  |     | NULL    |       |
| salary | double      | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
# 如果給每個欄位都賦值,就可以省略掉欄位的書寫
mysql> insert into worker values(3,'rose','g',6000);
select * from worker;
+------+------+--------+--------+
| id   | name | gender | salary |
+------+------+--------+--------+
|    3 | rose | g      |   6000 |
+------+------+--------+--------+

# 一次性插入多條數據【批次插入】
mysql> insert into worker(id,name,gender,salary) values(4,'bob','b',1500),(5,'hello','g',5500),(6,'abc','b',6600);

mysql> select * from worker;
+------+-------+--------+--------+
| id   | name  | gender | salary |
+------+-------+--------+--------+
|    3 | rose  | g      |   6000 |
|    4 | bob   | b      |   1500 |
|    5 | hello | g      |   5500 |
|    6 | abc   | b      |   6600 |
+------+-------+--------+--------+

更新:update

UPDATE table_name SET field1=new-value1, field2=new-value2  [WHERE Clause]

注意:
a.完全可以更新一個欄位或者多個欄位
b.where相當於Python中的if語句
c.可以指定任何條件到where子句中
d.如果沒有where子句,則預設所有的行都被同時更新爲指定的操作[慎用!一般要結合where使用]

# 1.將所有員工的薪水修改爲5000
mysql> update worker set salary=5000;
mysql> select * from worker;
+------+-------+--------+--------+
| id   | name  | gender | salary |
+------+-------+--------+--------+
|    3 | rose  | g      |   5000 |
|    4 | bob   | b      |   5000 |
|    5 | hello | g      |   5000 |
|    6 | abc   | b      |   5000 |
+------+-------+--------+--------+
# 2.將rose的薪水在原來的基礎上增加1000
mysql> update worker set salary=salary+1000 where name='rose';
mysql> select * from worker;
+------+-------+--------+--------+
| id   | name  | gender | salary |
+------+-------+--------+--------+
|    3 | rose  | g      |   6000 |
|    4 | bob   | b      |   5000 |
|    5 | hello | g      |   5000 |
|    6 | abc   | b      |   5000 |
+------+-------+--------+--------+
# 3.將abc的薪水改爲6000
update worker set salary=6000 where name='abc';
# 4.將bob的性別改爲b
update worker set gender='b' where name='bob';

刪除:delete

DELETE FROM table_name [WHERE Clause] 
# 1.刪除表中abc的全部數據
mysql> delete from worker where name='abc';

# 2.刪除表中的所有數據
mysql> delete from worker;
Query OK, 5 rows affected (0.01 sec)

mysql> select * from worker;
Empty set (0.00 sec)
# 刪除表中的數據的方法有delete,truncate, 其中TRUNCATE TABLE用於刪除表中的所有行,而不記錄單個行刪除操作。TRUNCATE TABLE 與沒有 WHERE 子句的 DELETE 語句類似;但是,TRUNCATE TABLE 速度更快,使用的系統資源和事務日誌資源更少
# Truncate是一個能夠快速清空資料表內所有資料的SQL語法。並且能針對具有自動遞增值的欄位,做計數重置歸零重新計算的作用。


mysql> truncate table worker;
Query OK, 0 rows affected (0.02 sec)

注意:
a.如果where子句沒有指定,則預設將表中的數據全部刪除【慎用!】
b.可以指定任何條件在where子句中
注意:
delete:刪除表中的指定數據,表結構還在,刪除之後的數據可以找回,對自動增加的欄位無影響
truncate:清空表中的數據,刪除的數據是不能找回的,執行速度比delete快,自動增加的欄位會重新計數
drop: 刪除表,數據和表結構都刪除

三、DQL

DQL【Data Query Language】,數據查詢語言,用於負責表數據的查詢工作
查詢語法

SELECT 列名 FROM 表名【WHERE --> GROUP BY -->HAVING--> ORDER BY】

基礎查詢

# 1.查詢所有列
mysql> select * from student;

# 2.查詢指定列
mysql> select id,name,gender from student;

條件查詢

主要結合where的使用

between…and: 介於…和…之間

and:邏輯與

or:邏輯或

in / not in:類似於Python中的成員運算子

is / is not: 類似於Python中的身份運算子 , 常用語判斷null值, 如:name is null

# 1.查詢性別爲女,並且年齡爲20的記錄
mysql> select * from student where gender='female' and age=20;

# 2.查詢編號爲1或者姓名爲ddd的記錄
mysql> select * from student where id='1' or name='ddd';

# 3.查詢編號分別爲1,2,3的記錄
mysql> select * from student where id='1' or id='2' or id='3';
# 簡寫形式
mysql> select * from student where id in('1','2','3');
# 這裏還是用in會比較方便

# 4.查詢編號不爲1,2,3的記錄
mysql> select * from student where id not in('1','2','3');

# 5.查詢年齡爲null的記錄
mysql> select * from student where age is null;

# 6.查詢年齡在15~20之間的記錄
mysql> select * from student where age>=15 and age<=20;
# 簡寫形式
mysql> select * from student where age between 15 and 20;
# between m and n  m和n是包含在查詢條件裏面的

模糊查詢

where 子句中=表示精準查詢

like:一般情況下結合where子句使用

萬用字元:

​ _: 匹配任意一個字元

​ %:匹配0~n個字元【n大於等於1】

# 1.查詢姓名由4個字元組成的記錄
mysql> select * from student where name like '____';
# 這裏是4個下劃線

# 2.查詢姓名由3個字元組成的記錄,並且最後一個字母爲c的記錄
mysql> select * from student where name like '__c';

# 3.查詢以a開頭的記錄
mysql> select * from student where name like 'a%';

# 4.查詢姓名中包含b的記錄
mysql> select * from student where name like '%b%';

# 5.查詢姓名中第2個字母爲c的記錄
mysql> select * from student where name like '_c%';

欄位查詢控制

as: 起別名,用法 :select 欄位 as 別名
distinct: 去除重複記錄

# 去除重複記錄
select distinct id from student;
# 起別名
select name as 姓名,gender as 性別  from student;

排序
order by:指定數據返回的順序

​ asc:ascending,升序

​ desc: descending,降序

用法:select from 表 order by xxx

# 1.查詢所有的記錄,按照年齡升序排序
mysql> select * from student order by age asc;

# 2.查詢所有學生記錄,按照年齡降序排序,如果年齡相等,則按照編號進行升序排序 
mysql> select * from student order by age desc,id asc; 

聚合函數
count():統計指定列不爲null的記錄行數

# 1.查詢年齡大於20的人數
mysql> select count(*)  from student where age>20;

sum():計算指定列的數值和

#1.查詢所有學生的年齡和
mysql> select sum(age) from student;

# 2.查詢所有學生的年齡和,以及所有學生的編號和
mysql> select sum(age),sum(id) from student;

求指定列中的最大值和最小值

max():, min():

# 求最大年齡和最小年齡
mysql> select max(age),min(age) from student;

avg()

average:平均數

select avg(age) from student;

分組查詢
group by:分組查詢

having:有…,表示條件,類似於where的用法

create table emp(			
empno int primary key,
enname varchar(20),
job varchar(20),
mgr int,
hiredate date,
sal double,
comm double,
deptno int
);
# 1.查詢各個部門的人數
select count(*) from emp group by deptno;

# 2.查詢每個部門的部門編號和每個部門的工資和
select deptno,sum(sal) from emp group by deptno;

# 3.查詢每個部門的部門編號和每個部門的人數
select deptno,count(*) from emp group by deptno;

# 4.查詢每個部門的部門編號和每個部門工資大於1500的人數
select deptno,count(*) from emp where sal>1500 group by deptno;

# 5.查詢工資總和大於7000的部門編號以及工資和
select deptno,sum(sal) from emp group by deptno having sum(sal)>7000;

​ having和where的區別

​ a.二者都表示對數據執行條件

​ b.having是在分組之後對數據進行過濾

​ where是在分組之前對數據進行過濾

​ c.having後面可以使用聚合函數

​ where後面不可以使用聚合函數

# 查詢工資大於1500,工資總和大於6000的部門編號和工資和
select deptno,sum(sal) from emp where sal>1500 group by deptno having sum(sal)>6000;

分頁查詢
limit:用來限定查詢的起始行,以及總行數

# 1.查詢4行記錄,起始行從0開始
select * from emp limit 0,4;

# 跳過前兩個,查詢3條記錄
select * from emp limit 2,3;

查詢語句書寫順序:select----》from—》where—》group by-----》having-----》order by----->limit

DCL【Data Control Language】:數據控制語言,用來定義存取許可權和安全級別(後續可能會補充)