資料庫之MySQL的基本使用

来源:https://www.cnblogs.com/yifchan/archive/2019/07/05/sql-1-1.html
-Advertisement-
Play Games

資料庫之MySQL的基本使用,內容包括 資料庫簡介,MySQL安裝,數據完整性,命令行腳本。其中,資料庫簡介包括 資料庫,RDBMS,RDBMS和資料庫的關係,SQL,MySQL 簡介;資料庫安裝包括 伺服器端安裝和客戶端安裝;數據完整性包括 數據類型,約束;命令行腳本包括 資料庫的操作,數據表的操... ...


資料庫簡介

資料庫

資料庫就是一種特殊的文件,其中存儲著需要的數據;
關係型資料庫核心元素:

  • 數據行(記錄)
  • 數據列(欄位)
  • 數據表(數據行的集合)
  • 資料庫(數據表的集合)

一個表中:
一列--->一個欄位
一行--->一條記錄

欄位和記錄組成表;
幾個表組成一個資料庫;

一個大的系統可能有幾個資料庫,而幾個資料庫裡面有很多表;

 

Ubuntu進入資料庫:

  • 1.sudo -s;
  • 2.cd /var/lib/mysql;
  • 3.ls -h;
  • 4.cd 資料庫名;
  • 5.ls

 

RDBMS

Relational Database Management System

通過表來表示關係型

當前主要使用兩種類型的資料庫:關係型資料庫、非關係型資料庫,本部分主要討論關係型資料庫,對於非關係型資料庫會在後面學習;

所謂的關係型資料庫RDBMS,是建立在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的數據;

查看資料庫排名:https://db-engines.com/en/ranking

 

關係型資料庫的主要產品:

  • oracle:在以前的大型項目中使用,銀行,電信等項目
  • mysql:web時代使用最廣泛的關係型資料庫
  • ms sql server:在微軟的項目中使用
  • sqlite:輕量級資料庫,主要應用在移動平臺

 

python中常用的資料庫:

  • mysql,關係型資料庫,一般用來做網站,
  • redis一般用來做緩存,
  • MongoDB,非關係型資料庫,一般做爬蟲,用來存儲非關係型數據;

 

RDBMS和資料庫的關係

因為RDBMS和資料庫的關係,所以我們只需要關心在資料庫客戶端通過SQL語句操作資料庫服務端的資料庫表即可;

 

SQL

Structured Query Language

SQL是結構化查詢語言,是一種用來操作RDBMS的資料庫語言,當前關係型資料庫都支持使用SQL語言進行操作,也就是說可以通過 SQL 操作 oracle,sql server,mysql,sqlite 等等所有的關係型的資料庫。

SQL語句主要分為:

  • DQL:數據查詢語言,用於對數據進行查詢,如select
  • DML:數據操作語言,對數據進行增加、修改、刪除,如insert、udpate、delete
  • TPL:事務處理語言,對事務進行處理,包括begin transaction、commit、rollback
  • DCL:數據控制語言,進行授權與許可權回收,如grant、revoke
  • DDL:數據定義語言,進行資料庫、表的管理等,如create、drop
  • CCL:指針控制語言,通過控制指針完成表的操作,如declare cursor

對於web程式員來講,重點是數據的crud(增刪改查),必須熟練編寫DQL、DML,能夠編寫DDL完成資料庫、表的操作,其它語言如TPL、DCL、CCL瞭解即可;
SQL 是一門特殊的語言,專門用來操作關係資料庫;
不區分大小寫;


學習要求
熟練掌握數據增刪改查相關的 SQL 語句編寫
在 Python代碼中操作數據就是通過 SQL 語句來操作數據

# 創建Connection連接
conn = connect(host='localhost', port=3306, user='root', password='mysql', database='python1', charset='utf8')
# 得Cursor對象
cs = conn.cursor()
# 更新
# sql = 'update students set name="劉邦" where id=6'
# 刪除
# sql = 'delete from students where id=6'
# 執行select語句,並返回受影響的行數:查詢一條學生數據
sql = 'select id,name from students where id = 7'
# sql = 'SELECT id,name FROM students WHERE id = 7'
count=cs.execute(sql)
# 列印受影響的行數
print(count)

 

MySQL 簡介

MySQL官方網站:http://www.mysql.com

MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB公司開發,後來被Sun公司收購,Sun公司後來又被Oracle公司收購,目前屬於Oracle旗下產品

 

特點

  • 使用C和C++編寫,並使用了多種編譯器進行測試,保證源代碼的可移植性
  • 支持多種操作系統,如Linux、Windows、AIX、FreeBSD、HP-UX、MacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris等
  • 為多種編程語言提供了API,如C、C++、Python、Java、Perl、PHP、Eiffel、Ruby等
  • 支持多線程,充分利用CPU資源
  • 優化的SQL查詢演算法,有效地提高查詢速度
  • 提供多語言支持,常見的編碼如GB2312、BIG5、UTF8
  • 提供TCP/IP、ODBC和JDBC等多種資料庫連接途徑
  • 提供用於管理、檢查、優化資料庫操作的管理工具
  • 大型的資料庫。可以處理擁有上千萬條記錄的大型資料庫
  • 支持多種存儲引擎
  • MySQL 軟體採用了雙授權政策,它分為社區版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇MySQL作為網站資料庫
  • MySQL使用標準的SQL數據語言形式
  • Mysql是可以定製的,採用了GPL協議,你可以修改源碼來開發自己的Mysql系統
  • 線上DDL更改功能
  • 複製全局事務標識
  • 複製無崩潰從機
  • 複製多線程從機

開源 免費 不要錢 使用範圍廣,跨平臺支持性好,提供了多種語言調用的 API;

是學習資料庫開發的首選;

 

MySQL安裝

伺服器端安裝

  • 安裝伺服器端:在終端中輸入如下命令,回車後,然後按照提示輸入
sudo apt-get install mysql-server
  • 伺服器用於接收客戶端的請求、執行sql語句、管理資料庫
  • 伺服器端一般以服務方式管理,名稱為mysql
  • 啟動服務
sudo service mysql start

查看進程中是否存在mysql服務

ps ajx|grep mysql

停止服務

sudo service mysql stop

重啟服務

sudo service mysql restart

 

配置
配置文件目錄為/etc/mysql/mysql.cnf

進入conf.d目錄,打開mysql.cnf,發現並沒有配置

進入mysql.conf.d目錄,打開mysql.cnf,可以看到配置項

主要配置項如下

bind-address表示伺服器綁定的ip,預設為127.0.0.1

port表示埠,預設為3306

datadir表示資料庫目錄,預設為/var/lib/mysql

general_log_file表示普通日誌,預設為/var/log/mysql/mysql.log

log_error表示錯誤日誌,預設為/var/log/mysql/error.log

 

客戶端安裝

客戶端為開發人員與dba使用,通過socket方式與服務端通信,常用的有navicat、命令行mysql

圖形化界面客戶端navicat

可以到Navicat官網下載
將壓縮文件拷貝到ubuntu虛擬機中,放到桌面上,解壓

tar zxvf navicat112_mysql_cs_x64.tar.gz

進入解壓的目錄,運行如下命令

./start_navicat

點兩次取消後,點擊“試用”按鈕;

問題一:中文亂碼

解決:打開start_navicat文件

將export LANG="en_US.UTF-8"改為export LANG="zh_CN.UTF-8"

問題二:試用期
解決:刪除用戶目錄下的.navicat64目錄

cd ~
rm -r .navicat64

 

命令行客戶端

在終端運行如下命令,按提示填寫信息

sudo apt-get install mysql-client

詳細連接的命令可以查看幫助文檔

mysql --help

最基本的連接命令如下,輸入後回車

mysql -uroot -proot
# u後面的是用戶名,p後面的是密碼;

連接成功。

按ctrl+d或輸入如下命令退出

quit 或者 exit

 

數據完整性

  • 一個資料庫就是一個完整的業務單元,可以包含多張表,數據被存儲在表中
  • 在表中為了更加準確的存儲數據,保證數據的正確有效,可以在創建表的時候,為表添加一些強制性的驗證,包括數據欄位的類型、約束

數據類型

可以通過查看幫助文檔查閱所有支持的數據類型

使用數據類型的原則是:夠用就行,儘量使用取值範圍小的,而不用大的,這樣可以更多的節省存儲空間

常用數據類型如下:

  • 整數:int,bit
  • 小數:decimal
  • 字元串:varchar,char
  • 日期時間: date, time, datetime
  • 枚舉類型(enum)

