MYSQL數據庫基礎用法


數據庫概述

數據存儲階段

  • 人工管理階段

缺點:數據無法共享,不能單獨保持,數據存儲量有限

  • 文件管理階段

優點:數據可以長期保存,可以存儲大量的數據,使用簡單

缺點:數據一致性差,數據查找修改不方便,數據冗余度可能比較大

  • 數據庫管理階段

優點:數據阻止結構化降低了冗余度,提高了增刪改查的效率,容易擴展,方便程序調用,做自動化處理

缺點:需要使用sql 或者 其他特定的語句,相對比較復雜

數據庫應用

融機構,游戲網站,購物網站,論壇網站......

基礎感念

  數據:能夠輸入到計算機中並被識別處理的信息集合

  數據結構:研究一個數據集合中數據之間關系的

  數據庫:按照數據結構,存儲管理數據的倉庫.數據庫是在數據庫管理系統管理和控制下,在一定介質上的數據集合

  數據庫管理系統:管理數據庫的軟件,用於建立和維護數據庫

  數據庫系統:由數據庫和數據庫管理系統,開發工具等組成的集合

數據庫分類和常見數據庫

  • 關系型數據庫和非關系型數據庫

  關系型:采用關系模型(二維表)來組織數據結構的數據庫

  非關系型:不采用關系模型組織數據結構的數據庫

  • 開源數據庫和非開源數據庫

  開源:MySQL,SQLite,MongoDB

  非開源:Oracle,DB2,SQL_Server

  • 常見的關系型數據庫

  MySQL,Oracle,SQL_Server,DB2,SQLite

認識關系型數據庫和MySQL

  • 數據庫結構(圖形結構)

  數據元素--->記錄--->數據表--->數據庫

 

  • 數據庫概念解析

  數據表:存放數據的表格

  字段:每個列,用來表示該列數據的含義

  記錄:每個行,表示一組完整的數據

  • MySQL特點
  1. 是開源數據庫,使用C和C++編寫
  2. 能夠工作在眾多不同的平台上
  3. 提供了用於C,C++,Python,Java,Perl,PHP,Ruby眾多語言的API
  4. 存儲結構優良,運行速度快
  5. 功能全面豐富
  • MySQL安裝

Ubuntu安裝MySQL服務

安裝服務端: sudo apt-get install mysql-server

安裝客戶端: sudo apt-get install mysql-client

配置文件:/etc/mysql 命令集: /usr/bin 

數據庫存儲目錄 :/var/lib/mysql

  • Windows安裝MySQL

下載MySQL安裝包(windows) https://dev.mysql.com/downloads/mysql/

 

mysql-installer5.7..msi

安裝教程去安裝

  • 啟動和連接MySQL服務

服務端啟動

查看MySQL狀態: sudo /etc/init.d/mysql status

啟動服務:sudo /etc/init.d/mysql   start 打開 | stop 關閉| restart 重啟

客戶端連接

命令格式

mysql -h主機地址 -u用戶名 -p密碼

mysql -hlocalhost -uroot -p123456

本地連接可省略 -h 選項: mysql -uroot -p123456

關閉連接

ctrl-D

exit

SQL語句

什么是SQL

結構化查詢語言(Structured Query Language),一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢,更新和管理關系數據庫系統.

SQL語言使用特點

  1. SQL語言基本上獨立於數據庫本身
  2. 各種不同的數據庫對SQL語言的支持與標准存在着細微的不同
  3. 每條命令必須以  ;  結尾
  4. SQL命令關鍵字不區分字母大小寫

MySQL數據庫操作

數據庫操作

查看已有庫

  show databases; 

創建庫(指定字符集)

 create database 庫名 [character set utf8]; 

創建stu數據庫,具體例子如下:

create database stu character set utf8;

另一種方法如下:

create database stu charset=utf8;

查看創建庫的語句(字符集)

 show create database 庫名; 

查看stu創建方法:

show create database stu;

查看當前所在庫

 select database(); 

切換庫

 use 庫名; 

使用stu數據庫:

use stu;

刪除庫

 drop database 庫名; 

刪除test數據庫:

drop database test;

庫名的命名規則

  • 數字,字母,下划線,但不能使用純數字
  • 庫名區分字母大小寫
  • 不能使用特殊字符和mysql關鍵字

數據表的管理

表結構設計初步

  1. 分析存儲內容
  2. 確定字段構成
  3. 設計字段類型

數據類型支持

