MYSQL數據庫基礎用法

數據庫概述

數據存儲階段

  • 人工管理階段

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

  • 文件管理階段

優勢:數據能夠長期保存,能夠存儲大量的數據,使用簡單正則表達式

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

  • 數據庫管理階段

優勢:數據阻止結構化下降了冗餘度,提升了增刪改查的效率,容易擴展,方便程序調用,作自動化處理數據庫

缺點:須要使用sql 或者 其餘特定的語句,相對比較複雜express

數據庫應用

融機構,遊戲網站,購物網站,論壇網站......編程

基礎感念

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

  數據結構:研究一個數據集合中數據之間關係的服務器

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

  數據庫管理系統:管理數據庫的軟件,用於創建和維護數據庫編程語言

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

數據庫分類和常見數據庫

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

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

  非關係型:不採用關係模型組織數據結構的數據庫

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

  開源: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()
相關文章
相關標籤/搜索