數據庫37天

數據庫

總覽

day1 介紹數據庫\安裝\基礎的命令
day2 數據庫的表操做
day3 數據庫的數據操做,查詢(單表\多表)
day4 查詢和其餘內容的拾遺
day5 索引原理和python操做mysql

軟件就是讓頻繁的人作的事情,交給機器去作了 ------- Eva-jpython

day1

背景

數據庫在開發的過程當中佔據着什麼樣的位置?
    咱們把數據存儲在文件裏
        #寫 write
        #讀 read
        #改 讀->寫->刪->改
        
    可以更加簡單的 使用 存儲在文件中的數據        
    查 一行數據 從userinfo 條件 id = 10 或者 id =1  找500000 得找500000行,文件的太費時,從前日後,

在整個項目中又有什麼意義?
    數據庫: 可以更加簡單的 使用 存儲在文件中的數據
    可以更好的解決併發問題
        第一個相對論:即便client  依賴數據庫    又是server  提供用戶
    數據的統一問題

數據

1,alex,alex3714 # 一行內容就是一條數據
2,python,19800,6 months # 一條數據mysql

數據庫 DataBase DB

存儲數據的地方,咱們把全部的數據都存儲在一個固定的地方,那麼這個地方就是數據庫程序員

數據庫管理系統 DBMS

負責管理數據倉庫中存儲的全部文件中的內容
可以更好(簡單 高效 安全)的幫助咱們完成數據的增刪改查redis

數據庫服務器

​ 什麼是服務器 : 本質就是一臺計算機
​ 當一臺計算機上安裝了某個軟件可以對外提供服務的時候,那麼這臺機器就成爲服務器
​ 數據庫服務器
​ 當這臺機器上安裝的服務是一個數據庫的server端的時候,咱們就獲得了一臺數據庫服務器sql

數據庫管理員 DBA

​ 專門幫助咱們管理數據庫 而且優化數據庫的工做人員mongodb

mysql就是一個DBMS(可以管理硬盤上數據文件的一個軟件)數據庫

​ 經過一些固定的簡單的指令 幫助咱們完成從文件中查找對應數據的軟件
​ oracle 也是一個DBMS安全

查 name,id 從 userinfo 條件 age = 83
查 number 從 userinfo 條件 name='wusir'服務器

數據庫管理系統的做用:
關係型數據庫

​ id name age phone_num 知道一個id(任何一個) 能夠找到age(其餘) 知道age 找到id name併發

​ mysql  oracle sql server   sqlite (學會一個其餘的差很少)

非關係型數據庫

​ key -value

​ 經過一個找其餘全部 而不能經過別的找別的(查找速度很是快)快遞訂單

​ redis(進程之間的通訊 數據庫很是火的一個)  mongodb (以後作的 智能機器人的庫)

mysql 開源的軟件 - 小公司 各類互聯網公司(二次開發以後的mysql)
oracle 付費的 - 金融行業 國企事業單位
sql server 在學校裏教學使用的

若是關係很是關聯用關係型。 若是不關聯,均可以非關係型的

mysql 安裝
先配置my.ini    裏面的每行沒有空格 設置安裝目錄
加環境變量
安裝目錄在\bin 文件裏
cmd 管理員運行  安裝目錄\bin\mysqld install    
net start mysql 啓動mysql         找不到dir文件,用360修復一下
mysql -uroot -p          
enter pw :        回車   以後進入mysql 就對了 
show variables like '%charac%';   value 都是utf8就對了
mysql卸載
D:\mysql\mysql-5.6.43-winx64\mysqld remove  移出服務
把mysql整個文件都刪掉\環境變量也刪掉 
重啓電腦

環境變量

當咱們執行一個系統中的可執行文件的時候
例如 mysql.exe或者 mysqld.exe或者python.exe
若是咱們不配環境變量,
那麼就須要進入mysql.exe所在的目錄去執行
或者帶着這個文件的絕對路徑去執行
咱們常常要執行這些文件
因此把文件的路徑添加到環境變量中
就可直接輸入文件名來執行程序了

一些命令

mysqld install
    #mysqld.exe install  要安裝mysql的server端     是一個程序而不是一個進程
    
net start mysql 啓動server端   
                    ftp同樣  只有server 運行不了   開啓自啓動  之後不須要啓動了額
mysql -uroot -p 啓動client端

重啓server
net stop mysql
net start mysql

client端的啓動
c://>mysql -uroot 表示沒有密碼的狀況下用root用戶登陸
c://>mysql -uroot -p 表示使用密碼登陸
Enter password:輸入密碼,若是沒有密碼直接回車
mysql命令行
mysql > select user();    查看當前用戶
set password = password('123');   給當前用戶設置密碼
show databases;    查看當前的全部數據庫
能不能給一個用戶一個root ?