特別說明的類型如下:

  • decimal表示浮點數,如decimal(5,2)表示共存5位數,小數占2位
  • char表示固定長度的字元串,如char(3),如果填充'ab'時會補一個空格為'ab '
  • varchar表示可變長度的字元串,如varchar(3),填充'ab'時就會存儲'ab'
  • 字元串text表示存儲大文本,當字元大於4000時推薦使用
  • 對於圖片、音頻、視頻等文件,不存儲在資料庫中,而是上傳到某個伺服器上,然後在表中存儲這個文件的保存路徑

更全的數據類型可以參考 http://blog.csdn.net/anxpp/article/details/51284106

約束

  • 主鍵primary key:物理上存儲的順序
  • 非空not null:此欄位不允許填寫空值
  • 惟一unique:此欄位的值不允許重覆
  • 預設default:當不填寫此值時會使用預設值,如果填寫時以填寫為準
  • 外鍵foreign key:對關係欄位進行約束,當為關係欄位填寫值時,會到關聯的表中查詢此值是否存在,如果存在則填寫成功,如果不存在則填寫失敗並拋出異常
  • 說明:雖然外鍵約束可以保證數據的有效性,但是在進行數據的crud(增加、修改、刪除、查詢)時,都會降低資料庫的性能,所以不推薦使用,那麼數據的有效性怎麼保證呢?答:可以在邏輯層進行控制

數值類型(常用)

類型 位元組大小 有符號範圍(Signed) 無符號範圍(Unsigned)
TINYINT 1 -128 ~ 127 0 ~ 255
SMALLINT 2 -32768 ~ 32767 0 ~ 65535
MEDIUMINT 3 -8388608 ~ 8388607 0 ~ 16777215
INT/INTEGER 4 -2147483648 ~2147483647 0 ~ 4294967295
BIGINT 8 -9223372036854775808 ~ 9223372036854775807 0 ~ 18446744073709551615

 

   
字元串

類型  位元組大小  示例
CHAR  0-255 類型:char(3) 輸入 'ab', 實際存儲為'ab ', 輸入'abcd' 實際存儲為 'abc'
VARCHAR  0-255 類型:varchar(3) 輸 'ab',實際存儲為'ab', 輸入'abcd',實際存儲為'abc'
TEXT  0-65535  大文本


日期時間類型

類型  位元組大小  示例
DATE  4  '2020-01-01'
TIME  3  '12:29:59'
DATETIME  8  '2020-01-01 12:29:59'
YEAR  1  '2017'
TIMESTAMP  4  '1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC

 

 

命令行腳本

資料庫的操作

sql語句最後需要有分號;結尾

鏈接資料庫

mysql -uroot -p
mysql -uroot -pmysql

退出資料庫

exit/quit/ctrl+d

 

查看所有資料庫

show databases;

創建資料庫

create database 資料庫名 charset=utf8;

示例:
create database python04;
create database python05 charset=utf8;

使用資料庫

use 資料庫的名字

示例:
use python05;

刪除資料庫

drop database 資料庫名;

示例:
drop database python04;

 

查看創建資料庫的語句

show crate database databasename;

示例:
show create database python04;

查看當前使用的資料庫

select database();

顯示資料庫版本

select version();

顯示時間

select now();

 

數據表的操作

查看當前資料庫中所有表

show tables;

創建表

  • auto_increment表示自動增長
  • not null 表示不能為空
  • primary key 表示主鍵
  • default 預設值
create table 數據表名字 (欄位 類型 約束[, 欄位 類型 約束]);

示例:
create table xxxxx(id int, name varchar(30));
create table yyyyy(id int primary key not null auto_increment, name varchar(30));
create table zzzzz(
  id int primary key not null auto_increment,
  name varchar(30)
);

創建students表(id、name、age、high、gender、cls_id)

create table students(
  id int unsigned not null auto_increment primary key,
  name varchar(30),
  age tinyint unsigned default 0,
  high decimal(5,2),
  gender enum("", "", "中性", "保密") default "保密",
  cls_id int unsigned default 0

);

創建classes表(id、name)

create table classes(
  id int unsigned not null auto_increment primary key,
  name varchar(30)
);

 

修改表-添加欄位

alter table 表名 add 列名 類型;
例:
alter table students add birthday datetime;