數字類型:

    整數類型(精確值)--->INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT

    定點類型(精確值)--->DECIMAL

    浮點類型(近似值)--->FLOAT,DOUBLE

    比特值類型--->BIT

  對於精度比較高的東西,比如money,用decimal類型提高精度減少誤差.列的聲明語法是DECIMAL(M,D).

    M是數字的最大位數(精度).其范圍為1~65,M的默認值是10.D是小數點右側數字的數目(標度).其范圍是0~30.但不得超過M.

    比如DECIMAL(6,2)最多存6位數字,小數點后占兩位,取值范圍-9999.99到9999.99

  比特類型指0,1值表達2兩情況,如真,假

字符串類型:

    CHAR和VARCHAR類型

    BLOB和TEXT類型

    ENUM類型和SET類型

  • char 和 varchar

  char:定長,效率高,一般用於固定長度的表單提交數據存儲,默認1字符

  varchar: 不定長,效率偏低,但是節省空間.

  • text 和 blob

  text: 存儲非二進制文本

  blob: 存儲二進制字節串

  • enum 和 set

  enum: 存儲給出的一個值

  set: 存儲給出的值中一個或多個

表的基本操作

創建表(指定字符集)

 create table 表名( 字段名 數據類型, 字段名 數據類型, ...... 字段名 數據類型 );  

  • 如果你想設置數字為無符號則加上unsigned
  • 如果你不想字段為NULL可以設置字段的屬性為NOT NULL,在操作數據庫時如果輸入該字段的數據為NULL,就會報錯.
  • DEFAULT表示設置一個字段的默認值
  • AUTO_INCREMENT定義雷威自增的屬性,一般用於主鍵,數值會自動加1.
  • PRIMARY KEY關鍵字用於定義列為主鍵.主鍵的值不能重復. 

創建班級表,代碼如下:

create table class_1 (id int primary key auto_increment,name varchar(32)not null,age int unsigned not null,sex enum('w','m'),score float default 0.0);

創建興趣班表,代碼如下:

create table interest(id int primary key auto_increment,name varchar(32) not null,hobby set('sing','dance','draw'),level char not null,price decimal(6,2),comment text);
View Code

查看數據表

 show tables; 

查看已有表的字符集

 show create table 表名; 

查看表結構

 desc 表名; 

刪除表

 drop table 表名; 

數據基本操作

插入(insert)

 insert into 表名 values(值1),(值2),......; 

 insert into 表名(字段1,...)values(值1),...; 

實例如下:

 

insert into class_1(2,'Baron',10,'m',91),(3,'Jame',9,'m',90);

 

查詢(select)

查詢表名內所有字段的信息

 select * from 表名 [where 條件]; 

只查詢 選定字段名信息

 select 字段名1,字段名2 from 表名 [where 條件]; 

實例如下:

select * from class_1;
select name,age from class_1;

where子句

where子句在sql語句中扮演了重要角色,主要通過一定的運算條件進行數據的篩選

MySQL主要有一下幾種運算符:

  算數運算符

  比較運算符

  邏輯運算符

  位運算符

算數運算符

實例如下:

select * from class_1 where age % 2 = 0;

比較運算符

實例如下:

select * from class_1 where age > 8;
select * from class_1 where between 8 and 10;
select * from class_1 where age in(8,9);

邏輯運算符

select * from class_1 where sex='m' and age > 9;

位運算符

運算符優先級順序  ! ...  >  ... :=

更新記錄表(update)

  update 表名 set 字段1=值1,字段2=值2,... where 條件; 

實例如下:

update class_1 set age=11 where name='Abby';

刪除表記錄(delete)

 delete from 表名 where 條件; 

注意:delete語句后如果不加where條件,所有記錄全部清空 

實例如下:

delete from class_1 where name='Abby';

表字段的操作(alter)

 語法 :alter table 表名 執行動作; 

  • 添加字段(add)

 alter table 表名 add 字段名 數據類型;

 alter table 表名 add 字段名 數據類型 first; 

 alter table 表名 add 字段名 數據類型 after 字段名; 

  • 刪除字段(drop)

  alter table 表名 drop 字段名; 

  • 修改數據類型(modify)

  alter table 表名 modify 字段名 新數據類型; 

  •  修改字段名(change)

  alter table 表名 change 舊字段名 新字段名 新數據類型; 

  •  表重命名(raname)

 alter table 表名 rename 新表名; 

 使用(after)添加字段:

alter table interest add tel char(11) after name;

時間類型數據