root 用戶在mysql 當中至關於管理員用戶

其餘的程序員想要使用數據庫來存儲項目數據,不能給他權限最高的管理員用戶

好比 : 建立一個eva 帳戶,Ta能夠查看她的文件內容  
        建立一個liu帳戶,他能夠查看他的文件內容   不能看別的  也沒管理權刪別的
能夠建立用戶 而且給用戶受權
能夠建立用戶  而且給用戶受權
create user 'eva@192.168.16.%';   什麼都作不了  沒有權限
create user 'eva@192.168.16.%' identified by '123';  帶密碼登陸

既能夠給一個已經  存在的用戶受權 ,也能夠給一個不存在的用戶建立並受權
grant  權利 on '數據庫名.表名'  to  '用戶名@ip地址'  ;
grant  權利 on '數據庫名.表名'  to  '用戶名@ip地址' identified by '123' ;
    #權利:SELECT  INSERT UPDATE  DELETE  ALL      #對全部的項目增刪改查 最高的權限了
建立一個數據庫 s20_day1;
create database s20_day1 ;
連老師的數據庫
建立一個stu 用戶  密碼是123 ip地址是192.168.16 網段的全部機器
能對這個數據s20_day1 作增刪改查的全部操做:
grant all on 's20_day1.*' to 'stu@192.168.16.%' identified by '123';
192.168.16.13  
mysql- ustu -h192.168.16.13 -p 
123

# grant all on s20_day1.* to 'stu'@'192.168.16.%' identified by '123';
# 用戶名 密碼 ip地址
# mysql -u用戶名 -hip地址 -p
# 密碼
DDL DML DCL

通常用ddl dml。 dcl 是受權(上面的)

刪除方面否則用刪庫語句,基本上就是delete了

一、DDL語句 數據庫定義語言: 數據庫、表、視圖、索引、存儲過程,例如CREATE DROP ALTER
二、DML語句 數據庫操縱語言: 插入數據INSERT、刪除數據DELETE、更新數據UPDATE、查詢數據SELECT
三、DCL語句 數據庫控制語言: 例如控制用戶的訪問權限GRANT、REVOKE
ddl語言
文件夾(數據庫)的增刪改查
(4)
建立數據庫:
      create database 數據庫名;             指定編碼utf8   ;  默認就是utf8 建立成功
使用數據庫:
     use  庫名;
查看全部的數據庫:
    show databases;
查看數據庫下有哪些表:
    show tables;
改: alter  database  .... 改編碼格式
刪除: drop database db1:
操做文件(重點)
(*)
建立表:
    create table 表名(字段名 數據類型(長度),字段名2 數據類型(長度),...)
查看錶結構:
    desc 表名;
修改表的字段名
    alter table 表名 change name username char(12);   好比:字段名2name  改爲username
刪除表
    drop table t1;

問題: 如何增長字段名?

dml 語言
數據的增刪改查
(*)
增長
    insert into 表名 values (值1,值2,...); 插入一條數據
    insert into 表名 values (值1,值2,...),(值1,值2,...),(值1,值2,...); 插入多條數據
    查看數據
    select * from 表名;
    修改數據
    update 表 set 字段名=值 where 條件;
    刪除數據
    delete from 表 where 條件;
    
insert into t1 values(1,'alex','ab');
insert into t1 values(1,'alex','ab');
            能夠是(1,1,1) 爲何?char 能夠給1 不是‘1’也可  id不是主鍵,可重複如別的東西
            
insert into t1 values(2,'wusir','t123'),(3,'taibai','333');

update t1 set password ='222'   把全部的ab t12 333 都改爲了222
update t1 set password = '222' where id =3 ;   改一個
                        判斷條件用and相連
select * from t1;
delete from t1 where id = 1;

沒外鍵全部的均可以重複

問題:如何更改表名?
操做文件和操做數據:
文件:操做 table 表名;除了desc(查看外)都是table + 表名
數據:操做 動詞(into from set * from)表名;
drop 和 delete 的區別
drop table 表名 :  ERROR 1146 (42S02): Table 'day53.xuexi1' doesn't exist
delete from 表名: Empty set (0.00 sec)
*auto_increment 表示:自增
*primary key 表示:約束(不能重複且不能爲空);加速查找
四天後來回顧
爲何要有數據庫? 
    以前是存在文件裏,可是文件裏的值。好比,存儲在字典裏的,
    字典提取值,須要從前日後,若是是一個後面的值,取值時間長
    列表類那樣,從頭至尾。