修改表-修改欄位:重命名版

alter table 表名 change 原名 新名 類型及約束;
例:
alter table students change birthday birth datetime not null;

修改表-修改欄位:不重命名版

alter table 表名 modify 列名 類型及約束;
例:
alter table students modify birth date not null;

修改表-刪除欄位

alter table 表名 drop 列名;
例:
alter table students drop birthday;

刪除表

drop table 表名;
例:
drop table students;

查看表結構

desc 表名;

查看表的創建語句

show create table 表名;
例:
show create table classes;

 

 

增刪改查(curd)

curd的解釋: 代表創建(Create)、更新(Update)、讀取(Retrieve)和刪除(Delete)

查詢基本使用

查詢所有列

select * from 表名;
例:
select * from classes;

查詢指定列
可以使用as為列或表指定別名

select 列1,列2,... from 表名;
例:
select id,name from classes;

 

增加

格式:

INSERT [INTO] tb_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

說明:主鍵列是自動增長,但是在全列插入時需要占位,通常使用0或者 default 或者 null 來占位,插入成功後以實際數據為準
全列插入:值的順序與表中欄位的順序對應

insert into 表名 values(...)
例:
insert into students values(0,’郭靖‘,1,'蒙古','2016-1-2');

部分列插入:值的順序與給出的列順序對應

insert into 表名(列1,...) values(值1,...)
例:
insert into students(name,hometown,birthday) values('黃蓉','桃花島','2016-3-2');

上面的語句一次可以向表中插入一行數據,還可以一次性插入多行數據,這樣可以減少與資料庫的通信
全列多行插入:值的順序與給出的列順序對應

insert into 表名 values(...),(...)...;
例:
insert into classes values(0,'python1'),(0,'python2');
insert into 表名(列1,...) values(值1,...),(值1,...)...;
例:
insert into students(name) values('楊康'),('楊過'),('小龍女');

 

修改

格式:

 UPDATE tbname SET col1={expr1|DEFAULT} [,col2={expr2|default}]...[where 條件判斷]

 

update 表名 set 列1=值1,列2=值2... where 條件
例:
update students set gender=0,hometown='北京' where id=5;

 

刪除

DELETE FROM tbname [where 條件判斷]

 

delete from 表名 where 條件
例:
delete from students where id=5;

邏輯刪除,本質就是修改操作

update students set isdelete=1 where id=1;

 

增刪改查示例

-- 增刪改查(curd)

    -- 增加
        -- 全列插入
        -- insert [into] 表名 values(...)
        -- 主鍵欄位 可以用 0  null   default 來占位
        -- 向classes表中插入 一個班級
        insert into classes values(0, "菜鳥班");


        +--------+-------------------------------------+------+-----+------------+----------------+
        | Field  | Type                                | Null | Key | Default    | Extra          |
        +--------+-------------------------------------+------+-----+------------+----------------+
        | id     | int(10) unsigned                    | NO   | PRI | NULL       | auto_increment |
        | name   | varchar(30)                         | YES  |     | NULL       |                |
        | age    | tinyint(3) unsigned                 | YES  |     | 0          |                |
        | gender | enum('','','中性','保密')       | YES  |     | 保密       |                |
        | cls_id | int(10) unsigned                    | YES  |     | NULL       |                |
        | birth  | date                                | YES  |     | 2000-01-01 |                |
        +--------+-------------------------------------+------+-----+------------+----------------+

        -- 向students表插入 一個學生信息
        insert into students values(0, "小李飛刀", 20, "", 1, "1990-01-01");
        insert into students values(null, "小李飛刀", 20, "", 1, "1990-01-01");
        insert into students values(default, "小李飛刀", 20, "", 1, "1990-01-01");

        -- 失敗
        -- insert into students values(default, "小李飛刀", 20, "第4性別", 1, "1990-02-01");

        -- 枚舉中 的 下標從1 開始 1---“男” 2--->""....
        insert into students values(default, "小李飛刀", 20, 1, 1, "1990-02-01");

        -- 部分插入
        -- insert into 表名(列1,...) values(值1,...)
        insert into students (name, gender) values ("小喬", 2);


        -- 多行插入
        insert into students (name, gender) values ("大喬", 2),("貂蟬", 2);
        insert into students values(default, "西施", 20, "", 1, "1990-01-01"), (default, "王昭君", 20, "", 1, "1990-01-01");


    -- 修改
    -- update 表名 set 列1=值1,列2=值2... where 條件;
        update students set gender=1; -- 全部都改
        update students set gender=1 where name="小李飛刀"; -- 只要name是小李飛刀的 全部的修改
        update students set gender=1 where id=3; -- 只要id為3的 進行修改
        update students set age=22, gender=1 where id=3; -- 只要id為3的 進行修改
    
    -- 查詢基本使用
        -- 查詢所有列
        -- select * from 表名;
        select * from students;

        ---定條件查詢
        select * from students where name="小李飛刀"; -- 查詢 name為小李飛刀的所有信息
        select * from students where id>3; -- 查詢 name為小李飛刀的所有信息


        -- 查詢指定列
        -- select 列1,列2,... from 表名;
        select name,gender from students;


        -- 可以使用as為列或表指定別名
        -- select 欄位[as 別名] , 欄位[as 別名] from 數據表 where ....;
        select name as 姓名,gender as 性別 from students;


        -- 欄位的順序
        select id as 序號, gender as 性別, name as 姓名 from students;
    

    -- 刪除
        -- 物理刪除
        -- delete from 表名 where 條件
        delete from students; -- 整個數據表中的所有數據全部刪除
        delete from students where name="小李飛刀";

        -- 邏輯刪除
        -- 用一個欄位來表示 這條信息是否已經不能再使用了
        -- 給students表添加一個is_delete欄位 bit 類型
        alter table students add is_delete bit default 0;
        update students set is_delete=1 where id=6;