時間和日期類型:

  DATE,DATETIME和TIMESTAMP類型 

  TIME類型

  年份類型YEAR

時間格式

  date :"YYYY-MM-DD"

  time:"HH:MM:SS"  

   datetime:"YYYY-MM-DD HH:MM:SS"

  timestamp:"YYYY-MM-DD HH:MM:SS"

  注意:

  1.   datetime:以系統時間存儲
  2.   timestamp:以標准時間存儲但是查看時轉換為系統市區,所以表現形式和datetime相同

實例如下:

create table marathon (id int primary key auto_increment,athlete varchar(32),birthday 
date,registration_time datetime,performance time);

日期時間函數

  • now()返回服務器當前時間,格式對應datetime類型
  • curdate()返回當前日期,格式對應date類型
  • curtime()返回當前時間,格式對應time類型 

時間操作

  • 查找操作 
select * from marathon where birthday>='2000-01-01';
select * from marathon where birthday>="2000-07-01" and performance<="2:30:00";

日期時間運算

語法格式:

 select * from 表名 where 字段名 運算符 (時間-interval 時間間隔單位); 

 時間間隔單位: 2 hour | 1 minute | 2 second | 2 year | 3 month | 1 day

實例如下:

select * from marathon where registration_time > (now()-interval 7 day);

得到指定的時間

time('2:30:00')    

得到指定日期

date('2019-11-11')

主要用於時間運算

select * from marathon where performance < (time('2:30:00') + interval 10 minute);

高級查詢語句

模糊查詢和正則查詢

LIKE用於在where子句中進行模糊查詢,SQL LIKE 子句中使用百分號 %來表示任意0個或多個字符,下划線_表示任意一個字符。 

使用 LIKE 子句從數據表中讀取數據的通用語法:

 SELECT field1, field2,...fieldN

FROM table_name

WHERE field1 LIKE condition1  

實例如下:

mysql> select * from class_1 where name like 'A%';

mysql中對正則表達式的支持有限,只支持部分正則元字符

  SELECT field1, field2,...fieldN

FROM table_name

WHERE field1 REGEXP condition1 

 實例如下:

select * from class_1 where name regexp '^B.+';

排序

 ORDER BY 子句來設定你想按哪個字段哪種方式來進行排序,再返回搜索結果。

使用 ORDER BY 子句將查詢數據排序后再返回數據: 

 SELECT field1, field2,...fieldN from table_name1 where field1 ORDER BY field1 [ASC [DESC]] 

 默認情況ASC表示升序,DESC表示降序

select * from class_1 where sex='m' order by age;

分頁(限制)

LIMIT 子句用於限制由 SELECT 語句返回的數據數量 或者 UPDATE,DELETE語句的操作數量

帶有 LIMIT 子句的 SELECT 語句的基本語法如下:

 SELECT column1, column2, columnN

FROM table_name

WHERE field LIMIT [num] 

聯合查詢

UNION 操作符用於連接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重復的數據。

UNION 操作符語法格式:

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
  • expression1, expression2, ... expression_n: 要檢索的列。
  • tables: 要檢索的數據表。
  • WHERE conditions: 可選, 檢索條件。
  • DISTINCT: 可選,刪除結果集中重復的數據。默認情況下 UNION 操作符已經刪除了重復數據,所以 DISTINCT 修飾符對結果沒啥影響。
  • ALL: 可選,返回所有結果集,包含重復數據。

實例如下:

select * from class_1 where sex='m' UNION ALL select * from class_1 where age > 9;

數據備份

備份命令格式

mysqldump -u用戶名 -p 源庫名 > ~/stu.sql

--all-databases 備份所有庫

庫名 備份單個庫

-B 庫1 庫2 庫3 備份多個庫

庫名 表1 表2 表3 備份指定庫的多張表

恢復命令格式

mysql -uroot -p 目標庫名 < stu.sql

從所有庫備份中恢復某一個庫(--one-database)

mysql -uroot -p --one-database 目標庫名 < all.sql

Python操作MySQL數據庫

pymysql安裝

sudo pip3 install pymysql

pymysql使用流程

 

  1. 建立數據庫連接(db = pymysql.connect(...))

  2. 創建游標對象(cur = db.cursor())

  3. 游標方法: cur.execute("insert ....")

  4. 提交到數據庫或者獲取數據 : db.commit()/db.fetchall()

  5. 關閉游標對象 :cur.close()

  6. 斷開數據庫連接 :db.close()

常用函數