數據庫則不是這樣
    b樹和b+樹
        b樹,取值慢些,一層層,B+樹,三次便可取值,由於快
什麼是數據庫
    關係型數據庫
        mysql sqlserver oracle sql 
        一對多 多對多  
        適合關係型緊密的
    非關係型數據庫
        只能一對多  主鍵  
        redis(不但能夠數據庫還能夠數據傳輸(socket))  mong(數據庫)智能機器人
數據庫的下載和安裝
    my.ini    改路徑
    路徑ini 裏的 mysqld install
    start net mysql     開啓服務端mysql 一次開啓,一直適用
    mysql -uroot -p 123     開啓客戶端mysql  
    
給別的機子權限的指令。
    create day35 @stu 192.168.22.1  
命令行
    show databases;
    use 庫名;
    show tables;
    use 表名;
    查看
    select * from 表名;
    增
    insert into(不會)
    改
    刪
    drop 表名;
數據庫
    ddl
        建庫
    dml
    d

day38表操做

1. mysql 的存儲引擎(innodb,myisam)

id name phone addr ident gender
1
2
3
4
500萬行數據    全部年齡大於20的人名
3個文件存:
id name phone addr ident gender  表結構存在一個文件
1 2 3 4  文件   存在另外一個文件裏
查找的時候會用到的一些目錄裏存在另外一個文件裏   (好比年齡)

2 個文件存:  把數據按照目錄去存
把1-20放到一塊,20-40放一塊,  
硬盤   把全部年齡84 的存在一個塊 分塊目錄結構存的  不是一行行存的

全部的數據不存在硬盤而  存在內存 上
常常被打開 丟了也不要緊  熱數據:1 張表 2000w條新聞

oracle 只有一個存儲引擎目錄結構兩個文件存

1.1 總結

第一種方式 myisam 是5.5以前的默認搜索引擎(由於以前讀的多)
                        (由於表級鎖,因此限制了其餘用戶對行的操做)
    數據存在硬盤上,村三個文件,表結構,數據,和搜索目錄
    既不支持事務、也不支持外鍵、不支持行級鎖
    只支持表鎖
    對於只讀操做比較多地狀況 查詢速度相對較快
第二種方式  Innodb 是5.6以後的默認搜索引擎(之後用的多)
                (由於之後互聯網用戶多,對庫改的併發操做多)
    數據存在硬盤上,存兩個文件,表結構,( 數據,搜索目錄)
    支持事務
    支持行級鎖
    支持外鍵
    (支持了這麼多,必然加了許多鎖,速度就慢了)
第三種方式 Memory 
    數據存在內存上,存一個文件,表結構(在硬盤上)(快斷電消失)
    數據容易丟失,但讀寫速度相對都快(數據字數有限制)

2 幾個須要講解的關鍵詞

2. 1 事務transaction
景 200         實現董給景  轉200塊    
董 2000000  
趙 3000000

(必須原子性  ,一個動做,保護數據)
開啓事務
先查董的餘額,減兩百,更新到數據庫 
    數據庫掛了
再查個人餘額,+200 更新到數據庫
    沒加錢
關閉事務
2.21 innodb

是存儲爲兩個文件的

​ 表結構

​ 數據和搜索目錄

外鍵約束

行和表級鎖
5.6 版本以上都是,支持事務,提交回滾,崩潰恢復(都不生效),
行級鎖  :修改這一行,在這行加鎖,不讓讀 髒數據  
表級鎖  :修改許多行,在這個表加鎖 (多行,行鎖加鎖去鎖浪費時間)
2.22 myisam

5.5以及下

2.3 實際顯示
show engines ; 全部的存儲引擎
show engines \G;  詳細的顯示每一行:
show variables like ""   // 查看sql的東西