增刪改查示例

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關閉防火牆,依次執行以下五條命令 service firewalld stop chkconfig iptables off iptables -L iptables -F service iptables stop ...
  • Nginx是一款高性能免費開源網頁伺服器,也可用於反向代理和負載均衡伺服器。該軟體由伊戈爾·賽索耶夫於2004年發佈,2019年3月11日,Nginx被F5 Networks以6.7億美元收購。2019年最新統計中,全球大約有32.97%的伺服器使用Nginx。 1. 安裝相關組件 2. 編譯安裝N ...
  • 原文鏈接:https://www.cnblogs.com/qmfsun/p/4598650.html date "+今天是%Y-%d-%m,現在是%H:%M:%S" 1. 顯示時間date命令可以按照指定格式顯示日期,只鍵入date則以預設格式顯示當前時間。如下: 如果需要以指定的格式顯示日期,可以 ...
  • 下圖1為 Linux 性能優化排查工具的總結 診斷 CPU 工具 查看 CPU 核數 總核數 = 物理CPU個數 X 每顆物理CPU的核數 總邏輯CPU數 = 物理CPU個數 X 每顆物理CPU的核數 X 超線程數 查看物理CPU個數 cat /proc/cpuinfo| grep "physica ...
  • 1. 前言 emmm….最近學習大數據,需要搭建Hadoop框架,當弄好linux系統之後,第一件事就是SSH免密登錄的設置。對於SSH,我覺得使用過linux系統的程式員應該並不陌生。可是吧,用起來簡單,真讓你說出個所以然,還是件比較困難的事(大佬繞路,此篇文章不屬於你~)。然後,我就好奇心大發, ...
  • 1、原系統的備份 避免重裝遇到故障無法恢復,給自己留一條後路。 重裝系統之前首先進行一次系統備份,我使用的備份軟體是dism++,這個軟體還可以完成其他的諸如空間回收、系統優化等操作; 軟體地址:https://www.chuyu.me/zh-Hans/ 2、重裝之後,軟體的安裝 首先安裝輸入法,微 ...
  • 一.LNMP介紹 1.使前端web服務和後端存儲服務進行串聯 2.主要實現處理php動態請求 工作原理: L:linux N:nginx M:mysql P:php 二、lnmp部署 我的環境:centos6.9+nginx+mysql5.6+php5 文件存儲系統NFS 1.部署安裝linux系統 ...
  • --根據員工號或員工姓名獲取員工的信息--根據員工號或員工姓名刪除員工的信息--創建包規範CREATE OR REPLACE PACKAGE overload_pkgIS FUNCTION get_info(eno NUMBER) RETURN emp%ROWTYPE; FUNCTION get_i ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...