數據的存儲離不開數據庫,常見的數據庫有關係型數據庫和非關係型數據庫,前者有MySQL系列,Oracle,以及阿里的oceanbase等,而後者主要以redis,mamcached爲主,做緩存使用。下面以最常見的MySQL爲例,進行簡單的學習總結:
一、MySQL的安裝與開啓
首先需要做的是在本地或服務器上安裝好MySQL-server等數據庫,以本地安裝爲例,具體安裝教程可以參考https://blog.csdn.net/bobo553443/article/details/81383194,在進行簡單的安裝配置後,(如默認安裝),將C:\Program Files\MySQL\MySQL Server 8.0\bin添加到環境變量中,重啓生效後,在cmd下輸入"mysql -u root -p",然後輸入初始設置的密碼,接着進入數據庫,在輸入"show databases;",如果出現以下類似界面即表示安裝成功。
補充一句,安裝MySQL一般會一個自帶的數據庫登錄可視化的軟件MySQL workbench,如果不喜歡的話可以試試navicat premium。
如果想在服務器上安裝配置mysql服務器,以ubuntu系統爲例,運行以下指令即可
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
安裝成功後可以通過下面的命令測試是否安裝成功:
sudo netstat -tap | grep mysql
正常輸出端口信息即表示成功,接下來利用mysql -uroot -p考慮登陸數據庫,但是由於剛開始沒有設置初始密碼,在祕密行直接回車有時會出現以下錯誤,
-
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
這時候可以考慮先設置免密登陸,然後在進行修改的錯略,該方法同樣適用於windows安裝。
-
###進入配置文件 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf #然後在這個配置文件中的[mysqld]這一塊中最後位置加入skip-grant-tables這句話,然後退出保存
- service mysql restart,重新啓動mysql,然後再登陸即可實現免密登陸了
- 通過mysql -uroot -p免密登陸進入數據庫後,輸入以下指令
show databases; ##查看數據庫詳情,回車生效
use mysql; ##回車生效
update user set authentication_string=password("你的密碼") where user="root"; ##替換新的密碼,回車生效
flush privileges; ##回車生效
quit; ##退出數據庫
- 接着再次進入配置文件,將剛纔添加的skip-grant-tables註釋掉即可,再次登陸就可以實現以新密碼登陸了。
- 有時在這一步還會出現一個如下錯誤,
ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded
這是因爲user表的plugin root的字段是auth_socket,需要替換爲mysql_native_password就行了,修改指令如下
update user set authentication_string=password("剛纔設定的密碼"),plugin='mysql_native_password' where user='root';
然後回車執行以下,再輸入select user,plugin from user;回車,我們能看到root用戶的字段改成功了,quit退出,然後重啓mysql再登陸即可。
二、mysql基礎知識
(1) 、常用操作數據庫的命令
- show databases; 查看所有的數據庫
- create database test; 創建一個叫test的數據庫
- drop database test;刪除一個叫test的數據庫
- use test;選中庫 ,在建表之前必須要選擇數據庫
- show tables; 在選中的數據庫之中查看所有的表
- create table 表名 (字段1 類型, 字段2 類型);
- desc 表名;查看所在的表的字段
- drop table 表名; 刪除表
- show create databases 庫名;查看創建庫的詳細信息
- show create table 表名; 查看創建表的詳細信息
use my_dataset1; ###開始啓用my_dataset1數據庫
create table my_form(
sid integer primary key,
sname varchar(18),
); ###在數據內創建表
desc my_form ; ###查看生成的表
(2)、修改表的命令
- 修改字段類型 alter table 表名 modify 字段 字段類型;
- 添加新的字段 alter table 表名 add 字段 字段類型
- 添加字段並指定位置 alter table 表名 add 字段 字段類型 after 字段;
- 刪除表字段 alter table 表名 drop 字段名;
- 修改指定的字段 alter table 表名 change 原字段名字 新的字段名字 字段類型
SQL語言包括四種主要程序設計語言類別的語句:數據定義語言(DDL),數據操作語言(DML),數據控制語言(DCL)和事務控制語言(TCL)。
-
update是DML語句,是修改表中數據的語句。UPDATE table_name SET field1=new-value1, field2=new-value2
(3)、對數據的操作(增刪查排)
1.增加數據(insert)3種方式
1.1 insert into 表名 values(值1,值2,...)(很少用)
1.2 insert into 表名(字段1,字段2...) values(值1,值2,....);(較常用)
1.3 insert into 表名(字段1,字段2...) values(值1,值2,....),(值1,值2,....),(值1,值2,....);
2.刪除數據(delete) delete from 表名 where 條件 注意:where 條件必須加,否則數據會被全部刪除
3.更新數據(update) update 表名 set字段1 = 值1, 字段2 = 值2 where 條件
4.查詢數據(select)
4.1 查詢表中的所有數據 select * from 表名
4.2 指定數據查詢 select 字段 from 表名
根據條件查詢出來的數據 select 字段 from 表名 where 條件 (最常用的)
where 條件後面跟的條件
關係:>,<,>=,<=,!=
邏輯:or, and
區間:id between 4 and 6 ;閉區間,包含邊界
5.排序
select 字段 from 表 order by 字段 排序關鍵詞(desc | asc)
排序關鍵詞 desc 降序 asc 升序(默認)
5.1 通過字段來排序
例如 :select * from star order by money desc, age asc;
5.2 多字段排序
select 字段 from 表 order by 字段1 desc |asc,...字段n desc| asc;
6.常用的統計函數 sum,avg,count,max,min
只分組:select * from 表 group by 字段
例子: select count(sex) as re,sex from star group by sex having re > 3;
分組統計: select count(sex) from star group by sex;
7.分組 select * from 表名 limit 偏移量,數量
說明:
8.1.不寫偏移量的話就是默認的爲0
8.2.實現分頁的時候必須寫偏移量
偏移量怎麼計算?:
limit (n-1)*數量 ,數量
8、having與where
having字句可以讓我們篩選成組後的各種數據,where字句在聚合前先篩選記錄,也就是說作用在group by
和having字句前。而 having子句在聚合後對組記錄進行篩選。
(4)、多表聯合查詢
>>內連接
隱式內連接 select username,name from user,goods where user,gid=gods,gid;
顯示內連接 select username,from user inner join goods on user.gid=goods.gid;
>>外鏈接
左連接 包含所有的左邊表中的記錄以及右邊表中沒有和他匹配的記錄 select * from user left join goods on user.gid=goods.gid;
右連接 select * from user right join goods on user.gid=goods.gid;
子嵌套查詢 select * from user where gid in(select gid from goods);
>>數據聯合查詢
select * from user left join goods on user.gid=goods.gid union select * from user right join goods on user.gid=goods.gid;
>>兩個表同時更新 update user u, goods g set u.gid=12,g.price=1 where u.id=2 and u.gid=g.gid;
(5)、DCL 數據控制語言
1.創建用戶:create user'xiaoming'@'localhost' identified by '666666';
2.授權用戶:grant all on test.*to'xiaoming'@'localhost';
3.刷新權限:flush privileges;
4.取消授權:revoke all on test.* from 'xiaoming'@'localhost';
5.刪除用戶: drop user'xiaoming'@'localhost';
(6)、DTL 數據事務語言
開啓事務:set autocommit=0;
操作回滾:rollback;
提交事務:commit;
事務:是數據庫操作的最小工作單元,是作爲單個邏輯工作單元執行的一系列操作;這些操作作爲一個整體一起向系統提交,要麼都執行、要麼都不執行;事務是一組不可再分割的操作集合(工作邏輯單元)
事務的四大特性:
1 、原子性
事務是數據庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做
2 、一致性
事 務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。因此當數據庫只包含成功事務提交的結果時,就說數據庫處於一致性狀態。如果數據庫系統 運行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對數據庫所做的修改有一部分已寫入物理數據庫,這時數據庫就處於一種不正確的狀態,或者說是 不一致的狀態。
3 、隔離性
一個事務的執行不能其它事務干擾。即一個事務內部的操作及使用的數據對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。
4 、持續性
也稱永久性,指一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。
事務處理流程一般如下:
try{
connection.setAutoCommit( false);
數據庫操作...
connection.commit();
}catch(Exception ex){
connection.rollback();
}finally{
connection.setAutoCommit( true);
}
三、Python之MySQL操作實例(linux下)
(1)安裝數據庫
下載安裝pymyql庫或者mysqlclient庫
pip install pymysql
pip install mysqlclient
(2)使用示例
import pymysql ##導庫
DBHOST = 'localhost'
DBUSER = 'root'
DBPASS = 'root'
DBNAME = 'dbtest'
try:
db = pymysql.connect(DBHOST, DBUSER, DBPASS, DBNAME)
print('數據庫連接成功!')
except pymysql.Error as e:
print('數據庫連接失敗'+str(e))
###創建遊標執行sql語句
cur = db.cursor()
cur.execute('DROP TABLE IF EXISTS Student') ###創建表之前先檢查是否存在,如果存在則刪除
sqlQuery = "CREATE TABLE Student(Name CHAR(20) NOT NULL ,Email CHAR(20),Age int )"
cur.execute(sqlQuery) ###建表
###向表中插入數據
sqlQuery=" INSERT INTO Student (Name, Email, Age) VALUE (%s,%s,%s) "
value=('Mike','[email protected]',20)
try:
cur.execute(sqlQuery,value)
db.commit() ###事務提交
print('數據插入成功!')
except pymysql.Error as e:
print("數據插入失敗:"+e )
db.rollback() ##事務回滾
####查詢表內容
sqlQuery = "SELECT * FROM Student"
try:
cur.execute(sqlQuery)
results=cur.fetchall()
for row in results:
name=row[0]
email=row[1]
age=row[2]
print('Name:%s,Email:%s,Age:%s'%(name,email,age))
except pymysql.Error as e:
print("數據查詢失敗:"+str(e))
###更新數據
sqlQuery = "UPDATE Student SET Name= %s WHERE Name=%s"
value = ('John', 'updated name')
try:
cur.execute(sqlQuery, value)
db.commit()
print('數據更新成功!')
except pymysql.Error as e:
print("數據更新失敗:"+str(e))
# 發生錯誤時回滾
db.rollback()
###刪除表
sqlQuery='DROP TABLE IF EXISTS Student'
cur.execute(sqlQuery)
print('表刪除成功!')
未完,待續。
參考鏈接:
https://blog.csdn.net/hzw6991/article/details/87893761(Python連接MySQL數據庫)
https://blog.csdn.net/weixin_44282031/article/details/96474285(pyqt5做的頁面與MySQL數據庫交互)
https://blog.csdn.net/u011146423/article/details/85242887(Python GUI教程:在PyQt5中使用數據庫)
https://blog.csdn.net/linshijun33/article/details/88677305(pymysql數據庫之建庫建表、增刪改查)
https://blog.csdn.net/yyx3214/article/details/97097696(mysql連接錯誤)