show variables like "default_storage_engine"; 查看mysql的存儲引擎 ```

若是是5.5 如下的能夠改這個,成innodb 文件了
#my.ini文件
[mysqld]
default-storage-engine=INNODB

create table t1 value(1,'1')

innodb 
表數據frm
表結構ibd

show create table use2;  能夠看錶的存儲引擎

create table use3 (id int) engine = myisam;
myisam 
frm 村結構
myd   myisam data
myi     myisam index 

memory  建立了  stop start 就消失了
2.4 mysql的工做流程
  1. 檢測是否合法 root仍是別的用戶

  2. 分析優化
  3. 而後存儲找數據
  4. 去硬盤上找

2. mysql 支持的數據類型

有限選這些  解決不了問題再去選別的
數值類型
    int 
    float 
字符串類型
    char
    varchar
時間類型
    datetime
set 和 enum類型
    enum
    set
2.1 int
tinyint 1 字節   正數 0-255   負數  -128 ~127 
    無符號的 int unsigned ;  0-255  (年齡)
    smallint  mediumint 
    int 10位  手機號碼不行  
    bigint  大於10位
2.2 float
精確度  
都小數後能表示到30位  可是精確度通常
float(255,30)       w- 工資有多少小數 價格夠了  float(5,2)  小數2位  5 位精準度
double    位數有限比float精準 數學也不行                9位精準度
小數精確到30位  默認是整數
decimal (65,30)
2.21 i系列
i1 
create table i1(id1 int ,id2 tinyint, id3 int unsigned)
insert into t1 values(1,1,1)
insert into t1 values(-1,-1,-1)  不能放  最多到0 warning 顯示爲0
insert into t1 values(128,128,128)   超過127,tinyint ,得127  
insert into t1 values(2的十位+1,2的十位+1,2的十位+1)   int標識減一
create table i1(id1 int(11) ,id2 int(2), id3 int unsigned)  超過了10位設置11很差用 
            即便寫了int ,也能夠寫進去11111,約束對int無效
2.22 浮點數系列f系列
create table f1(f float(5,2),d double(5,2),d3 decimal(5,2))
insert into f1 values(4.2, 4.2 , 4.3)  保留4.30   都寫4.32533 四捨五入 4.33   
create table f1(f float,d double,d3 decimal)
均可以看到表結構。區別:
show create table f2 ;  存儲引-擎 能夠看到相關的約束  更多
desc f2 ;    能夠看到數據類型 約束  請求
2.3 date
date    0-9999年12-31  YYYY-MM-DD  年月日 (入職)
time    HH:MM:SS 時分秒
year   YYYY   年份  紅酒
datetime    年月日時分  0-9。。。。範圍多
timestamp   1970 -2038 年 時間過短,企業不但願這麼短
create table time1 (y year , d date , t time);
三種均可以
insert into time1 values(now(),now(),now());
insert into time1 values(2010,20200320,111233) ;
insert into time1 values('2019-01-01 12:12:12') ;

create table time2 (dt datetime, ts timestamp);
insert into time2 values (now(),now());
insert into time2 valuse(1969010111212,1969010111212)
insert into time2 valuse(2040010111212,1969010111212)  後面的不行
 dt 能表示時間範圍大,能夠爲空 ,沒有默認值 
ts 能表示時間範圍小,不能爲空, 默認當前時間

create table time2 (dt datetime default current_timestamp, ts timestamp);
    人爲設置datetime類型的默認值是當前時間

2.4 字符串

char 能表示的長度小  浪費節省存儲空間 ,讀寫效率快
    定長字符串
        char(5)  'abc'  'abc  '  'abcde'
varchar 能表示的長度大   65535
    變長字符串
        varchar(5) 'ab'  --> 'ab2'(前面共兩個字符的事)  ‘abc’  'abc3'  'abcde'--'abcde5'
        節省內存 查找速度和寫入的速度慢  (寫和讀都須要算)

身份證號:char(18)
手機號碼:char(11)
用戶名:char(12)  頻繁的讀取的列,而且長度的 變化不大   
評論: varchar(255)     255個字

longblob    2的十位數方個
create table s1(c char(10) , v varchar(10));
create table s1(c char(255) , v varchar(255));    
insert into s2    顯示的時候回去掉全部空格,來對用戶形成欺騙。實際上存空格了
enum 和 set
枚舉,單選 且自動剔除不存在的選項
    enum('male' , 'female')
集合,多選,自動剔除不存在的選項,自動去重
    set('洗腳','洗頭','抽菸','喝酒')
create table es(name char(10) , sex enum('male','female') , hobby set('洗腳','洗頭','抽菸','喝酒'))
查看錶結構
desc 表名; 
    == describe 表名 ;

3. 完整性約束

設置整型無符號 int unsigned 
設置默認值 default 
是否能夠爲空 not null 
是否惟一  unique 
自增  auto_increment 
主鍵 primary key 
外鍵 foreign key
表結構 : id , name , phone ,sexx 
create table stu1 (
        id int,
        name char(12) not null,
        phone char(11),
        sex enum('male','female')
        );

not null 不生效
多是mysql 的配置有了問題

​ 就是你找到了一我的,人的名字會不會爲空或者身份證

4. 表的建立\刪除\修改\查找表結構

​ create table staff_info(id int,

​ name char(12) ,

​ age int,

​ sex char(6),

phone char(11),

​ job char(20)

​ ); #字符

5.表與表之間的關係

相關文章
相關標籤/搜索