MySQL數據庫的特色:
一、是關係型數據庫
關係型數據庫的特色
一、數據是以行和列的的形式存儲的
二、這一系列的行和列稱爲表
三、表中的每一行叫作記錄
四、表中的每一列叫作字段
五、表和表之間的邏輯關聯叫作關係
六、關係型數據庫的核心內容是:關係 即二維表
示例:
一、關係型數據庫存儲
表1:學生信息表
姓名 年齡 班級
aa 20 1712
bb 25 1713
表2:班級信息表
班級 班主任
1712 曹操
1713 劉備
說明:要找到學生aa的班主任是誰,須要經過班級字段來找到班主任
二、非關係型數據庫存儲(是以鍵值對的形式存儲的)
{姓名:「aa」,年齡:20,班級:1712,班主任:「曹操」}
兩者之間的比較:
非關係行數據的性能比較高(查找數據的速度)可是會形成數據的冗餘
二、跨平臺
能夠在Unix、Linux、Windows上運行MySQL服務
三、支持多種語言編程語言
四、是基於硬盤的讀寫
MySQL的安裝:
一、Linux系統下安裝MySQL服務
一、安裝服務端:sudo apt-get install mysql-server
二、安裝客戶端:sudo apt-get install mysql-client
三、初始的用戶名和密碼在/etc/mysql/debian.cnf文件中,使用 cd /etc/mysql/ 進去目錄,subl debian.cnf 打開查看
啓動和鏈接MySQL服務
一、服務端啓動
一、查看MySQL服務的狀態:sudo /etc/init.d/mysql status
二、啓動MySQL服務:sudo /etc/init.d/mysql start
三、中止MySQL服務:sudo /etc/init.d/mysql stop
四、重啓MySQL服務:sudo /etc/init.d/mysql restart
二、客戶端連接
一、命令格式:mysql -h主機名 -u用戶名 -p密碼(-h和-u後面能夠添加空格,-p後面不能夠)
mysql -h localhost -u debian-sys-maint -pLo0r79JmxvMFNtA
二、本地鏈接能夠省略 -h 選項
mysql -u debian-sys-maint -pLo0r79JmxvMFNtA
三、斷開與服務端的鏈接:exit quit \q
基本的SQL命令:
一、SQL命令的使用規則
一、每條命令必須以分號(;)結尾(說明中文分號無效)
二、SQL命令不區分字母大小寫
三、使用\c終止命令的執行
二、庫的管理(指定字符集)
一、庫的基本操做
一、查看已有的庫:show databases;
(有四個默認的庫,不要修改或刪除:information_schema,mysql,performance_schema,sys)
二、建立庫:create database 庫名 default charset=utf8;
三、查看建立庫的語句:show create database 庫名;
( CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */)
四、查看當前所在庫:select database();
五、切換庫:use 庫名;
六、查看庫中已有的表:show tables;(若是當前的庫爲NULL則會報錯:ERROR 1046 (3D000): No database selected)
七、刪除庫:drop database 庫名;
二、庫的命名規則
一、可使用數字、字母、_,可是不能是純數字
二、庫名區分字母大小寫
三、庫名具備惟一性(不能重複)
四、不能使用特殊字符和mysql關鍵字
三、表的管理:
一、表的基本操做:
一、建立表:
create table 表名(
字段名1 數據類型,
字段名2 數據類型,
....
)
二、查看建立表的語句(字符集):show create table 表名;
三、查看錶結構:desc 表名;
四、刪除表:drop table 表名;
二、注意:
一、全部的數據都是以文件的形式存儲在數據庫目錄下
二、數據庫目錄:/var/lib/mysql
四、表記錄的管理:
一、在表中插入記錄
一、insert into 表名 values(值1,值2),... 說明:值就是每一個字段對應的值,python
二、insert into 表名(字段名1,字段名2...)values(值1,值2...)說明:給指定的字段添加值 mysql
三、insert into 表名 values(一條記錄1),(一條記錄2)... 說明:能夠同時添加多條記錄
二、查看錶記錄
一、select * from 表名;*號表明全部的字段
二、select 字段名1,字段名2,... from 表名;linux
三、更新表的記錄
一、update 表名 set 字段=值,字段=值,...where 條件;
二、注意:update語句後若是不加where子句,表中全部記錄該字段的值都會更改
四、刪除表記錄
一、delete from 表名 where 條件1 and 條件2;
二、注意:delete語句後若是不加where子句,表中的全部記錄都會被刪除面試
五、如何更改默認字符集:
一、方法:經過更改Mysql的配置文件實現
二、步驟:
一、獲取root權限:sudo -i
二、修改mysql配置文件:vi /etc/mysql/mysql.conf.d/mysqld.cnf
一、點擊a鍵進入編輯狀態
二、在[mysqld]下 插入character_set_server = utf8
三、點擊Esc鍵退出編輯狀態
四、點擊Shift + :
四、輸入wq命令寫入並退出 (輸入q!退出不保存)
三、重啓mysql服務:sudo /etc/init.d/mysql restartsql
說明:更改默認字符集以後,並不影響以前建立好的數據庫和數據庫中的數據表,要想修改已經建立好的數據庫編碼和數據表的編碼:shell
數據庫:alter database fruit character set utf8;數據庫
數據表:alter table user character set utf8;編程
客戶端把數據存儲到數據庫服務器上的過程(面試會問到)
一、鏈接到數據庫服務器:mysql -h -u -p
二、選擇庫:use 庫名;
三、建立/修改表
四、斷開與數據庫的鏈接:exit 、quit、\q
數據類型:
一、數值類型(有符號signed 和 無符號 unsigned)
一、整型
一、int 大整型(佔4個字節):
取值範圍:0~2**32-1
二、tinyint 微小整型(佔1字節)
一、有符號(signed默認)取值範圍:-128~127
二、無符號(unsigned) 取值範圍:0~2**8-1
三、smallint 小整型(佔2字節)
取值範圍:0~65535
四、bigint 極大整型(佔8字節)
取值範圍:0~2**64-1
二、浮點型
一、float(4個字節,最多顯示7個有效位)
一、用法:字段名 float(m,n) m表明總位數,n表明小數位位數
float(5,2)取值範圍:-999.99~999.99;會根據小數第3位進行四捨五入
說明:m總位數不要超過7位,不然7位以後數字會隨機生成。
二、double(8字節,最多顯示15個有效位)
用法:字段名 double(m,n)
三、decimal(佔M+2個字節,最多顯示28個有效位)
用法:decimal(M,D)bash
說明:浮點型插入整數時會自動補全小數位數;
二、字符類型
一、char(定長)
一、寬度取值範圍:1~255
二、不給寬度默認爲寬度爲1
二、varchar(變長)(輸入要的值不能超過變長值,儲存空間根據實際輸入的數值來肯定)
一、取值範圍:1~65535
二、注意:
一、varchar沒有默認寬度,必須給定一個寬度
二、char和varchar使用時都給寬度,但不能超過各自的範圍
三、char 和 varchar 的特色
一、char浪費存儲空間可是性能高
二、varchar節省存儲空間,性能低(須要計算須要佔用的存儲空間)
四、字符類型的寬度和數值類型的寬度的區別
一、數值類型的寬度爲顯示寬度,只用於select查詢時使用,和佔用存儲空間的大小無關,可用zerofill查看效果
二、字符類型的寬度超過則沒法存儲
三、枚舉類型
一、定義:字段值只能在列舉的範圍內選擇
二、enum 單選(最多有65535個不一樣的值)
字段名 enmu(值1,值2,...)
三、set 多選(最多有64個不一樣的值)
字段名 set(值1,值2,...),插入值的時候每一個值之間用逗號分隔開
四、日期時間類型
一、year: 年 YYYY
二、date:日期 YYYYMMDD
三、time:時間 HHMMSS
四、datetime:日期時間 YYYYMMDDHHMMSS
五、timestamp:時間日期 YYYYMMDDHHMMSS
六、說明:
一、datetime 不給值默認返回NULL
二、timestamp不給值默認返回系統當前時間
表字段的操做:
一、語法:alter table 表名 執行動做
一、添加字段(add):
一、添加到末尾
alter table 表名 add 字段名 數據類型
二、添加到開始
alter table 表名 add 字段名 數據類型 first
三、添加到指定位置
alter table 表名 add 字段名 數據類型 after 已有字段名
二、刪除字段(drop):
alter table 表名 drop 字段名
三、修改數據類型(modify):
alter table 表名 modify 字段名 新的數據類型
四、修改字段名
alter table 表名 change 舊名 新名 數據類型
五、修改表名
alter table 表名 rename 新表名
練習:
一、填空題:
一、MySQL中的數據類型有 數值類型、字符類型、枚舉類型、日期時間類型
二、關係型數據庫的核心內容是 關係 即 二維表
二、簡答題:
一、簡述客戶端把數據存儲到數據庫服務器上的過程
答:
一、鏈接MySQL服務器數
二、選擇庫 use 庫名
三、添加\修改表
四、斷開與數據庫的鏈接 exit | quit | \q
二、char和varchar的區別?各自的特色
答:
一、char(定長),所佔用的內容空間已經由定長決定了,雖然多佔用內存,可是效率高
二、varchar(不定長),所佔用的內控空間由添加字段的數據自己決定,可是須要計算佔用的空間,效率低,省內存
三、操做題:
一、建立一個庫school
create database school;
二、在庫中建立表students來存儲學生信息,字段以下學生(id)要求顯示寬度爲3位,不夠用0填充
姓名(name),年齡(age只能爲正數)、成績(score浮點)、性別(sex單選)、愛好(likes多選)、入學時間(年月日)
use school;
create table students(
id int(3) zerofill,
name char(20),
age tinyint unsigned,
score float(4,1),
sex enum('男','女'),
likes set('打籃球','學習','購物','打遊戲','打仗'),
go_school_time date
)default charset = utf8;
三、查看students的表結構
desc students;
四、在students表中增長一個字段id,加在第一列
alter table students add kid int first;
五、在表中任意插入5條記錄
insert into students values(1,1,'曹操',60,80,'男','打仗,打遊戲',20000912);
insert into students values(2,2,'劉備',50,90,'男','打仗,打遊戲',20000912);
insert into students values(3,3,'關羽',45,70,'男','打仗,打遊戲',20000912);
insert into students values(4,4,'張飛',40,60,'男','打仗,打遊戲',20000912);
insert into students values(5,5,'小喬',20,100,'女','學習,購物',20000912);
六、查看全部學生的姓名、成績、和入學時間
select name,score,go_school_time from students;服務器
名詞介紹
一、DB(Database)
DB就是數據庫,存儲數據庫的倉庫
二、DBMS(Database Management System)
數據庫管理系統
數據庫管理的軟件有MySQL、Oracle....
三、DBS(Database System)
數據庫系統
DBS = DB(存儲)+DBMS(數據庫軟件)+數據庫應用(財務管理系統、人事管理系統)+用戶
where 條件子句(配合查、改、刪操做)
一、語法格式:
select * from 表名 where 條件;
運算符操做(配合查詢、修改、刪除操做)
一、數值比較&字符比較:
一、數值比較運算符:= != > >= < <=
二、字符比較運算符:= !=
三、語法格式:
查詢:select * from 表名 where 字段名 運算符 數字/字符;
修改:update 表名 set 字段名=值,...where 字段名 運算符 數字/字符;
刪除:delete from 表名 where 字段名 運算符 數字/字符;
二、邏輯比較:
一、運算符:
and(多個條件同時知足)
or(多個條件有一個條件知足就能夠)
三、範圍內比較:
一、運算符:between and 、 in 、not in
二、語法格式
字段名 between 值1 and 值2(包括值1和值2)
字段名 in(值1,值2,...)
字段名 not in (值1,值2,...)
四、匹配空、非空
一、空:is null
二、非空:is not null
三、注意:
一、null:空值,必須用is 或者is not 去匹配
二、‘’:空字符串,用 = 或者 != 去匹配
五、模糊比較
一、語法格式:字段名 like 表達式
二、表達式
一、_:匹配單個字符
二、%:匹配0到多個字符,不能是NULL
SQL查詢:
一、總結(執行順序)
完整的語句:select ...聚合函數 from ... where ... group by...having ... order by ...limit...;
上面語句的執行順序:一、where 二、group by 三、select...聚合函數 from 四、having 五、order by 六、limit
二、order by
一、做用:對查詢的結果進行排序
二、語法格式:order by 字段名 排序方式;
三、排序方式:
一、ASC(默認):升序
二、DESC:降序
三、說明:這個排序方式不區分大小寫(asc,desc)
三、limit (永遠放在SQL語句的最後面)
一、做用:限制顯示查詢記錄的條數
二、用法
一、limit n :顯示n條記錄
二、limit m n :從m+1條記錄開始顯示,n表示顯示顯示幾條記錄
示例:limit 1,3 :顯示2,3,4三條記錄
三、練習
一、查找防護值倒數第二名至倒數第四名的蜀國英雄記錄
select * from sanguo where country='蜀國' order by fangyu asc limit 1,3;
二、查找攻擊值前三名且名字不爲空值的蜀國英雄的姓名,攻擊值和國家
select name,gongji,country from sanguo where country='蜀國' and name is not NULL order by gongji desc limit 3;
四、聚合函數:
一、分類
一、avg(字段名):求字段的平均值
二、sum(字段名):求字段的和
三、max(字段名):求字段的最大值
四、min(字段名):求字段的最小值
五、count(字段名)統計該字段記錄的個數(空值NULL不會被統計,‘’能夠被統計)
二、練習:
一、攻擊力最強值
select max(gongji) from sanguo;(默認的將max(gongji)作爲字段名,能夠經過as 來修改)
二、統計一下表中id,name字段分別有多少條記錄
select count(id) as,c_id count(name) as c_name from sanguo;
三、計算蜀國英雄的總攻擊力
select sum(gongji) from sanguo where country='蜀國';
四、統計蜀國英雄中攻擊力大於200的英雄數量
select count(*) from sanguo where country='蜀國' and gongji >200;
五、group by
一、做用:給查詢的結果進行分組
二、練習
一、查詢sanguo表中一共有幾個國家
select country from sanguo group by country;
二、計算全部國家的平均攻擊力
select country,avg(gongji)from sanguo group by country;
三、查找全部國家中 英雄數量最多的 前2名 的國家的名稱和英雄數量
select country,count(*) from sanguo group by country order by count(*) desc limit 2;
三、注意:
一、group by以後的字段必需要爲select以後的字段
二、若是select以後的字段和group by以後的字段不一致,則必需要對select以後的該字段作聚合處理
六、having
一、做用:對查詢的結果進行進一步的篩選
二、練習
一、找出平均攻擊力大於105的國家的前兩名,顯示國家名和平均攻擊力
select country,avg(gongji) from sanguo group by country having avg(gongji)>105 order by avg(gongji) desc limit 2;
三、注意:
一、having語句一般與group by 語句聯合使用,用來過濾由group by語句返回的記錄集
二、having語句的存在彌補了where關鍵字不能與聚合函數聯合使用的不足,having操做聚合函數生成的顯示列
三、where只能操做表中實際存在的字段,having能夠操做聚合函數生成的顯示列
七、distinct
一、做用:不顯示字段的重複值
二、練習:
一、sanguo表中一共有多少個國家
select distinct country from sanguo;
二、計算蜀國一共有多少個英雄
select count(distinct id) from sanguo where country='蜀國';
三、注意
一、distinct處理的是distinct和from之間的全部字段,全部字段值必須所有相同才能去重
二、distinct不能對任何字段作聚合處理
八、在查詢表記錄時作數學運算
一、運算符: + - * / %
二、練習:
一、查詢時顯示全部英雄的防護力+5
select id,name,fangyu+5 from sanguo;
約束
一、做用:爲了保證數據的完整性、一致性、有效性
二、約束分類
一、默認約束(default)
一、做用:在插入記錄時,若是不給字段賦值,則使用默認值
二、格式:字段名 數據類型 default 默認值
二、非空約束(not null)
一、做用:不容許將該字段設置爲null
二、格式:字段名 數據類型 not null
索引
一、定義:對數據庫中表的一列或者多列的值進行排序的一種結構(MySQL中用Btree方式(二叉樹))
二、優勢:加快數據的檢索速度
三、缺點
一、當對錶中的數據進行增長、刪除或修改的時候,索引也要動態維護,下降了數據的維護速度
二、索引須要佔用物理空間
四、索引分類
一、普通索引(index)
一、使用規則:
一、一個表中能夠有多個index字段
二、字段的值能夠有重複,且能夠爲null值
三、常常把作查詢條件的字段設置爲index字段
四、index字段的key標誌是MUL
二、建立index
一、建立表時建立:index (字段名1),index(字段名2)
create table t2(
id int,
name char(15),
age tinyint unsigned,
index(id),inedx(name));
二、在已有表中建立index
一、語法:
create index 索引名 on 表名(字段名)
create index age on t2(age);
二、注意:
索引名通常和字段名同樣
三、查看普通索引
一、經過desc 表名 -----→查看key標誌
二、show index from 表名;
四、刪除普通索引
drop index 索引名 on 表名;
二、惟一索引(unique key)
一、使用規則
一、一個表中能夠有多個unique字段
二、unique字段的值不容許重複,但能夠爲空
三、unique的key標誌是UNI
二、建立惟一索引
一、建立表的時候建立
方法一、unique (字段名1),unique(字段名2)
方法二、字段名 數據類型 unique
二、在已有表中建立
create unique index 索引名 on 表名(字段名);
示例:create unique index name on user(name);
三、刪除惟一索引
drop index 索引名 on 表名;
注意:index unique在刪除時只能一個一個刪
三、主鍵索引(primary key)
一、使用規則
一、一個表中只能有一個主鍵字段
二、對應字段的值不能重複,且不能爲空
三、主鍵字段的key標誌爲PRI
四、把表中可以惟一標識一個一條記錄的字段設置爲主鍵,一般把表中記錄編號的字段設置爲主鍵
二、建立主鍵(primary key)
一、在建立表時
一、字段名 數據類型 primary key ;
二、primary key (字段名)
三、primary key (字段名1,字段名2):複合主鍵,當字段1,2的值都相同時纔算相同,通常不用
二、在已有表中建立
一、alter table 表名 add primary key(字段名)
三、刪除
一、alter table 表名 drop primary key
說明:刪除主鍵後把不能重複的特性刪掉了,可是不能爲空的特性還在
四、自增加屬性(auto_increment)
一、做用:一般和主鍵字段一塊兒配合使用
二、建立
一、在建立表的時候建立
字段名 數據類型 primary key auto_increment
二、在已有表中建立
alter table 表名 modify 字段名 數據類型 primary key auto_increment;
三、說明:有自增加屬性的字段在插入記錄時能夠用0來補位,值從1開始逐一遞增,若是字段填入的值比表中最後一個的值大
那麼他們之間的值將不存在。
五、刪除主鍵及自增加屬性
一、alter table 表名 modify 字段名 數據類型 ;(先刪除自增加屬性)
二、alter table 表名 drop primary key;
四、外鍵索引(foreign key)
一、定義:讓當前表的字段值在另外一張表的範圍內選擇
二、語法格式:
foreign key (參考字段名) reference 被參考表名(被參考字段名) on delete 級聯動做 on update 級聯動做
三、案例:
表1:繳費信息表(財務)
學號 姓名 班級 繳費金額
1 唐伯虎 1712 20000
2 秋香 1712 19000
表2:學生信息表(班主任)
學號 姓名 繳費金額
1 唐伯虎 20000
create table jftab(
id int primary key,
name char(20),
class char(7),
money int
)default charset=utf8;
create table bjtab(
-> stu_id int,
-> name varchar(15),
-> money int,
-> foreign key(stu_id) references jftab(id) on delete cascade on update cascade
-> )default charset=utf8;
四、刪除外鍵
一、語法格式:
alter table 表名 drop foreign key 外鍵名(bjtab_ibfk_1);
二、注意
查看外鍵的方式:
show create table 表名;(查看 CONSTRAINT `bjtab_ibfk_1`)
五、在已有表中添加外鍵
alter table 表名 add foreign key(參考字段名)references 被參考表名(被參考字段名)on delete 級聯動做 on update 級聯動做
說明:在已有表中添加外鍵時,會受到表中原有數據的限制
六、級聯動做
一、cascade:數據級聯更新
一、當主表刪除記錄時,若是從表有相關聯記錄則級聯刪除
二、當主表更新被參考字段值時,從表級聯更新參考字段值
二、restrict(默認)
一、當主表刪除記錄時,若是從表中有相關聯記錄,則不容許主表刪除
二、當主表更新被參考字段值時,若是自從表有參考字段,則不容許更新
三、set null
一、當主表刪除記錄時,從表中相關聯記錄外鍵字段值變爲null
二、update同理
四、no action
同restrict同樣,都是當即檢查外鍵限制
七、使用規則
一、兩張表被參考字段和參考字段的數據類型要一致
二、被參考字段必須是key的一種,一般是primary key
五、在哪些字段上面適合添加索引
一、在較爲頻繁的做爲查詢條件的字段應該建立索引
二、惟一性太差的字段不適合單首創建索引,好比性別
三、更新太頻繁的字段不適合建立索引
四、不會出如今where子句中的字段不適合建立索引
六、注意事項
一、建立一個複合索引後,查詢只用到了其中的一個字段則不會使用索引
建立複合索引:create index fangyu_country on sanguo(fangyu,country);
explain能夠幫助咱們在不真正執行某個SQL語句的時候,就能夠分析sql語句
mysql> explain select * from sanguo where country="蜀國"\G
*************************** 1. row ***************************
id: 1 #查詢序列
select_type: SIMPLE #查詢類型
table: sanguo #查詢表名
partitions: NULL
type: ALL #掃描方式,ALL表示全表掃描
possible_keys: NULL #可能使用到的索引
key: NULL #實際使用到的索引
key_len: NULL #使用索引的個數
ref: NULL
rows: 8 #SQL語句掃描的行數
filtered: 12.50
Extra: Using where
1 row in set, 1 warning (0.00 sec)
二、使用模糊查詢時不會使用到索引
三、若是查詢語句中使用了or只要其中一個條件沒有索引,則查詢時則不會使用索引
數據導入
一、做用:將文件系統的內容導入到數據庫中
二、語法格式:
一、load data infile '文件名' into table 表名 fields terminated by '分隔符' lines terminated by '分隔符';
說明:文件爲絕對路徑
三、xdl: x: 1000:1000:xdl,,,:/home/xdl:/bin/bash(使用cat /etc/passwd | grep "xdl";命令查看)
用戶名:密碼:UID:GID: 描述: 家目錄: 登陸權限
四、把/ect/passwd/ 導入到MySQL數據庫中
五、操做步驟:
一、在數據庫中建立對應的表:
create table userinfo(
-> username char(20),
-> password char(1),
-> uid int,
-> gid int,
-> comment varchar(50),
-> homedir varchar(50),
-> shell varchar(50)
-> );
二、查看數據庫的默認搜索路徑:
show variables like 'secure_file_priv';
三、將系統文件拷貝到數據庫的默認搜索路徑中
sudo cp /etc/passwd /var/lib/mysql-files
四、將數據導入表中
load data infile '/var/lib/mysql-files/passwd'
-> into table userinfo
-> fields terminated by ':'
-> lines terminated by '\n';
數據導出
一、做用:將數據庫中表的記錄保存到系統文件中
二、語法格式:
select ... from 表名 into outfile '文件名' fields terminated by '分隔符' lines teriminated by '分隔符'
三、練習:
一、把userinfo 表中的用戶名,密碼,和uid號三個字段導出到userinfo.txt中
select username,password,uid from userinfo
-> into outfile '/var/lib/mysql-files/userinfo.txt'
-> fields terminated by ' '
-> lines terminated by '\n';
二、將庫名爲mysql庫中的user表中的User,Host兩個字段的值導出到user2.txt
select User,Host from user
-> into outfile '/var/lib/mysql-files/user2.txt'
-> fields terminated by ' '
-> lines terminated by '\n';
四、注意:
一、導出的內容由SQL查詢語句決定
二、執行導出命令時路徑必須指定在對應的數據庫目錄下
三、show variables like 'secuer_file_priv';查詢路徑
表的複製
一、表的複製
一、語法格式
create table 表名 select 查詢命令;
二、練習
一、複製userinfo表中的數據到userinfo2表中
create table userinfo2 select * from userinfo;
二、複製userinfo表的前10行記錄到uesrinfo3中
create table userinfo3 select * from userinfo limit 10;
三、複製userinfo表的用戶名、密碼、uid三個字段的2~10條記錄到userinfo4中
create table userinfo4 select username,password,uid from userinfo limit 1,9;
二、只複製表結構
一、語法格式
create table 表名 select...where false;
三、注意複製表的時候不會把原有表的 鍵 屬性賦值過來
嵌套查詢
一、定義:把內層的查詢結果做爲外層查詢的條件
二、語法格式:
select 查詢語句 where 條件 (select 查詢語句)
三、練習:
一、把uid的值小於這個字段的平均值的用戶和uid顯示出來
方法1:select avg(uid) from userinfo;
select ussername,uid from userinfo where uid < 第一條查詢的結果
方法2:
select username,uid from userinfo where uid < (select avg(uid) as vag_uid from userinfo);
二、查找userinfo表中用戶名在mysql庫下的user表中Host值爲localhost而且User值爲root的 用戶名
select username from userinfo where username in (select User from mysql.user where Host='localhost' and User='root')
多表查詢
一、兩種方式:
一、select 字段名列表 from 表名列表;(笛卡爾積)
select * from tt2,tt3;
二、select 字段名列表 from 表名列表 where 條件
select * from tt2,tt3 where tt2.uid = tt3.uid;
二、練習
一、顯示省和市的信息
select sheng.S_name,city.C_name from sheng,city where sheng.S_ID = city.CFather_ID;
二、顯示省、市、縣的信息
select sheng.S_name,city.C_name,xian.X_name from sheng,city,xian where sheng.S_ID=city.CFather_ID and city.C_ID=xian.XFather_ID;
鏈接查詢
一、內鏈接
一、定義:從表中刪除與其餘被鏈接表中沒有匹配到的行
二、語法格式
select 字段名列表 from 表1 inner join 表2 on 條件
三、練習
一、顯示省、市信息
select sheng.S_name,city.C_name from sheng inner join city on sheng.S_ID = city.CFather_ID;
二、顯示省、市、縣的信息
select sheng.S_name,city.C_name,xian.X_name from sheng inner join city on sheng.S_ID = city.CFather_ID inner join xian on city.C_ID=xian.XFather_ID;
二、外鏈接
一、左鏈接
一、定義:以左表爲主顯示查詢結果
二、語法:
select 字段名列表 from 表1 left join 表2 on 條件
三、練習:
一、顯示省市信息
select sheng.S_name,city.C_name from sheng left join city on sheng.S_ID = city.CFather_ID;
二、右鏈接
一、定義:以右表爲主顯示查詢結果
二、語法:
select 字段名列表 from 表1 right join 表2 on 條件
三、練習
一、顯示省市信息
select sheng.S_name,city.C_name from sheng right join city on sheng.S_ID = city.CFather_ID;
二、顯示省市縣的信息,要求市所有顯示
select sheng.S_name,city.C_name,xian.X_name from sheng right join city on sheng.S_ID = city.CFather_ID left join xian on city.C_ID=xian.XFather_ID;
數據備份(在linux終端下操做)
一、命令格式:
mysqldump -u用戶名 -p 源庫名 > 路徑/xxx.sql:
二、源庫名的表示方式
--all-database 備份全部庫
庫名 備份單個庫
-B 庫1 庫2 ... 備份多個庫
庫名 表1 表2 備份指定庫的指定表
三、練習
一、備份全部庫爲all_mysql.sql放到主目錄下mydata目錄中
mysqldump -u debian-sys-maint -p --all-databases > ~/mydata/all_mysql.sql
二、備份三個庫,放到mydata目錄中
mysqldump -u debian-sys-maint -p -B db1 db2 db3 > ~/mydata/db1_db2_db3.sql
三、備份省市縣的三張表
mysqldump -u debian-sys-maint -p db3 sheng city xian > ~/mydata/sheng_city_xian.sql
數據恢復(在linux終端下操做)
一、命令格式
mysql -u用戶名 -p 目標庫名 < 路徑/xxx.sql
二、從全部備份文件中恢復指定庫(--one-database)
mysql -u用戶名 -p --one-database 目標庫 < 路徑/xxx.sql
說明:目標庫必須是全部備份中存在的庫名
三、練習
一、先備份db3庫,刪除省市縣三張表,
drop table sheng,city,xian;
二、在db3庫中建立一張新表t88888
create table t88888(id int);
三、恢復db3庫
四、注意
一、恢復時若是恢復到原有庫會將表中數據覆蓋,新增的表不會被刪除
二、在恢復時若是恢復的庫不存在,則先要建立空庫
ER模型&ER圖
一、定義:ER模型就是實體——關係模型,ER圖就是實體-關係圖
二、三個概念
一、實體
一、定義:現實世界中任何能夠被認知、區分的實物
二、示例
一、學校:學生、教師、課程、班主任...
二、企業:職工、產品...
二、屬性
一、定義:實體所具備的特性
二、示例
一、學生屬性:學號、姓名、年齡、性別、專業...
二、產品屬性:產品編號、產品名稱、規格...
三、關係
一、定義:實體之間的關係
二、分類
一、一對一關係(1:1):班級和班長
二、一對多關係(1:n):公司和職工、班級和學生
三、多對多關係(m:n):學生和課程、商店和顧客
四、ER圖的繪製
一、矩形框表明實體、菱形框表明關係、橢圓形表明屬性。
二、示例:
學生選課系統
workbench(圖形化界面操做數據庫)
事務&事務回滾
一、事務定義:一件事從開始到結束的整個過程
二、屬性
一、原子性:
一個事務是不可分割的工做單位,事務中各個操做要麼都作,要麼都不作
二、一致性:
事務必須從一個一致性狀態到另外一個一致性狀態
三、隔離性:
一個事務的執行不能被其餘併發事務干擾
四、持久性:
一個事物一旦提交,它對數據的改變是永久性的
三、事務及事務回滾的應用:
一、mysql中默認sql語句會自動commit到數據庫
show variables like ‘autocommit’;
二、事務應用
一、開啓事務:
mysql> start transaction;#此時autocommit被禁用,SQL語句不會對數據庫中數據作修改
二、終止事務;
一、mysql> commit;
二、mysql> rollback;
三、注意:
事務和事務回滾只針對對錶記錄的操做:增長、刪除、修改,對建立庫、建立表、查詢表記錄是無效的
python數據庫編程
一、python數據庫接口(Python DB-API)
一、定義:爲開發人員提供的數據庫應用編程接口
二、python支持的數據庫服務軟件
MySQL、Oracle、SQL_Server、Sybase、Mogodb
三、Python提供的操做MySQL的模塊
模塊名:pymysql
四、pymysql的使用流程
一、先創建數據庫鏈接
二、建立遊標對象
三、使用遊標對象的方法和SQL語句操做mysql數據庫
四、提交commit
五、關閉遊標
六、關閉數據庫鏈接
import pymysql #打開數據庫鏈接 db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2',charset='utf8') #建立一個遊標對象 cur = db.cursor() #建立一個庫 cur.execute('create database if not exists python;') #切換庫 cur.execute('use python;') #建立一個表 cur.execute('create table if not exists t1(id int primary key,name varchar(20),score tinyint unsigned)default charset=utf8;') #插入5條記錄 cur.execute("insert into t1 values(1,'貂蟬',88),(2,'趙子龍',100),(3,'諸葛亮',80),(4,'張飛',60),(5,'司馬懿',99);") #提交 db.commit() #關閉遊標 cur.close() #關閉數據庫鏈接 db.close()
五、須要安裝pymysql模塊
一、安裝pip3:sudo apt install python3-pip
二、安裝pymysql:pip3 install pymysql
六、創建數據庫鏈接:
一、語法格式:
對象名=pymysql.connect('主機名','用戶名','密碼','庫名',port=3306,charset='utf8')
二、connect對象(db)的方法
一、cursor() 建立一個遊標對象:db.cursor()
二、commit() 提交到數據庫 db.commit()
三、rollback() 回滾 db.rollback()
四、close() 關閉與數據庫的鏈接 db.close()
三、cursor遊標對象(cur)的方法
一、execute() 執行sql命令
二、fetchone() 取得結果集的第一條記錄
import pymysql db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',charset='utf8') cur = db.cursor() sql_select = 'select * from t1;' cur.execute(sql_select) data = cur.fetchone() print('fetchone的結果爲:',data) #fetchone的結果爲: (1, '貂蟬', 88) db.commit() cur.close() db.close()
三、fetchmany(數字) 取得結果集的第幾條記錄
import pymysql db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',charset='utf8') cur = db.cursor() sql_select = 'select * from t1;' cur.execute(sql_select) data = cur.fetchmany(3) all_data = cur.fetchall() print('fetchmany的結果爲:',data)#fetchmany的結果爲: ((1, '貂蟬', 88), (2, '趙子龍', 100), (3, '諸葛亮', 80)) print('fetchall的結果爲:',all_data) db.commit() cur.close() db.close()
四、fetchall() 取得結果集的全部行
五、close() 關閉遊標對象
屬性:rowcount : 返回命令執行影響的條數
import pymysql db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',charset='utf8') cur = db.cursor() sql_select = 'select * from t1;' print('命令影響的條數:',cur.rowcount) cur.execute(sql_select) all_data = cur.fetchall() print('fetchall的結果爲:',all_data)#fetchall的結果爲: ((1, '貂蟬', 88), (2, '趙子龍', 100), (3, '諸葛亮', 80), (4, '張飛', 60), (5, '司馬懿', 99)) db.commit() cur.close() db.close()
#rollback.py import pymysql db = pymysql.connect('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','db3',charset='utf8') cur = db.cursor() try: cur.execute("update CCB set money = 95000 where name='轉錢';") cur.execute("update ICBC set money = 7000 where name= '借錢';") db.commit() print('ok') except Exception as e: db.rollback() print("出現錯誤已經回滾") cur.close() db.close()
from pymysql import * class MysqlPython: def __init__(self,host,user,password,db,port,charset='utf8'): self.host = host self.user = user self.pwd = password self.db = db self.port = port self.charset = charset def open(self): '''建立與數據庫的鏈接''' self.conn = connect(self.host,self.user,self.pwd,self.db,self.port,charset=self.charset) #建立遊標 self.cur = self.conn.cursor() def close(self): '''關閉遊標、關閉與數據庫的鏈接''' self.cur.close() self.conn.close() def myexecute(self,sql): '''執行SQL命令''' self.open() try: self.cur.execute(sql) self.conn.commit() print('操做成功') except Exception as e: self.conn.rollback() print('出現錯誤,已經回滾:',e) def myFetchone(self,sql): '''獲得一條記錄''' try: self.open() self.cur.execute(sql) data = self.cur.fetchone() return data except Exception as e: print('出現錯誤:',e) def myFetchmany(self,sql,n): '''獲得多條記錄''' try: self.open() self.cur.execute(sql) data = self.cur.fetchmany(n) return data except Exception as e: print('出現錯誤:',e) def myFetchall(self,sql): '''獲得所有記錄''' try: self.open() self.cur.execute(sql) data = self.cur.fetchall() return data except Exception as e: print('出現錯誤:',e)
#test.py from MysqlPython import MysqlPython # name = input("請輸入要修改爲績的學生姓名:") # score = int(input("請輸入新的成績:")) # sql = "update t1 set score=%s where name='%s';"%(score,name) # mp = MysqlPython('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',3306) # mp.myexecute(sql) # mp.close() sql = "select * from t1" mp = MysqlPython('localhost','debian-sys-maint','Lo0r79JmxvMFNtA2','python',3306) data = mp.myFetchone(sql) print(data) mp.close() data = mp.myFetchmany(sql,3) print(data) data = mp.myFetchall(sql) print(data)
select user_id,count(*) from comment group by user_id order by count(*) desc limit 10;
思路:首先找到全部的用戶,按用戶分組,按評論的文章計數而後降序,取前10條記錄
1.事務Transaction:要麼一塊兒成功,要麼一塊兒失敗.
2.事務的開始
一個事務的結束,就是下一個事務的開始
3.事務的結束
DDL(數據定義語言)語句可以自動提交事務:create, drop, alter
DML(數據操縱語言)語句不會自動提交事務:insert, delete,update,select
4.commit:提交
5.rollback:回滾