數據庫是一個存儲數據的倉庫
1、數據是以行和列的形式去存儲的
2、這一系列的行和列稱爲表
3、表中的每一行叫一條記錄
4、表中的每一列叫一個字段
5、表和表之間的邏輯關聯叫關係
6、關係型數據庫的核心內容是關係即二維表
能夠在Unix Linux Windows上運行數據庫服務
python、java、php ... ...
1、每條命令必須以 ; 結尾
2、SQL命令不區分字母大小寫
3、使用 \c 終止命令的執行
1、查看已有的庫:show databases;
2、建立庫:create database 庫名 charset=utf8;
3、切換庫:use 庫名;
4、查看當前所在庫:select database();
5、查看庫中已有的表:show tables;
6、刪除庫:drop database 庫名;
注意:
指定了庫的字符編碼,庫中全部表的默認字符編碼和庫的字符編碼相同
1、可使用數字、字母、_,可是不能是純數字
2、庫名區分字母大小寫
3、庫名具備惟一性
4、不能使用特殊字符和mysql關鍵字
1、建立表:create table 表名(字段名 數據類型,... ...) charset=utf8;
2、查看錶結構:desc 表名;
3、插入記錄:insert into 表名 values(值1),(值2),..... ;
4、查看錶記錄:select * from 表名 where 條件;
5、刪除表記錄:delete from 表名 where 條件;
6、更改表記錄:update 表名 set 字段名=值,字段名=值,... where 條件;
7、刪除表:drop table 表名;
注意:
1、全部的數據都是以文件的形式存儲在數據庫目錄下
2、數據庫目錄:/var/lib/mysql
1、查看全部的庫
show databases;
2、建立一個新庫studb,指定字符編碼爲utf8
create databases studb charset='utf8';
3、建立一張表t1,字段有 id name age salary,字段的數據類型本身定義
create table t1 value(id int(2), name char(20), age int(2), salary int) charset='utf8';
4、查看t1的表結構
desc t1;
5、在t1中隨便插入3條記錄,id分別爲1,2,3
insert into t1 value(id=1),(id=2),(id=3);
6、查看t1表中的全部記錄
select * from t1;
7、刪除t1表中id爲2的記錄
delete from t1 where id=2;
8、把t1表中id爲3的記錄的salary改成8888
update t1 set salary=8888 where id=3;
9、刪除表t1
drop table t1;
10、刪除數據庫studb
drop database studb;
1、整型
1、int 大整型
2、tinyint 微小整型
1、有符號(默認) -128~127
2、無符號unsigned 0~255
2、浮點型
1、float float(n,m) --> n爲總位數,m爲小數位位數
2、double
3、decimal decimal(M,D) --> M爲總位數,D爲小數位位數
1、char 定長
2、varchar 變長
3、char 和 varchar 的特色
1、char浪費存儲空間,可是性能高
2、varchar節省存儲空間,可是性能低
4、字符類型的寬度和數值類型的寬度的區別
1、數值類型的寬度爲顯示寬度,只用於select查詢時顯示,和佔用存儲空間大小無關,用zerofill能夠展現效果
2、字符類型的寬度超過則沒法存儲
注意:
1、varchar沒有寬度默認值,必須指定寬度
2、在使用的時候char和varchar都要給定一個寬度,但不能超過各自的範圍
1、enum 單選 sex enum("M","F")
2、set 多選 likes set("study","Python","MySQL")
1、year YYYY
2、date YYYYMMDD
3、time HHMMSS
4、datetime YYYYMMDDHHMMSS
1、先建立一個庫 MoShou
create database MoShou;
2、在庫 Moshou中建立一個表sanguo,要求字符編碼爲utf8,且字段以下:
id 整型,顯示寬度爲2,位數不夠用0補位
name 定長,寬度爲20
gongji 整型
fangyu 微小整型,不能夠輸入負數
sex 枚舉類型,只能從"M","F"中選擇一個
country 變長,寬度爲20
create table sanguo(
id int(2) zerofill,
name char(20),
gongji int,
fangyu tinyint unsigned,
sex enum("M","F"),
country varchar(20))charset=utf8;
3、在表sanguo中插入以下幾條記錄
insert into sanguo values
(1,'諸葛亮',120,20,'M','蜀國'),
(2,'司馬懿',119,25,'M','魏國'),
(3,'關羽',188,60,'M','蜀國'),
(4,'趙雲',200,66,'M','魏國'),
(5,'孫權',110,20,'M','吳國'),
(6,'貂蟬',666,10,'F','魏國'),
(7,null,1000,99,'F','蜀國'),
(8,'',1005,88,'F','蜀國'),
(9,'魏延',110,30,'M','蜀國');
4、查找全部蜀國人的信息
select * from sanguo where country="蜀國";
5、查找一下女人的信息,只顯示她的姓名、國家和性別
select name,country,sex from sanguo where sex="F";
6、把魏延的性別改成"F",把他的國籍改成 泰國
update sanguo set sex="F",country="泰國" where name="魏延";
7、刪除全部泰國的人
delete from sanguo where country="泰國";
1、運算符:=、!=、>、>=、<、<=
2、示例
1、查找攻擊力大於等於150的英雄的名字和攻擊力
select name,gongji from sanguo where gongji >= 150;
2、把id爲2的英雄的攻擊力改成888
update sanguo set gongji=888 where id = 2;
1、運算符:= 、!=
2、示例
1、查找蜀國的英雄的信息
select * from sanguo where country="蜀國";
2、把貂蟬的名字改成 小喬
update sanguo set name="小喬" where name="貂蟬";
1、運算符:and or
2、示例
1、查找攻擊力大於200的蜀國英雄的 姓名,國家 和攻擊力
select name,country,gongji from sanguo where gongji > 200 and country="蜀國";
2、查找名字是 小喬 或者 魏國人
select * from sanguo where name="小喬" or country="魏國";
1、運算符:between and 、in 、not in
2、語法
字段名 between 值1 and 值2
字段名 in (值1,值2,... ...)
字段名 not in (值1,值2,... ...)
3、示例
1、找到攻擊力在100-200之間的英雄的記錄
select * from sanguo where gongji between 100 and 200;
select * from sanguo where gongji between 100 and 200;
2、找到id在1,3,5,7中的英雄的id和姓名
select id,name from sanguo where id in (1,3,5,7);
1、空 :is null
2、非空 :is not null
3、示例
1、查找名字爲 空值 的英雄的名字和國家
select name,country from sanguo where name is null;
注意:
1、null 和 ""不一樣
null是空值,必須用is 或者 is not去操做
""是空字符串,用= 或者 != 去操做
1、查找id在3,5,7中,而且攻擊力大於150的 蜀國的英雄的記錄
select * from sanguo where id in (3,5,7) and gongji > 150;
2、查找國家不是蜀國和吳國,或者防護力大於60的英雄的名字 防護力 和 國家
select name,fangyu,country from sanguo where country not in("蜀國","吳國") or fangyu>60;
3、將國家爲吳國,而且攻擊力在1-100之間的防護力改成88
update sanguo set fangyu=88 where country="吳國" and gongji between 1 and 100;
4、在表中插入一條記錄,id爲99,名字爲黃月英,其餘信息本身定
insert into sanguo values(99,"黃月英",200,90,"M","蜀國");
5、刪除表中id爲99,而且名字爲黃月英的記錄
delete from sanguo where id = 99;
1、語法
字段名 like 表達式
2、表達式
1、_ : 匹配單個字符
2、% : 匹配0到多個字符
示例:
1、select id,name from sanguo where name like "_%_"; # 名字至少有兩個字符的
2、select id,name from sanguo where name like "%"; # 匹配全部的記錄
3、select id,name from sanguo where name like "___"; # 匹配名字爲三個字的記錄
4、select id,name from sanguo where name like "趙%"; # 匹配全部姓趙的記錄
1、做用:
給查詢的結果進行排序
2、排序方式
1、ASC(默認) :升序
2、DESC :降序
示例:
1、按照英雄的攻擊力降序排列
select * from sanguo order by gongji desc;
2、按照英雄的防護力升序排列
select * from sanguo order by fangyu asc;
1、做用
限制顯示查詢記錄的記錄個數
2、用法
1、limit n -->顯示幾條記錄
2、limit m,n
m表示從第幾條記錄開始顯示,n表示顯示幾條
注意:
m的值是從0開始計算的,3則表示第四條記錄
3、示例:
1、查找攻擊力前三名的蜀國的英雄的姓名和攻擊力
select name,gongji from sanguo where country="蜀國" order by gongji desc limit 3;
2、查找防護力 倒數第二名 至 倒數第四名 的英雄的記錄
select * from sanguo order by fangyu limit 1,3;
1、avg(字段名) : 求字段的平均值
2、sum(字段名) : 求字段的和
3、max(字段名) : 求字段的最大值
4、min(字段名) : 求字段的最小值
5、count(字段名) : 統計該字段的記錄的個數
示例:
1、統計一下sanguo表中一共有多少條記錄
select count(*) from sanguo;
2、統計一下表中id,name字段分別有多少條記錄
select count(id),count(name) from sanguo;
# 空值NULL不會被統計,空字符串""會被統計
3、計算蜀國英雄的總攻擊力
select sum(gongji) from sanguo where country = "蜀國";
4、攻擊力最強的攻擊力是多少
select max(gongji) as best from sanguo;
1、做用:給查詢的結果進行分組
2、示例:
1、查詢sanguo表中一共有幾個國家
select co untry from sanguo group by country;
2、計算全部國家的平均攻擊力
select country,avg(gongji) from sanguo group by country;
注意:
1、group by後的字段名必需要爲select以後的字段名
2、group by處理的是group by以後的全部字段,若是查詢字段和group by以後的字段不一致,則必需要對該字段值作聚合處理(聚合函數)
1、做用
不顯示字段的重複值
2、示例
1、sanguo表中一共有多少個國家
select distinct country from sanguo;
3、注意:
1、distinct處理的是distinct與from之間的全部字段,全部字段必須所有相同才能去重
2、distinct不能對任何字段作聚合處理
1、運算符
+ - * / %
2、查詢顯示時全部英雄攻擊力所有 * 10
select id,name,country,gongji*10 from sanguo;
建立兩張表php
1、老師表(t)
編號(t_id) 姓名(name)
1 魏老師
2 趙老師
3 閔老師
create table t(
t_id int primary key auto_increment,
name varchar(20))charset=utf8;
insert into t values(0,"魏老師"),(0,"趙老師"),(0,"閔老師");
2、學生表(s)
學號(stu_id) 姓名(name) 性別(gender) 成績(score) t_id
171001 '唐伯虎' 男 90 1
171002 '秋香' 女 99 2
171003 '祝枝山' 男 80 2
171004 '石榴' 女 100 NULL
171005 '文徵明' 男 100 NULL
create table s(
stu_id char(7),
name varchar(15),
gender enum("男","女"),
score tinyint unsigned,
t_id int)charset=utf8;
insert into s values
('171001','唐伯虎','男',90,1),
('171002','秋香','女',99,2),
('171003','祝枝山','男',80,2),
('171004','石榴','女',100,NULL),
('171005','文徵明','男',100,NULL);
1、內鏈接
1、定義
把全部符合鏈接條件的記錄顯示在結果集中,不符合條件的直接過濾掉
2、示例
1、查詢全部學生的學號,姓名和老師
寫法1:
select s.stu_id,s.name,t.name from s,t where s.t_id = t.t_id;
寫法2:
select s.stu_id,s.name,t.name from s inner join t on s.t_id = t.t_id;
2、外鏈接
1、左鏈接
1、定義
以左表爲準,去右表找數據,若是沒有匹配的數據,則以null補空位,因此輸出結果數>=左表原數據數
2、語法
select 字段名 from 表1 left join 表2 on 條件;
3、示例
1、查詢全部學生的學號,姓名和老師
select s.stu_id,s.name,t.name from s left join t on s.t_id = t.t_id;
2、右鏈接
1、用法同左鏈接,以右邊的表爲主顯示查詢結果
2、示例
1、查詢全部學生的學號,姓名和老師
select s.stu_id,s.name,t.name from s right join t on s.t_id = t.t_id;
爲了保證數據的完整性、一致性、有效性的規則
能夠限制無效的數據插入到數據表裏面
一、規則
一、一個表中只能有一個主鍵(primary)字段
二、對應字段的值不容許重複 且 不能爲空
三、主鍵字段的key標誌爲 PRI
四、把表中可以惟一標識一條記錄的字段設置爲主鍵,一般把表中記錄編號的字段設置爲主鍵
二、建立主鍵(primary key)
一、在建立表時建立主鍵
示例:
一、第一種方式
create table t4(
id int primary key,
name varchar(15),
sex enum("boy","girl") default "girl"
);
二、第二種方式
create table t5(
id int,
name char(30),
likes set("girl","study","mysql"),
primary key(id,name) 複合主鍵
);
二、在已有表中添加主鍵限制
語法:
alter table 表名 add primary key(字段名);
三、刪除主鍵限制
語法:
alter table 表名 drop primary key;
四、自增加屬性 auto_increment
一般和主鍵一塊兒配合使用
一、在建立表時添加自增加屬性
create table t5(
id int primary key auto_increment,
name char(20),
age tinyint unsigned
);
二、在已有表中添加自增加屬性
語法
alter table 表名 modify 字段名 數據類型 primary key auto_increment;
1、使用規則
1、一個表裏面能夠有個unique字段
2、unique字段的值不容許重複,但能夠爲空
3、unique的key標誌是 UNI
2、建立惟一約束
1、在建立表時建立惟一約束
方式一:
create table t7(
id int unique,
name char(15)
);
方式二:
create table t10(
id int,
name char(15),
unique(id),
unique(name)
);
1、定義
讓當前表字段的值在另外一個表的範圍內選擇
2、語法
foreign key(參考字段名)
references 被參考表名(被參考字段名)
on delete 級聯動做(cascade)
on update 級聯動做(cascade)
3、使用規則
1、兩張表被參考字段和參考字段數據類型要一直
2、被參考字段必須是key的一種,一般primary key
表1:繳費信息表(財務)
學號 姓名 班級 繳費金額
1 唐伯虎 AID1711 28000
2 秋香 AID1711 20000
表2:學生信息表(班主任)
學號 姓名 繳費金額
1 唐伯虎 28000
2 秋香
1、建立表
1、繳費信息表(主表)
create table jftab(
id int primary key,
name char(20),
class varchar(25),
money int
)default charset=utf8;
insert into jftab values
(1,"唐伯虎","AID1711",20000),
(2,"秋香","AID1711",28000),
(3,"祝枝山","AID1711",25000);
2、建立學生信息表(從表)
create table bjtab(
stu_id int,
name char(20),
money int,
foreign key(stu_id) references jftab(id)
on delete cascade
on update cascade
)default charset=utf8;
insert into bjtab values
(1,"唐伯虎",20000),
(2,"秋香",28000);
4、級聯動做
1、cascade數據級聯更新
on delete cascade on update cascade
當主表刪除記錄或更改被參照字段的值時從表會級聯更新
2、restrict(默認)
on delete restrict on update restrict
1、當主表刪除記錄時,若是從表中有相關聯記錄則不容許主表刪除
2、當主表更改主鍵字段值時,若是從表有相關記錄則不容許更改
3、set null
on delete set null on update set null
1、當主表刪除記錄時,從表外鍵字段值變爲null
2、當主表更改主鍵字段值時,從表外鍵字段值變爲null
4、no action
同 restrict,都是當即檢查外鍵限制
5、刪除外鍵約束
語法:
alter table 表名 drop foreign key 外鍵名;
注意:
1、外鍵名的查看方式
show create table 表名;
6、在已有表中添加外鍵
alter table 表名 add
foreign key(參照字段名)
references 表名(被參照字段名)
on delete cascade
on update cascade;
注意:
在已有表中添加外鍵時,會受到原有數據的限制
一、語法java
mysqldump -u用戶名 -p 源庫名 > 路徑/XXX.sql
二、示例node
1、備份MoShou庫
mysqldump -uroot -p MoShou > /home/tarena/mydata/MoShou.sql
三、源庫名的表示方式python
備份全部庫:
--all-databases
語法:
mysqldump -uroot -p --all-databases > /home/tarena/mydata/mysql.sql
指定單個庫:
庫名
備份多個庫:
-B 庫1 庫2 ...
備份指定庫的指定表:
庫名 表名
二、數據恢復mysql
1、語法
mysql -u用戶名 -p 目標庫名 < 路徑/XXX.sql
示例
1、恢復MoShou庫
mysql -uroot -p MoShou < /home/tarena/mydata/MoShou.sql
2、恢復全部的庫
mysql -uroot -p < /home/tarena/mydata/mysql.sql
3、從mysql.sql中恢復MoShou
mysql -uroot -p MoShou --one-database < /home/tarena/mydata/mysql.sql
注意:
在數據恢復時若是要恢復的庫不存在,則先要建立空庫
對數據庫中表的一列或者多列的值進行排序的一種結構(MySQL中用二叉樹Btree方式)
能夠加快數據的檢索速度
一、當對錶中的數據進行增長、刪除和修改的時候,索引也要動態維護,下降了數據的維護速度
二、索引須要佔用物理空間
通常把常常用來查詢的字段設置爲索引字段
一、一個表中能夠有多個index字段
二、字段的值能夠有重複,且能夠爲null值
三、常常把作查詢條件的字段設置爲index字段
四、index字段的key標誌是MUL
1、建立表時建立
index(字段名1),index(字段名2)
create table t1(
id int,
name char(20),
age tinyint unsigned,
index(id),
index(name)
);
2、在已有表中建立index
1、語法
create index 索引名 on 表名(字段名);
注意:
索引名通常和字段名同樣
3、查看普通索引
1、desc 表名; --> 查看key標誌爲MUL
2、show index from 表名;
3, show index from 表名\G;
做用:以列的形式顯示查詢結果
4、刪除索引
drop index 索引名 on 表名;
drop index id on t1;
drop index name on t1;
注意:
刪除普通索引只能一個一個刪除
一件事從開始發生到結束的整個過程
確保數據的一致性
注意:
1、mysql中默認sql語句結果會自動commit到數據庫
2、開始寫start transaction,自動commit會被禁用,直到咱們用commit;或者rollback;終止這個transaction
格式:
mysql> start transaction;
mysql> sql語句1
mysql> sql語句2
...
mysql> commit; 或者 rollback;
注意:
回滾rollback只針對於對錶記錄的操做:增、刪、改
對庫和表的操做無效
示例:
表1:CCB
create table CCB(
name char(20),
money int
);
insert into CCB values("Zhuanqian",10000);
表2:ICBC
create table ICBC(
name char(20),
money int
);
insert into ICBC values("Shouqian",4000);
開始轉帳:
start transaction;
update CCB set money = 5000 where name = "Zhuanqian";
update ICBC set money = 9000 斷電了,宕機了;
rollback;
驗證:
select * from CCB;
select * from ICBC;•
1、定義
爲開發人員提供的數據庫應用編程接口
MySQL、Oracle、SQL_Server、Sybase... ...
pymysql, sqlclicent
1、創建數據庫鏈接
2、建立遊標對象
3、使用遊標的方法和SQL語句操控MySQL數據庫
4、提交commit
5、關閉遊標
6、關閉數據庫鏈接
1、語法
對象名 = pymysql.connect("主機名","用戶名","密碼","庫名")
示例:
db = pymysql.connect("localhost","root","123456","python")
2、connect對象支持的方法
1、cursor() 建立一個遊標對象db.cursor()
2、commit() 提交到數據庫(增刪改)
3、rollback() 回滾 db.rollback()
4、close() 關閉數據庫鏈接 db.close()
3、關於cursor對象支持的方法
1、execute(op) 執行數據的基本SQL命令
2、fetchone() 取得結果集的第一行記錄
3、fetchmany(size) 取得結果集的size行記錄
4、fetchall() 取得結果集的全部行
5、close() 關閉遊標對象
import pymysql
# 連接到數據庫
db = pymysql.connect("localhost", "root", "123456")
# 建立遊標對象
cursor = db.cursor()
# 建立一個數據庫
cursor.execute("create database python;")
# 建立一個表
cursor.execute("use python;")
cursor.execute("create table t1(\
id int primary key auto_increment,\
name varchar(20),\
age tinyint unsigned);")
# 插入數據
sql_insert = "insert into t1 values\
(0,'Green',25),\
(0,'Lucy',30),\
(0,'Bob',20);"
# 執行 sql 語句
cursor.execute(sql_insert)
# 提交數據
db.commit()
# 關閉遊標對象
cursor.close()
# 斷開數據庫連接
db.close()