db = pymysql.connect(參數列表)

 host :主機地址,本地 localhost

port :端口號,默認3306

user :用戶名

password :密碼

database :庫

charset :編碼方式,推薦使用 utf8 

數據庫連接對象(db)的方法

cur = db.cursor() 返回游標對象,用於執行具體SQL命令

db.commit() 提交到數據庫執行

db.rollback() 回滾,用於當commit()出錯是回復到原來的數據形態

db.close() 關閉連接

pymysql 數據庫操作流程實現

import pymysql

# 連接數據庫
db = pymysql.connect(host='localhost',
                     port=3306,
                     user='root',
                     password = '123456',
                     database = 'stu',
                     charset='utf8')

# 創建游標 (操作數據庫語句,獲取查詢結果)
cur = db.cursor()

# 數據庫操作
cur.execute("insert into class_1 \
values (6,'Levi',11,'m',98);")

# 向數據庫提交 (可以多次execute一次提交,只有寫操作需要)
db.commit()

# 關閉游標和數據庫
cur.close()
db.close()

 

游標對象(cur)的方法

cur.execute(sql命令,[列表]) 執行SQL命令
cur.fetchone() 獲取查詢結果集的第一條數據,查找到返回一個元組否則返回None
cur.fetchmany(n) 獲取前n條查找到的記錄,返回結果為元組嵌套元組, ((記錄1),(記錄2))。
cur.fetchall() 獲取所有查找到的記錄,返回結果形式同上。
cur.close() 關閉游標對象

數據庫讀操作示例

import pymysql

# 連接數據庫
db = pymysql.connect(host='localhost',
                     port=3306,
                     user='root',
                     password = '123456',
                     database = 'stu',
                     charset='utf8')

# 創建游標 (操作數據庫語句,獲取查詢結果)
cur = db.cursor()

# 數據庫操作
sql="select name,age from class_1 where sex='m';"
cur.execute(sql)

# 獲取查詢結果
one_row = cur.fetchone()
print(one_row) # 元組

many_row = cur.fetchmany(3)
print(many_row) # 元組套元組

all_row = cur.fetchall()
print(all_row) # 元組套元組

# 關閉游標和數據庫
cur.close()
db.close()

數據庫寫操作示例

import pymysql

# 連接數據庫
db = pymysql.connect(host='localhost',
                     port=3306,
                     user='root',
                     password = '123456',
                     database = 'stu',
                     charset='utf8')

# 創建游標 (操作數據庫語句,獲取查詢結果)
cur = db.cursor()

# 數據庫操作
try:
    # 具體寫操作
    # name = input("Name:")
    # age = input("Age:")
    # sex = input("Sex:")
    # score = input("Score:")

    # 直接構建sql語句
    # sql="insert into class_1 (name,age,sex,score) \
    # values ('%s',%s,'%s',%s)"%(name,age,sex,score)
    # cur.execute(sql)

    # 通過execute第二個參數列表構建sql語句
    # sql = "insert into class_1 (name,age,sex,score) \
    #  values (%s,%s,%s,%s)"
    # cur.execute(sql,[name,age,sex,score])

    # 修改操作
    # sql = "update interest set price=12800 " \
    #       "where name='Tom'"
    # cur.execute(sql)

    # 刪除操作
    sql = "delete from class_1 where score < 80"
    cur.execute(sql)

    db.commit()
except Exception as e:
    db.rollback() # 如果提交異常則回到提交前的狀態
    print(e)

# 關閉游標和數據庫
cur.close()
db.close()

 

二進制文件存儲到數據庫

  1. 存儲文件的所在路徑 "/home/tarena/......"
  2. 存儲文件本身

圖片存儲以及提取代碼實現:

import pymysql

# 連接數據庫
db = pymysql.connect(host='localhost',
                     port=3306,
                     user='root',
                     password = '123456',
                     database = 'stu',
                     charset='utf8')

# 創建游標 (操作數據庫語句,獲取查詢結果)
cur = db.cursor()

# 存儲圖片
# with open('timg.jpeg','rb') as f:
#     data = f.read()
#
# try:
#     sql = "insert into images values (1,'jd',%s)"
#     cur.execute(sql,[data])
#     db.commit()
# except:
#     db.rollback()

# 提取圖片
sql = "select image from images where filename='jd'"
cur.execute(sql)
data = cur.fetchone()
with open('jd.jpeg','wb') as f:
    f.write(data[0])

# 關閉游標和數據庫
cur.close()
db.close()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM