day1 介紹數據庫\安裝\基礎的命令 day2 數據庫的表操做 day3 數據庫的數據操做,查詢(單表\多表) day4 查詢和其餘內容的拾遺 day5 索引原理和python操做mysql
軟件就是讓頻繁的人作的事情,交給機器去作了 ------- Eva-jpython
數據庫在開發的過程當中佔據着什麼樣的位置? 咱們把數據存儲在文件裏 #寫 write #讀 read #改 讀->寫->刪->改 可以更加簡單的 使用 存儲在文件中的數據 查 一行數據 從userinfo 條件 id = 10 或者 id =1 找500000 得找500000行,文件的太費時,從前日後, 在整個項目中又有什麼意義? 數據庫: 可以更加簡單的 使用 存儲在文件中的數據 可以更好的解決併發問題 第一個相對論:即便client 依賴數據庫 又是server 提供用戶 數據的統一問題
1,alex,alex3714 # 一行內容就是一條數據
2,python,19800,6 months # 一條數據mysql
存儲數據的地方,咱們把全部的數據都存儲在一個固定的地方,那麼這個地方就是數據庫程序員
負責管理數據倉庫中存儲的全部文件中的內容
可以更好(簡單 高效 安全)的幫助咱們完成數據的增刪改查redis
什麼是服務器 : 本質就是一臺計算機
當一臺計算機上安裝了某個軟件可以對外提供服務的時候,那麼這臺機器就成爲服務器
數據庫服務器
當這臺機器上安裝的服務是一個數據庫的server端的時候,咱們就獲得了一臺數據庫服務器sql
專門幫助咱們管理數據庫 而且優化數據庫的工做人員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 在學校裏教學使用的
若是關係很是關聯用關係型。 若是不關聯,均可以非關係型的
先配置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就對了
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 > select user(); 查看當前用戶 set password = password('123'); 給當前用戶設置密碼 show databases; 查看當前的全部數據庫
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 #對全部的項目增刪改查 最高的權限了
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 是受權(上面的)
刪除方面否則用刪庫語句,基本上就是delete了
一、DDL語句 數據庫定義語言: 數據庫、表、視圖、索引、存儲過程,例如CREATE DROP ALTER 二、DML語句 數據庫操縱語言: 插入數據INSERT、刪除數據DELETE、更新數據UPDATE、查詢數據SELECT 三、DCL語句 數據庫控制語言: 例如控制用戶的訪問權限GRANT、REVOKE
(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;
問題: 如何增長字段名?
(*) 增長 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
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 只有一個存儲引擎
第一種方式 myisam 是5.5以前的默認搜索引擎(由於以前讀的多) (由於表級鎖,因此限制了其餘用戶對行的操做) 數據存在硬盤上,村三個文件,表結構,數據,和搜索目錄 既不支持事務、也不支持外鍵、不支持行級鎖 只支持表鎖 對於只讀操做比較多地狀況 查詢速度相對較快 第二種方式 Innodb 是5.6以後的默認搜索引擎(之後用的多) (由於之後互聯網用戶多,對庫改的併發操做多) 數據存在硬盤上,存兩個文件,表結構,( 數據,搜索目錄) 支持事務 支持行級鎖 支持外鍵 (支持了這麼多,必然加了許多鎖,速度就慢了) 第三種方式 Memory 數據存在內存上,存一個文件,表結構(在硬盤上)(快斷電消失) 數據容易丟失,但讀寫速度相對都快(數據字數有限制)
景 200 實現董給景 轉200塊 董 2000000 趙 3000000 (必須原子性 ,一個動做,保護數據) 開啓事務 先查董的餘額,減兩百,更新到數據庫 數據庫掛了 再查個人餘額,+200 更新到數據庫 沒加錢 關閉事務
是存儲爲兩個文件的
表結構
數據和搜索目錄
外鍵約束
5.6 版本以上都是,支持事務,提交回滾,崩潰恢復(都不生效), 行級鎖 :修改這一行,在這行加鎖,不讓讀 髒數據 表級鎖 :修改許多行,在這個表加鎖 (多行,行鎖加鎖去鎖浪費時間)
5.5以及下
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 就消失了
檢測是否合法 root仍是別的用戶
去硬盤上找
有限選這些 解決不了問題再去選別的 數值類型 int float 字符串類型 char varchar 時間類型 datetime set 和 enum類型 enum set
tinyint 1 字節 正數 0-255 負數 -128 ~127 無符號的 int unsigned ; 0-255 (年齡) smallint mediumint int 10位 手機號碼不行 bigint 大於10位
精確度 都小數後能表示到30位 可是精確度通常 float(255,30) w- 工資有多少小數 價格夠了 float(5,2) 小數2位 5 位精準度 double 位數有限比float精準 數學也不行 9位精準度 小數精確到30位 默認是整數 decimal (65,30)
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無效
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 ; 能夠看到數據類型 約束 請求
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類型的默認值是當前時間
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('male' , 'female') 集合,多選,自動剔除不存在的選項,自動去重 set('洗腳','洗頭','抽菸','喝酒') create table es(name char(10) , sex enum('male','female') , hobby set('洗腳','洗頭','抽菸','喝酒'))
desc 表名; == describe 表名 ;
設置整型無符號 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 的配置有了問題
就是你找到了一我的,人的名字會不會爲空或者身份證
create table staff_info(id int,
name char(12) ,
age int,
sex char(6),
phone char(11),
job char(20)
); #字符