△用數據庫的緣由css
1文件操做的複雜度
2同步
3併發處理
4安全html
△數據庫系統(DBS)
數據庫(DB) + 數據庫管理系統 (DBS)+ 數據庫應用程序 + 數據庫管理員 (BDA)+ 最終用戶python
△數據庫管理系統-DBM
網絡應用服務端
咱們要使用服務端的數據 - 須要有一個客戶端
客戶端能夠本身寫 : 將來寫代碼的時候
也能夠用別人寫好的 : 第三方的工具 數據庫管理軟件的公司出版的官方客戶端
數據庫管理系統本質上也是管理一堆文件
只不過人家的管理方式比咱們更高效 更安全mysql
△數據庫管理員-DBAredis
搭建數據庫服務環境
用戶的建立 權限的管理
性能\語句的優化
數據庫的二次開發 : 讓數據庫具備公司的特質sql
△軟件mongodb
mysql : 小公司
甲骨文 oracle : 事業單位 金融企業
微軟 sql server
sqllite數據庫
△數據庫的分類安全
關係型數據庫 mysql oracle sqlserver sqllite
非關係型數據庫 redis mongodb memcache hbase網絡
關係型數據庫
優勢:
一、易於維護:都是使用表結構,格式一致
二、使用方便:SQL語言通用,可用於複雜查詢
三、複雜操做:支持SQL,可用於一個表以及多個表之間很是複雜的查詢
缺點:
一、讀寫性能比較差,尤爲是海量數據的高效率讀寫
二、固定的表結構,靈活度稍欠
三、高併發讀寫需求,傳統關係型數據庫來講,硬盤I/O是一個很大的瓶頸
非關係型數據庫
優勢:
一、格式靈活:存儲數據的格式能夠是key,value形式、文檔形式、圖片形式等等
二、速度快,成本低:nosql數據庫部署簡單,基本都是開源軟件
缺點:
一、不提供sql支持,學習和使用成本較高
二、無事務處理
三、數據結構相對複雜,複雜查詢方面稍欠
△ SQL是關係數據庫管理系統的標準語言。
△名詞
DB 數據庫 - 文件夾
table 表 - 文件
data 一條數據-每一行數據
△三種方法操做數據庫
終端,python,第三方工具
△二.mysql編碼問題
編碼問題
1.臨時解決問題在客戶端執行set XXXX = utf8;
2.永久解決問題fimy. ini添加set xXxx = utf8;
3.實時解決問題create table表名() charset=utf8;
△服務端-安裝啓動關閉
mysqld install #安裝 net start mysql #啓動 以管理員身份在cmd中輸入 net stop mysql #關閉
creat user 'eva'@'%'identified by'123'; #建立用戶eva 在全部網段容許 設置密碼爲123
△
1,先跟數據庫進行鏈接(用帳號和密碼,默認3306端口)
2,建立數據庫:
create database 數據庫名:
刪除數據庫(慎用!):
DROP DATABASE 數據庫名稱;
顯示全部數據庫:
SHOW DATABASES;
切換數據庫:
USE 數據庫名稱 ;
3.建立表:
4.查看錶結構
整數 :
tinyint(m) 1個字節 -128~127
smalint(m) 1個字節 -32768~32767
==mediumint== 3個字節 -8388608~8388608
==int(m)== 4個字節 -2147483648~2147483647
bigint(m) 8個字節 -9223372036854775808~9223372036854775807
m: 顯示寬度,和數據類型的取值範圍是無關的
(int unsigned) : unsigned 標上表示無符號
小數 :
MySQL中使用浮點數和定點數來表示小數。它們均可以用(m,n)來表示,其中m稱爲精度,表示總共的位數;n稱爲標度,是表示小數的位數(會四捨五入)
==float==(m,d) 單精度浮點型,4字節 -3.402823466E+38~-1.175494351E-38
==double==(m,d) 雙精度浮點型,8字節 -1.7976931348623157E+308~-2.225738585072014E-308
decimal(m,d) 壓縮嚴格的定點數,m+2個字節 最大取值範圍與double一致
==year== 年 酒的產期
==time== 時:分:秒 計時軟件
==date== 年-月-日 入職日期 出帳日期 還款日期
==datetime== 年-月-日 時:分:秒 1000-01-01 00:00:00~9999-12-31 23:59:59 日誌,消費記錄,上下班打卡
timestamp 年-月-日 時:分:秒 不能爲空,自動寫當前時間,級聯更新,範圍小
==now==() 函數表示當前時間
讓datetime 自動寫當前時間,級聯更新 create table 表( 列 datetime NOT NULL #非空 DEFAULT CURRENT_TIMESTAMP #自動寫當前時間 ON UPDATE CURRENT_TIMESTAMP #級聯更新當前時間 )
==char==(255) :定長的 節省時間 浪費空間 手機號碼、身份證號
==varchar==(65535) : 變長的 節省空間 浪費時間 評論
==enum== 單選
==set== 多選,自動去重
例如建表時定義字段
愛好 set(「游泳」,「籃球」,「下棋」,「音樂」,「旅遊」)
insert into t_1 values("游泳,籃球,音樂")
添加時會自動去重和去掉不存在的
create table t1(i1 tinyint,i2 int); #默認建立的數據類型都是有符號的 i1-表頭 create table t2(i1 tinyint unsigned,i2 int unsigned); #給字段添加一個unsigned表示無符號 create table t3(f1 float,f2 double); mysql> create table t1( id int,name varchar(20), sex enum('man','wuman'), age int, hire_date date, post varchar(20), post_comment varchar(20), #通常在用char varchar時要限制字符 salary double(7,2), office int, depart_id int); 32
create table t3(f1 float,f2 double); create table t4(f1 float(7,2)); 小數點後2位,小數點前5位
create table t7(dt datetime NOT NULL DEFAULT CURRENT_ TIMESTAMP ON UPDATE CURRENT_ TIMESTAMP,y year); NOT NULL DEFAULT CURRENT_ TIMESTAMP ON UPDATE CURRENT_ TIMESTAMP #讓datetime的時間在無數據填充的狀況下會自動更新到這次修該的時間
create table t8(username cha(12),gender enum('male','female')); create table t8(username cha(12),hobby set('喝酒','抽菸','燙頭','洗腳')); 填充的時候也必須時字符串格式,添加時會自動去重和去掉不存在的
在維護和操做時,必定要先備份一份,以後再去操做數據庫
會遭遇各的數據丟失的狀況:
硬件故障
軟件故障
天然災害
黑客攻擊
誤操做 (佔比最大)
1,在MySQL的bin目錄中打開命令窗口(bin目錄中才有複製的命令)
2,輸入:mysqldump –uroot –p test101 > C :\t1.sql (若是有警告能夠忽略)
鏈接MySQL,建立數據庫
在MySQL的bin目錄中打開命令窗口
輸入:mysql –uroot –p 數據庫名 < d:\t1.sql
# 默認用戶登錄以後並無實際操做的權限 # 須要使用管理員root用戶登錄 # mysql -uroot -p -h mysql5.6默認是沒有密碼的 遇到password直接按回車鍵 # mysql> set password = password('root'); 給當前數據庫設置密碼 # mysql> select user(); #查看當前用戶 # 輸入「ipconfig」便可查看到本機的ip信息。 # ;表示sql語句的結束 # \c放棄當前要執行的sql語句 # mysql> exit # 也能夠用\q quit退出
mysql> grant all on *.* to 'eva'@'%' identified by '123' 5.6及如下版本 mysql> grant all on *.* to 'eva'@'localhost' identified by '123'
△分兩步:
建立用戶
mysql> create user 'eva'@'192.168.10.%' IDENTIFIED BY '123';# 指示網段 mysql> create user 'eva'@'192.168.10.5' # 指示某機器能夠鏈接 mysql> create user 'eva'@'%' #指示全部機器均可以鏈接 mysql> show grants for 'eva'@'192.168.10.5';查看某個用戶的權限
給帳號受權
mysql> grant all on *.* to 'eva'@'%'; #grant 權限類型 on 數據庫名稱 . * (或表名) to 'shang'@'%'; mysql> flush privileges; # 刷新使受權當即生效
數據備份: mysqldump –uroot –p test101 > C :\t1.sql (若是有警告能夠忽略) 數據恢復: mysql –uroot –p 數據庫名 < d:\t1.sql 增:create database db1 charset utf8; charset utf8可省略,建立數據庫 查:show databases; 顯示全部數據庫 改:alter database db1 charset latin1;(改爲歐洲的) 刪除: drop database db1; 刪除數據庫(慎用!) 切換::use db1; 切換數據庫
先切換到文件夾下:use db1 增:create table t1(id int,name char)CHARSET=utf8; 建立表 查: select database(); 查看當前所在庫 show tables; 查看全部的表 desc 表; 查看錶結構 show creat table 表名; 查看建表語句和搜索引擎,顯示的信息更全面 show engines; 查看MySQL重要引擎 改: ALTER TABLE t_2 ADD age INT; 增長列名 類型 RENAME TABLE t_1 TO t_2; 更改表名稱 alter table t_1 modify name char(3); 修改列的數據類型 alter table t_1 change name name1 char(2); 修改列名和數據類型 ALTER TABLE t_1 DROP age; 刪除列 刪:drop table t1
增:insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3'); insert into t1(id,name) values (5,'wusir'), (6,'wusir'); insert into t2 select * from t1; 先執行執行select,把查到的內容導入到t2 insert into t1(id,name) select id,name from t1; 查: select * from 表; 查詢表的信息 select emp_name,salary from employee; 指定列查詢 select emp_name,salary*12 from employee; 在列中使用四則運算 select emp_name,salary*12 as annul_salary from employee; 重命名 select emp_name,salary*12 annul_salary from employee; 重命名 select distinct post from employee; 去重 select distinct sex,post from employee; 雙向去重 改: update 表 set 字段1=值1,字段2=值2 where 條件; 刪:delete from t_1 where id=1; 若是不加where:DELETE FROM t_person; 會刪除全部表中的內容 通用建表語句: CREATE TABLE sanguo( id INT PRIMARY KEY AUTO_INCREMENT, # 主鍵自增 NAME VARCHAR(32), age INT, arms VARCHAR(32), country VARCHAR(32), skill VARCHAR(32) )engine = innodb CHARSET=utf8;
having要跟在group by以後,對分組查詢的結果進行過濾(過濾分組)
where要出如今group by以前,執行表中全部數據來進行過濾(過濾行)
另外,having能夠用聚合函數,並支持全部where子句操做符數
# select concat('姓名 :',emp_name),concat('年薪:',salary*12) from employee; # select concat_ws('|','a','b','c')
== if條件判斷句
3SELECT ( CASE WHEN emp_name = 'jingliyang' THEN emp_name WHEN emp_name = 'alex' THEN CONCAT(emp_name,'_BIGSB') ELSE concat(emp_name, 'SB') END ) as new_name FROM employee;
-- 表明註釋
select concat ('<名字:',name, '>' , '<薪資:',salary,'>') from 表;
查看字符的ASCII碼值,str是空時返回0
SELECT ASCII('a')
查看ASCII碼值對應的字符
SELECT CHAR(97)
SELECT CONCAT(12,34,'ab') SELECT uname,CONCAT(age,'歲') FROM t_user;
字符串中包含的字符個數
SELECT LENGTH('abc')
截取字符串
截取字符串左端的len個字符
SELECT LEFT('qwertyui',3)
right(str,len)截取字符串右端的len個字符
SELECT RIGHT('qwertyui',3)
substring(str,pos,len) 指定位置截取,截取字符串str的位置pos起的len個字符(從1開始)
SELECT SUBSTRING('qwertyuio',2,3)
截取全部人物的姓 SELECT SUBSTRING(uname,1,1) FROM t_user; 同時去除重複項 SELECT DISTINCT SUBSTRING(uname,1,1) FROM t_user;
返回刪除了左空格的字符串
SELECT LTRIM(' abc ')
rtrim(str)
返回刪除了右空格的字符串
SELECT RTRIM(' abc ')
trim(方向 remstr from str):返回從某側刪除remstr後的字符串str
方向詞包括both(兩側)、leading(左)、trailing(右) SELECT TRIM(‘ abc ’) --刪除兩側空格 SELECT TRIM(BOTH ‘x’ FROM ‘xxxabcxxx’) --刪除兩側特定字符 SELECT TRIM(LEADING 'x' FROM 'xxxabcxxx') 刪除左側特定字 SELECT TRIM(TRAILING 'x' FROM 'xxxabcxxx') 刪除右側特定字
返回由n個空格組成的字符串
替換字符串
SELECT REPLACE('123abc123','123','def')
大小寫轉換
SELECT LOWER('aBcD') SELECT UPPER('aBcD')
求m%n的餘數
SELECT MOD(3,2)
求絕對值
SELECT ABS(-30)
表示向下取整
SELECT FLOOR(5.6)
表示向上取整
SELECT CEILING(5.6)
表示將值 n 四捨五入爲整數,無小數位
SELECT ROUND(5.6)
表示將值 n 四捨五入爲小數點後 D 位的數值,D爲小數點後小數位數
若要保留 n 值小數點左邊的 D 位,可將 D 設爲負值
SELECT ROUND(345.6789,2)
求x的y次冪
SELECT POW(2,3)
獲取圓周率
SELECT PI( )
獲取一個0.0-1.0之間的隨機數
SELECT RAND( )
SELECT CURRENT_DATE()
SELECT CURRENT_TIME()
SELECT NOW()
date_format(data,format) SELECT DATE_FORMAT('2018-8-8','%Y年%m月%d日') SELECT DATE_FORMAT(CURRENT_DATE(),'%y年%m月%d日') UPDATE t_user SET brithday=DATE_FORMAT(CURRENT_DATE(),'%y年%m月%d日') WHERE uname = '呂布' format參數可用的值以下: %Y 年份,返回4 位整數 %y 年份,返回2 位整數 %m 月,返回0-12的整數 %d 日期,返回0-31之間的整數 %H 小時 (00..23) %h 小時 (01..12) %i 分鐘(00..59) %s 秒 (00..59)
SELECT uname,country,age+50 FROM t1;
SELECT age+50 AS '年齡' FROM t_user; #修改列名的顯示(起別名)注意不要用關鍵字,as能夠省略
SELECT DISTINCT country FROM t_user; SELECT DISTINCT country,uname FROM t_user; #聯合去重 查詢每一個國家都有誰,注意:distinct後面的字段用逗號分隔,逗號兩邊不能有空格
a and b [a,b]
# select * from employee where salary between 10000 and 20000;
# select * from employee where salary in (17000,19000);
_ 通配符 表示一個字符長度的任意內容
select * from employee where emp_name like 'jin___'
% 通配符 表示任意字符長度的任意內容
select * from employee where emp_name like 'jin%' select * from employee where emp_name like '%g' select * from employee where emp_name like '%n%'
# select * from employee where emp_name regexp '^jin' 查看全部員工中名字是jin開頭,n或者g結果的員工信息 select * from employee where emp_name regexp '^jin.*[gn]$';
(判斷某個字段是否爲NULL不能用等號,須要用IS)
SELECT emp_name,post_comment FROM employee WHERE post_comment IS NULL; SELECT emp_name,post_comment FROM employee WHERE post_comment IS NOT NULL; SELECT emp_name,post_comment FROM employee WHERE post_comment=''; 注意''是空字符串,不是null ps: 執行 update employee set post_comment='' where id=2; 再用上條查看,就會有結果了
= > < >= <= != / <>
select * from employee where age>18; select * from employee where salary<10000; select * from employee where salary=20000;
and or not
and select * from employee where age>18 and post='teacher'; or select * from employee where salary<10000 or salary>30000; not select * from employee where salary not in (10000,17000,18000);
# 查詢崗位名以及崗位包含的全部員工名字 # select post,group_concat(emp_name) from employee group by post; # 查詢各部門年齡在20歲以上的人的平均薪資 # select post,avg(salary) from employee where age>20 group by post; # select * from 表 where 條件 group by 分組
having放在分組以後,由於做用的對象不一樣。WHERE 子句做用於表和視圖,HAVING 子句做用於組
查詢平均薪資大於1w的部門 select avg(salary) from employee group by post having avg(salary) > 10000 1. 查詢各崗位內包含的員工個數小於2的崗位名、崗位內包含員工名字、個數 select post,emp_name,count(id) from employee group by post having count(id)<2 2. 查詢各崗位平均薪資大於10000的崗位名、平均工資 select post,avg(salary) from employee group by post having avg(salary) > 10000 3. 查詢各崗位平均薪資大於10000且小於20000的崗位名、平均工資 select post,avg(salary) from employee group by post having avg(salary) between 10000 and 20000;
# asc 升序 # select * from employee order by salary; # select * from employee order by salary asc; # desc 降序 # select * from employee order by salary desc; # select * from employee order by age,salary; # select * from employee order by age,salary desc; # select * from employee order by age desc,salary;
排列順序從高到低 DESC
在查詢時能夠只檢索前幾條或者中間某幾行數據(數據量很大時,幾百萬條)
SELECT * FROM t_user LIMIT 0,3;
limit 後面的第一個數字設置從哪裏開始檢索(偏移量,從0開始)
limit 後面的第二個數字是設置顯示多少條
# select * from 表 order by 列 limit n; 取前n條 # select * from 表 order by 列 limit m,n; 從m+1開始,取n條 # select * from 表 order by 列 limit n offset m; 從m+1開始,取n條
全部不在條件匹配內的數據,都會被剔出連表
方式一 : select * from employee,department where dep_id = department.id; 方式二 : select * from employee inner join department on dep_id = department.id;
左外鏈接 select * from employee left join department on dep_id = department.id;
右外鏈接 select * from employee right join department on dep_id = department.id;
別的數據庫裏是full join
select * from employee left join department on dep_id = department.id union select * from employee right join department on dep_id = department.id
select * from 表 where 字段 = (select ....); 子查詢效率相對於連表查低, 由於 子查詢要查兩張表,連表查詢查一張表
create table t6(id int primary key, name char(12) not null unique); create table t5(family char(12) ,name char(12),primary key(family,name)); # 約束各自不能爲空 且聯合惟一 還佔用了整張表的主鍵
CREATE TABLE t1( id INT NOT NULL, NAME CHAR(20) ); ALTER TABLE t1 ADD PRIMARY KEY (id);
CREATE TABLE t_user( id INT PRIMARY KEY AUTO_INCREMENT, -- id 你本身起的字段名字。 -- int 數據類型,整型。 -- primary key 定義這個字段爲主鍵。 -- auto_increment 定義這個字段爲自動增加,即若是INSERT時不賦值,則自動加1
自增的必須是主鍵
create table t6(id int auto_increment, name char(12)); # 報錯 create table t8(id int primary key auto_increment, name char(12)) ; create table t9(id int unique auto_increment, name char(12)) auto_increment=100000; 自增=>非空 非空+惟一約束會被定義成主鍵 delete from t7; 清空表數據但不能重置auto_increment truncate table t7; # 清空表而且重置auto_increment 全部的操做都沒法改變auto_increment的自動計數。可是咱們也沒有必要去改變它。 1.至少要看到自增的效果 2.至少寫3條數據 4,5,6 3.刪掉第5條,再看結果 4.再insert一條數據 5.刪掉第5條,再看結果 6.再insert一條數據 7.清空整張表 8.再insert一條數據,再看結果 修改auto_increment alter table 表名 auto_increment = n; 修改表的auto_increment alter table t7 auto_increment = 1000; 修改表的auto_increment
# create table t1(id int not null,name char(12)); # 默認插入0 # create table t2(id int,name char(12) not null); # 默認插入空字符串 ``` 設置嚴格模式: 不支持對not null字段插入null值 不支持對自增加字段插入" 」值-空字符串 不支持text字段有默認值 直接在mysql中生效(重啓失效): mysql>set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"; 配置文件添加(永久失效): sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" ```
# create table t4(id int unique,name char(12)); # 聯合惟一約束 # create table t5(family char(12),name char(12),unique(family,name)); # 約束各自不能爲空 且聯合惟一 # create table t5(family char(12) not null,name char(12) not null,unique(family,name)); # 惟一+非空 id name # create table t6(id int not null unique, name char(12) not null unique); # pri 是怎麼產生的? 第一個被設置了非空+惟一約束會被定義成主鍵 primary key # 主鍵在整張表中只能有一個
create table t3(id int,name char(12),sex enum('male','female') default 'male'); 非空約束 和 默認值 create table t3(id int not null,name char(12) not null,sex enum('male','female') not null default 'male');
△外鍵:用來和其餘表創建聯繫
外鍵具備保持數據完整性和一致性的機制,目前MySQL只在InnoDB引擎下支持
(ENGINE=INNODB)
外鍵是表中的一個列,其值必須在另外一個表的主鍵或者惟一鍵中列出
做爲主鍵的表稱爲 主表,做爲外鍵的表稱爲 依賴表
外鍵會參照主表的主鍵或惟一鍵
△外鍵的做用有兩點:
1.對子表(外鍵所在的表)的做用:子表在進行寫操做的時候,若是外鍵字段在父表中找不到對應的匹配,操做就會失敗
2.對父表的做用:對父表的主鍵字段進行刪和改時,若是對應的主鍵在子表中被引用,操做就會失敗
△如下狀況建立外鍵會失敗:
外鍵的引用類型不同,如主鍵是int外鍵是char
找不到主表中引用的列
主鍵和外鍵的字符編碼不同
foreign key(class_id) references class3(cid)
沒有創建外鍵: create table stu(id int,name char(12),class_id int); create table class(cid int,cname char(12)); insert into stu values (1,'日魔',1),(2,'炮手',1) insert into class values(1,'py27'); insert into class values(2,'py28'); select * from stu,class where class_id = cid; delete from stu where id = 1; delete from class where cid = 1; stu2 class2 create table class2(cid int unique,cname char(12)); create table stu2(id int,name char(12),class_id int,foreign key(class_id) references class2(cid)); insert into class2 values(1,'py27'); insert into stu2 values (1,'日魔',1),(2,'炮手',1) delete from class2 where cid = 1; insert into class2 values(2,'py28'); update class2 set cid = 1 where cid = 2; 不能修改
# create table guest(id int primary key,name char(12)); # create table student(id int primary key,sname char(12),gid int unique, # foreign key(gid) referances guest(id));
# create table class(id int primary key,cname char(12)); # create table student(id int primary key,sname char(16),cid int, # foreign key(cid) references class(id));
# create table class(id int primary key,cname char(12)); # create table teacher(id int primary key,tname char(12)); # create table teach_cls(id int,cid int,tid int, # foreign key(cid) references class(id)), # foreign key(tid) references teacher(id)) # );
on update cascade
stu3 class3 級聯更新 create table class3(cid int primary key,cname char(12)); create table stu3(id int,name char(12),class_id int,foreign key(class_id) references class3(cid) on update cascade); insert into class3 values(1,'py27'); insert into stu3 values (1,'日魔',1),(2,'炮手',1) update class3 set cid = 2; 修改了class3中的cid,stu3中相關的數據也會跟着變化, 是on update cascade設置致使的
數據庫存儲引擎是數據庫底層軟件組件,數據庫管理系統使用數據引擎進行建立、查詢、更新和刪除數據操做
使用不一樣的存儲引擎還能夠得到特定的功能
表結構 存在一個文件中 : 硬盤上
表數據 存在另外一個文件中、內存中
索引(目錄) 爲了方便查找設計的一個機制 :
innodb :
存儲方式爲索引+數據 表結構 ,數據的持久化存儲
提供了具備提交、回滾和崩潰恢復能力的事務安全,支持外鍵。可是比起Myisam存儲引擎,InnoDB寫的處理效率差一些而且會佔用更多的磁盤空間。MySQL 5.5.5 以後,InnoDB 做爲默認存儲引擎.
myisam :
存儲方式爲索引 數據 表結構 數據的持久化存儲 ,有表級鎖
不支持事務、也不支持外鍵,但訪問速度快,對事務沒有要求
memory :
存儲方式爲表結構,數據斷電消失
show create table books;
show engines;
建表的時候能夠指定引擎
create table innot(id int) engine = innodb; create table myist(id int) engine = myisam; create table memot(id int) engine = memory;
一致性 n條語句的執行狀態是一致的
begin; # 開啓事務 select id from innot where id =1 for update; update innot set id = 2 where id = 1; commit; # 提交事務 解鎖被鎖住的數據,讓他們可以被修改
行級鎖 :只對涉及到修改的行加鎖,利於併發的修改,可是對於一次性大量修改效率低下
表級鎖 :一次性加一把鎖就鎖住了整張表,不利於併發的修改,可是加鎖速度比行鎖的效率要高
外鍵約束 :被約束表中的數據不能隨意的修改/刪除 約束字段據要根據被約束表來使用數據
△磁盤預讀性原理
1個block塊 4096個字節/9ms
△樹
樹 根節點 分支節點 葉子節點
平衡樹 balance tree - B樹
△彙集索引/聚簇索引 : 葉子節點會存儲整行數據 —— innodb的主鍵
△輔助索引/非彙集索引 :除了主鍵以外的普通索引都是輔助索引,一個索引沒辦法查到整行數據,須要回彙集索引再查一次(回表)
△b+樹 是爲了更好的處理範圍問題在b樹的基礎上有所優化
△mysql中innodb存儲引擎的全部的索引樹都是b+樹
當數據庫中存在不少條記錄,例如幾十萬條,查詢速度就成了一個問題
先在目錄中查詢,而後根據目錄所示的頁碼找到查詢內容,大大縮短查詢時間.
不使用索引,MySQL必須從第一條記錄開始讀完整個表,直到找出相關的行
表中查詢的列有一個索引,MySQL可以快速到達一個位置去搜索數據文件
索引也須要佔空間,若是咱們有大量的索引,索引文件可能會佔不少空間
三、當對錶中的數據進行增長、刪除、修改時,索引也須要動態的維護,下降了數據的維護速度。
使用原則:
1.對常常更新的表就避免對其進行索引,對常常用於查詢的字段應該建立索引
2.數據量小的表最好不要使用索引
3.在不一樣值少的列上(字段上)不要創建索引,好比在"性別"字段上只有男,女兩個不一樣值
1,建立表時,主鍵會默認帶有索引
CREATE TABLE mytable( -- 建立表時直接指定 ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX index_1 (username) );
3.補索引
CREATE INDEX index_1 ON t_user(uname) 建立一個索引 索引名 從 表名 在哪一個字段
drop index index_1 on t_user(uname);
在建立一個視圖時,只存放視圖的定義,也就是動態檢索數據的查詢語句,並不存放視圖對應的數據,在用戶使用視圖時纔去求相對應的數據,因此視圖稱爲‘虛表’
-- 查看每一個國家的總人數,年齡總和,平均年齡,最高年齡,最低年齡 SELECT country,COUNT(uname),SUM(age),AVG(age),MAX(age),MIN(age) FROM t_user GROUP BY country; 爲上面的語句建立視圖: CREATE VIEW v_user AS SELECT country,COUNT(uname),SUM(age),AVG(age),MAX(age),MIN(age) FROM t_user GROUP BY country; SELECT * FROM v_user; --之後在使用上面的查詢語句時只須要使用視圖名
import pymsql conn=pymyssq.connet (host='localhost,user='root',pqssword='123',db='數據庫名',charset='utf8') #先修路-conn cur = conn.cursor() #備車-cur sql = '語句' #裝貨 cur.execute(sql) #發車 emps = cur.fetchall() #帶回交易貨物 for i in data: print(i) #查貨
create table employee( id int not null unique auto_increment, emp_name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) unsigned not null default 28, hire_date date not null, post varchar(50), post_comment varchar(100), salary double(15,2), office int, #一個部門一個屋子 depart_id int ); #插入記錄 #三個部門:教學,銷售,運營 insert into employee(emp_name,sex,age,hire_date,post,salary,office,depart_id) values ('egon','male',18,'20170301','老男孩駐沙河辦事處外交大使',7300.33,401,1), #如下是教學部 ('alex','male',78,'20150302','teacher',1000000.31,401,1), ('wupeiqi','male',81,'20130305','teacher',8300,401,1), ('yuanhao','male',73,'20140701','teacher',3500,401,1), ('liwenzhou','male',28,'20121101','teacher',2100,401,1), ('jingliyang','female',18,'20110211','teacher',9000,401,1), ('jinxin','male',18,'19000301','teacher',30000,401,1), ('成龍','male',48,'20101111','teacher',10000,401,1), ('歪歪','female',48,'20150311','sale',3000.13,402,2),#如下是銷售部門 ('丫丫','female',38,'20101101','sale',2000.35,402,2), ('丁丁','female',18,'20110312','sale',1000.37,402,2), ('星星','female',18,'20160513','sale',3000.29,402,2), ('格格','female',28,'20170127','sale',4000.33,402,2), ('張野','male',28,'20160311','operation',10000.13,403,3), #如下是運營部門 ('程咬金','male',18,'19970312','operation',20000,403,3), ('程咬銀','female',18,'20130311','operation',19000,403,3), ('程咬銅','male',18,'20150411','operation',18000,403,3), ('程咬鐵','female',18,'20140512','operation',17000,403,3) ;
做業:
書名 | 做者 | 出版社 | 價格 | 出版日期 |
---|---|---|---|---|
倚天屠龍記 | egon | 北京工業地雷出版社 | 70 | 2019-7-1 |
九陽神功 | alex | 人民音樂很差聽出版社 | 5 | 2018-7-4 |
九陰真經 | yuan | 北京工業地雷出版社 | 62 | 2017-7-12 |
九陰白骨爪 | jinxin | 人民音樂很差聽出版社 | 40 | 2019–8-7 |
獨孤九劍 | alex | 北京工業地雷出版社 | 12 | 2017-9-1 |
降龍十巴掌 | egon | 知識產權沒有用出版社 | 20 | 2019-7-5 |
葵花寶典 | yuan | 知識產權沒有用出版社 | 33 | 2019–8-2 |
0.建表book,並向表中插入數據
1.查詢egon寫的全部書和價格
2.找出最貴的圖書的價格
3.求全部圖書的均價
4.將全部圖書按照出版日期排序
5.查詢alex寫的全部書的平均價格
6.查詢人民音樂很差聽出版社出版的全部圖書
7.查詢人民音樂出版社出版的alex寫的全部圖書和價格
8.找出出版圖書均價最高的做者
9.找出最新出版的圖書的做者和出版社
10.顯示各出版社出版的全部圖書
11.查找價格最高的圖書,並將它的價格修改成50元
12.刪除價格最低的那本書對應的數據
13.將全部alex寫的書做業修改爲alexsb
14.select year(publish_date) from book
本身研究上面sql語句中的year函數的功能,完成需求:
將全部2017年出版的圖書從數據庫中刪除
15.有文件以下,請根據連接自學pymysql模塊,使用python寫代碼將文件中的數據寫入數據庫
學python從開始到放棄|alex|人民大學出版社|50|2018-7-1
學mysql從開始到放棄|egon|機械工業出版社|60|2018-6-3
學html從開始到放棄|alex|機械工業出版社|20|2018-4-1
學css從開始到放棄|wusir|機械工業出版社|120|2018-5-2
學js從開始到放棄|wusir|機械工業出版社|100|2018-7-30
# select distinct * from 表 where 條件 group by 字段 # having 過濾 order by 字段 limit n offset m; # 書名 做者 出版社 價格 出版日期 # create table books(bname char(20), # author char(12), # press char(20), # price float(6,2), # pub_date date); # insert into books values # ('倚天屠龍記','egon','北京工業地雷出版社',70,'2019-7-1'), # ('九陽神功','alex','人民音樂很差聽出版社',5,'2018-7-4'), # ('九陰真經','yuan','北京工業地雷出版社',62,'2017-7-12'), # ('九陰白骨爪','jinxin','人民音樂很差聽出版社',40,'2019–8-7'), # ('獨孤九劍','alex','北京工業地雷出版社',12,'2017-9-1'), # ('降龍十巴掌','egon','知識產權沒有用出版社',20,'2019-7-5'), # ('葵花寶典','yuan','知識產權沒有用出版社',33,'2019–8-2'); # 查詢egon寫的全部書和價格 # select bname,price from books where author='egon'; # 找出最貴的圖書的價格 # select max(price) from books; # 求全部圖書的均價 # select avg(price) from books; # 將全部圖書按照出版日期排序 # select * from books order by pub_date; # 查詢alex寫的全部書的平均價格 # select avg(price) from books where author = 'alex' # 查詢人民音樂很差聽出版社出版的全部圖書 # select * from books where press = '人民音樂很差聽出版社'; # 查詢人民音樂出版社出版的alex寫的全部圖書和價格 # select bname,price from books where press = '人民音樂很差聽出版社' and author = 'alex' # 找出出版圖書均價最高的做者 # select author from books group by author order by avg(price) desc limit 1; # select author,avg(price) as avg_price from books group by author order by avg_price desc limit 1; # 找出最新出版的圖書的做者和出版社 # select author,press from books order by pub_date desc limit 1 # 顯示各出版社出版的全部圖書 # select press,group_concat(bname) from books group by press; # 查找價格最高的圖書,並將它的價格修改成50元 # select max(price) from books; # 70 # update books set price=50 where price = 70; # update books set price=50 order by price desc limit 1; # update books set price=50 where price = (select * from (select max(price) from books)as t); # 刪除價格最低的那本書對應的數據 # select min(price) from books; # 5 # delete from books where price = 5; # delete from books order by price limit 1; # delete from books where price = (select * from (select min(price) from books)as t); # 將全部alex寫的書做者修改爲alexsb # update books set author = 'alexsb' where author = 'alex'; # select year(publish_date) from book # month(publish_date) # day(publish_date) # delete from books where year(publish_date) = 2017;