DBMS,MySQL的概念,數據庫分類,之前MySQL的部署中的一些概念html
#DBMS:數據庫管理系統,用於管理數據庫的大型軟件。mysql就是dbms的一種 #Mysql:是用於管理文件的一個軟件 #服務端軟件 #socket服務端 #本地文件操做 #解析指令(sql語句) #客戶端軟件(各類各樣) #socket客戶端 #發送指令 #解析指令(sql語句) #除了mysql,還有其餘相似軟件: #語法大致上都是sql語句 #關係型數據庫:sqllite,db2,Oracle,access,sql server,MySQL #有比較多約束,好比字段類型啊,表和表,字段和字段間依賴呀 #非關係型數據庫:MongoDB,redis #沒這麼多約束 #MySQL安裝: # bin目錄下 mysql是客戶端,mysqld是服務端 #初始化: 初始化數據庫mysqld --initialize --console。前者沒密碼 # 5.7版本須要初始化data目錄 : mysqld --initialize -insecure #若是不添加環境變量:每次啓動都要先告訴系統所在bin目錄,因此須要添加環境變量 # cmd1 啓動服務端:E:\wupeiqi\mysql - 5.7.16 - winx64\mysql - 5.7.16 - winx64\bin\mysqld # cmd2 客戶端鏈接:E:\wupeiqi\mysql - 5.7.16 - winx64\mysql - 5.7.16 - winx64\bin\mysql - u root - p #windows服務:每個window上都有不少windows服務,默默在後臺跑着 (若是不行試一下用絕對路徑) #因此能夠把 mysqld這個服務端製做爲,windows服務,就能夠不用多開一個cmd了。首先cd到 bin目錄,輸入如下命令 # 命令爲 mysqld install 或者 mysqld --install。server.msc裏就有了個mysql #移除服務:mysqld --remove #再經過命令 : net start mysql 就能夠啓動了,也能夠從系統服務端裏找到,右鍵啓動 #中止服務: net stop mysql #總結:解壓壓縮包---MySQL路徑具體到bin添加到環境變量---打開cmd---切換到bin目錄---初始化【命令】---製做windows服務【mysqld install】---啓動【net start mysql】--【mysql -u root -p】 #一些指令: #show databases; #create database 【db名】;
#sql語句: #DDL: 定義語言 好比 create drop alter #DML: 操做語言 好比 insert update delete select #DCL:控制語言 好比 grant revoke # 註釋 # 單行註釋: -- # 多行註釋: /* ....*/ #建議 命令大寫 表名,庫名都小寫 #windows下區分大小寫的設置: #在[mysqld] 設置lower_case_table_names = 0 # 在Linux下: # 一、數據庫名與表名是嚴格區分大小寫的; # 二、表的別名是嚴格區分大小寫的; # 三、列名與列的別名在全部的狀況下均是忽略大小寫的; # 四、變量名也是嚴格區分大小寫的; #規範是建議大寫,可是主要看公司規範
建議命令大寫,表名庫名小寫mysql
#那在終端要怎麼備份呢? #用 mysqldump #備份:數據表結構和數據 #打開cmd 輸入命令: mysqldump -u root db1 > db1.sql -p 回車輸入密碼便可 #保存位置在 cmd行輸入時候的路徑,文件名爲 db1.sql #只備份:數據表結構: #mysqldump -u root -d db1 > db1.sql -p #多了個 -d #那備份的怎麼導入呢? #首先建立一個數據庫 create database db_name; #命令: mysqldump -uroot -p密碼 db_name < 文件路徑
用戶的建立,刪除,受權,取消權限,密碼修改redis
''' mysql -h localhost(或者是想鏈接的服務器的 IP) -u (主機上有的帳號) -p ''' #http://www.cnblogs.com/wupeiqi/articles/5713315.html 數據庫操做 #一些指令: #show databases; #create database 【db名】defalut charset utf8; # CREATE DATABASE 數據庫名稱 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; #drop database 【db_name】 #數據庫沒有修改一說 #show tables; # drop table table_name; #select user from user #建立用戶: #create user 'username'@'ip' identified by 'password' #create user 'gkx'@'192.168.0.1' identified by 'gkx123' #create user 'gkx2'@'192.168.0.%' identified by 'gkx123' #create user 'gkx2'@'%' identified by 'gkx123' #用戶受權: #grant select,insert,update on db1.* to 'gkx'@'%' #grant all privileges on *.* to 'gkx'@'%' #取消權限: #revoke all privileges from db1.* to 'gkx'@'%' #修改密碼: #ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼' # 修改密碼另外一種方式: # use mysql; # ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼'; # FLUSH PRIVILEGES; # 刪除用戶 # drop user '用戶名'@'IP地址'; # 修改用戶 # rename user '用戶名'@'IP地址' to '新用戶名'@'IP地址'; # 修改用戶名,能夠經過操做user數據庫,可是不建議這麼作 # mysql> use mysql; 選擇數據庫 # Database changed # mysql> update user set user="dns" where user="root"; 將用戶名爲root的改成dns # 修改密碼 # set password for '用戶名'@'IP地址' = Password('新密碼') #8.04後開始不能用了 #可是實際生產過程當中,這些都不用咱們建立,DBA(database administrator)來操做,咱們拿到用戶名及密碼便可 # show databases; # use 數據庫名稱; # show tables; #select * from 表名; or select field1,field2 from talbename
外鍵的定義,建立,刪除,約束條件,做用,以及外鍵的變種sql
# select now(); 顯示時間 # 定義:若是一張表中有一個非主鍵的字段指向了別一張表中的主鍵,就將該字段叫作外鍵。 #若是父表的主鍵是複合主鍵,那麼子表也須要指定兩列對應 constraint fk_fkname foreign key (id1,id2) references table_name(pid1,pid2) # 父表:外表,主鍵被指向的表, 子表:設置外鍵的那張表 # 外鍵的默認做用有兩點: # 1.對子表(外鍵所在的表)的做用:子表在進行寫操做的時候,若是外鍵字段在父表中找不到對應的匹配,操做就會失敗。 # 2.對父表的做用:對父表的主鍵字段進行刪和改時,若是對應的主鍵在子表中被引用,操做就會失敗。 #外鍵設置: 取名: 用表名就不會重複了 fk_table1_table2 #1.節省空間 #2.約束字段取值 #命令: constraint foreign_key_name foreign key (想綁定的本表ID) references table_name(外表id); #******在建立好的表後 alter table my_tab1 add [constraint 外鍵名] foreign key(外鍵字段名) references mytab2(主鍵字段名); # (3) 查看外鍵: # SHOW CREATE TABLE ***;能夠查看到新建的表的代碼以及其存儲引擎.也就能夠看到外鍵的設置. # 刪除外鍵: # alter table drop foreign key '外鍵名'. # 注意: # 只有在定義外鍵時,用constraint 外鍵名 foreign key .... 方便進行外鍵的刪除. # 若不定義,則能夠: # 先輸入:alter table drop foreign key -->會提示出錯.此時出錯信息中,會顯示foreign key的系統默認外鍵名.--->用它去刪除外鍵. #對於非InnoDB表,FOREIGN KEY子句會被忽略掉。 #···建立多個外鍵: 約束規則默認是 restrict #··因此要想操做外表,必須把子表修改好了 # create table score(sid int not null auto_increment primary key, # number int, # student_id int, # corse_id int, # constraint fk_sid_student foreign key (student_id) references student(sid), # constraint fk_cid_course foreign key (corse_id) references course(cid) # [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] 可選 # [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] 可選 # )engine=innodb default charset=utf8; ''' # 好比 # create table score(sid int not null auto_increment primary key, # number int, # student_id int, # corse_id int, # constraint fk_sid_student foreign key (student_id) references student(sid), # constraint fk_cid_course foreign key (corse_id) references course(cid) on delete cascade on update cascade # )engine=innodb default charset=utf8; ''' # 關鍵字 # CASCADE 刪除包含與已刪除鍵值有參照關係的全部記錄 # SET NULL 修改包含與已刪除鍵值有參照關係的全部記錄,使用NULL值替換(只能用於已標記爲NOT NULL的字段) # RESTRICT 拒絕刪除要求,直到使用刪除鍵值的輔助表被手工刪除,而且沒有參照時(這是默認設置,也是最安全的設置) # NO ACTION InnoDB拒絕刪除或者更新父表。 # 外鍵的定製做用----三種約束模式: # restrict:嚴格模式(默認), 父表不能刪除或更新一個被子表引用的記錄。 # cascade:級聯模式, 父表操做後,子表關聯的數據也跟着一塊兒操做。 # set null:置空模式,前提外鍵字段容許爲NLL, 父表操做後,子表對應的字段被置空。 ''' # 使用外鍵的前提: # 1. 表儲存引擎必須是innodb,不然建立的外鍵無約束效果。 # 2. 外鍵的列類型必須與父表的主鍵類型徹底一致。 # 3. 外鍵的名字不能重複。 # 4. 已經存在數據的字段被設爲外鍵時,必須保證字段中的數據與父表的主鍵數據對應起來。 ''' # 建立外鍵語法: # [CONSTRAINT[symbol]] # FOREIGN KEY [index_name](index_col_name, ...) # REFERENCES # tbl_name(index_col_name, ...) # [ON DELETE reference_option] # [ON UPDATE reference_option] # # reference_option: # RESTRICT | CASCADE | SETNULL | NOACTION
在多對多中,若是子表外鍵多列,那麼父表主鍵也要多列數據庫
# 定義:若是一張表中有一個非主鍵的字段指向了別一張表中的主鍵,就將該字段叫作外鍵。 #若是父表的主鍵是複合主鍵,那麼字表也須要指定兩列對應 constraint fk_fkname foreign key (id1,id2) references table_name(pid1,pid2) # 父表:外表,主鍵被指向的表, 子表:設置外鍵的那張表 #普通外鍵: #父表對子表 是1對多 #惟一索引外鍵: #父表對子表 是1對1 #博客表對用戶表,一個用戶只有一個博客 #好比公司用戶中有個系統 #用戶表 #管理表 #用戶表中只有少數幾個管理崗才能登錄系統 #因此就在管理表中,設置一個 惟一索引外鍵 ,把管理者的用戶id 放到管理表中 #圖在有道詞典181006 #多對多 # 不要求聯合惟一 #圖在有道詞典181006 相親用戶表 #要求聯合惟一 # 用戶和主機也是多對多,用戶主機關係表中能夠 user和hostid能夠聯合惟一。 #有道筆記20181006 mysql #若是外鍵要兩列,那麼父表的主鍵也要兩列
主鍵的概念,建立,刪除,多列主鍵windows
# 表中的每一行都應該具備能夠惟一標識本身的一列(或一組列)。而這個承擔標識做用的列稱爲主鍵。 # 若是沒有主鍵,數據的管理將會十分混亂。好比會存在多條如出一轍的記錄,刪除和修改特定行十分困難。 # primary key: 加速查找 (保證數據的惟一性),一張表只能有一個主鍵 #可是一個主鍵能夠爲一列,或者兩列 #主鍵還能夠這麼寫 : 爲了能更準確的表示數據惟一性,有時候須要用到複合主鍵 # create table score(sid int not null auto_increment , # number int, # student_id int, # corse_id int, # primary key (sid,student_id) #表示由這兩列設置爲一個主鍵 #且記得主鍵不能爲空 # constraint fk_sid_student foreign key (student_id) references student(sid), # constraint fk_cid_course foreign key (corse_id) references course(cid) # )engine=innodb default charset=utf8; # 刪除主鍵: # alter table t1 drop primary key; # 刪除後建立 # alter table t1 add primary key(id1);
數據類型,分紅三大類數字類型,字符串,時間類型安全
#分紅三大類 #數字類型: #bit 二進制 #tinyint # int # bigint #float 數值越多越不許確 #double 數值越多越不許確 #decimal 小數推薦用這個,可是 decimal(m,d) 這裏的m是指包括小數在內的總位數 # 字符串: #char char(10) 無論字段值多少個,存儲一定是10個位置,可是速度快,由於在搜索的時候,固定只要每10個,10個位置找就好了,不用顧慮字段值多大 #varchar varchar(10) 好比輸入root,就只佔用4個空間,可是速度慢 # char(20) 和 varchar(20) 都只能最多存儲20個字符。超過20個字符會自動截掉 #sql優化手段,建立數據表字段的時候,把定長的放前面用char,相似地址要放最後,採用varchar #Varchar(m) 最大字節65535 可變長度 m取0-65535 只保存須要字符數,另加一個字節來聲明長度 #Char(m) 最大字節數255 定長類型 m可取0-255 它的右邊填充空格以達到指定長度,當檢索到char值時,尾部的空格被刪除掉 #text #mediumtext #longtext #若是比longtext還大,就不要用數據庫存了,寫成文件的格式,而後把路徑存到數據庫 #對於上傳文件,要把文件存硬盤,只把路徑存數據庫 # 有4種text類型:tinytext、text、mediumtext和longtext。這些對應4種blob類型,有相同的最大長度和存儲需求。 # blob 列被視爲二進制字符串(字節字符串)。 # text列被視爲非二進制字符串(字符字符串)。 # blob列沒有字符集,而且排序和比較基於列值字節的數值值。 # text列有一個字符集,而且根據字符集的 校對規則對值進行排序和比較。 #時間類型: #datatime #其餘類型: #枚舉 enum #集合 set # 集合類型 # A SET column can have a maximum of 64 distinct members. # 示例: # CREATE TABLE myset (col SET('a', 'b', 'c', 'd')); # INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d'); # SET 的值,裏面只能填 abcd這四個值的任意組合
#總覽 # 【1】bit[(M)] # 二進制位(101001),m表示二進制位的長度(1-64),默認m=1 # # 【2】tinyint[(m)] [unsigned] [zerofill] # 小整數,數據類型用於保存一些範圍的整數數值範圍: # 有符號: -128 ~ 127. # 無符號:0 ~ 255 # 特別的: MySQL中無布爾值,使用tinyint(1)構造。 # # 【3】int[(m)][unsigned][zerofill] # 整數,數據類型用於保存一些範圍的整數數值範圍: # 有符號:-2147483648 ~ 2147483647 # 無符號:0 ~ 4294967295 # 特別的:整數類型中的m僅用於顯示,對存儲範圍無限制。例如: int(5),當插入數據2時,select 時數據顯示爲: 00002 # # 【4】bigint[(m)][unsigned][zerofill] # 大整數,數據類型用於保存一些範圍的整數數值範圍: # 有符號:-9223372036854775808 ~ 9223372036854775807 # 無符號:0 ~ 18446744073709551615 # # 【5】decimal[(m[,d])] [unsigned] [zerofill] # 準確的小數值,m是數字總個數(負號不算),d是小數點後個數。 m最大值爲65,d最大值爲30。 # 特別的:對於精確數值計算時須要用此類型decaimal可以存儲精確值的緣由在於其內部按照字符串存儲。 # # 【6】FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] # 單精度浮點數(非準確小數值),m是數字總個數,d是小數點後個數。 # 有符號:-3.402823466E+38 to -1.175494351E-38,0,1.175494351E-38 to 3.402823466E+38 # 無符號: 0,1.175494351E-38 to 3.402823466E+38 # **** 數值越大,越不許確 **** # # 【7】DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] # 雙精度浮點數(非準確小數值),m是數字總個數,d是小數點後個數。 # 有符號:-1.7976931348623157E+308 to -2.2250738585072014E-308,0,2.2250738585072014E-308 to 1.7976931348623157E+308 # 無符號:0,2.2250738585072014E-308 to 1.7976931348623157E+308 # **** 數值越大,越不許確 **** # # # 8】char (m) # char數據類型用於表示固定長度的字符串,能夠包含最多達255個字符。其中m表明字符串的長度。 # PS: 即便數據小於m長度,也會佔用m長度 # # 【9】varchar(m) # varchars數據類型用於變長的字符串,能夠包含最多達255個字符。其中m表明該數據類型所容許保存的字符串的最大長度,只要長度小於該最大值的字符串均可以被保存在該數據類型中。 # 注:雖然varchar使用起來較爲靈活,可是從整個系統的性能角度來講,char數據類型的處理速度更快,有時甚至能夠超出varchar處理速度的50%。所以,用戶在設計數據庫時應當綜合考慮各方面的因素,以求達到最佳的平衡 # # 【10】text # text數據類型用於保存變長的大字符串,能夠組多到65535 (2**16 − 1)個字符。 # # 【11】mediumtext # A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters. # # 【12】longtext # A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters. # # # 【13】enum # 枚舉類型, # An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.) # 示例: # CREATE TABLE shirts ( # name VARCHAR(40), # size ENUM('x-small', 'small', 'medium', 'large', 'x-large') # ); # INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small'); # # 【14】set # 集合類型 # A SET column can have a maximum of 64 distinct members. # 示例: # CREATE TABLE myset (col SET('a', 'b', 'c', 'd')); # INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d'); # # 【15】DATE # YYYY-MM-DD(1000-01-01/9999-12-31) # # 【16】TIME # HH:MM:SS('-838:59:59'/'838:59:59') # # 【17】YEAR # YYYY(1901/2155) # # 【18】DATETIME # YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y) # # 【19】TIMESTAMP # YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時)
表格的建立,表格的約束:字段名,數據類型,是否爲null,默認值,是否自增,主鍵,以及表格的增刪改查,字段的操做。服務器
查看錶格結構的兩個語句 show create table table table_name \G; desc table_name;session
#因爲咱們在 my.ini中已經配置了默認信息,因此 default信息能夠不用寫 # engine=innodb default charset=utf8 #mysql中的引擎: #innodb:事務功能和行級鎖,好比原子性操做,表示一條操做若是有一部分失敗了,那麼整條操做會回滾 #myisam: 全局索引,存儲速度快 #create database 【db名】defalut charset utf8; #建立表 #create table table_name(字段1 類型,字段2 類型...) default charset=utf8; #!!字段後能夠跟 類型,是否null(默認不爲空),默認值,auto_increment,primary key #create table table_name( 字段1 類型 null, # 字段2 類型 not null, # 字段3 類型 not null default=1, # 字段3 類型 not null auto_increment primary key... # )engine=innodb default charset=utf8; # auto_increment 表示:自增 #與primarykey綁定使用,一張表只能有一個自增 (id int auto_increment primary key,) # primary key: 表示 約束(不能重複且不能爲空); 加速查找 (保證數據的惟一性),一張表只能有一個主鍵 #刪除表: drop table table_name; #查看建立表的語句 show create table table_name; #修改字段類型: # alter table t1 change id1 id1 int; #插入 #insert into table_name(字段1,字段2..) values (列值1,列值2...),(列值1,列值2...) 可插入多行 #insert into table_name values (列值1,列值2...)要按順序每列都要 #INSERT INTO uses SET name = '姚明', age = 25; (很差用,仍是用上面的) #查看 #select * from table_name where 字段 = '字段值'; #清空表: # delete from table_name where 字段 = '字段值'; #delete from table_name; 刪除表所有值 #讓id從刪除的項開始自增 #truncate table table_name; #id會從最原始開始i自增 #更新: #update table_name set 字段 = '新字段值' where 字段 = '字段值'; ''' #修改表的列屬性 # alter table 表名 change 原列名 新列名 類型; --修改表的列屬性名 # alter table 表名 modify 列名 類型 ; --修改表的類類型 # alter table 表名 drop 列名; --刪除表的某一列 # alter table 表名 add 列名 類型; --添加某一列 # alter table 表名 rename 新表名; --修改表名 '''
# Mysql增長主鍵或者更改表的列爲主鍵的sql語句 # 添加表字段 # alter table table1 add transactor varchar(10) not Null; # alter table table1 add id int unsigned not Null auto_increment primary key # 修改某個表的字段類型及指定爲空或非空 # alter table 表名稱 change 字段名稱 字段名稱 字段類型 [是否容許非空]; # alter table 表名稱 modify 字段名稱 字段類型 [是否容許非空]; # 修改某個表的字段名稱及指定爲空或非空 # alter table 表名稱 change 字段原名稱 字段新名稱 字段類型 [是否容許非空 # 刪除某一字段 # ALTER TABLE mytable DROP 字段 名; # # 添加惟一鍵 # ALTER TABLE `test2` ADD UNIQUE ( `userid`) # 修改主鍵 # ALTER TABLE `test2` DROP PRIMARY KEY ,ADD PRIMARY KEY ( `id` ) # # 增長索引 # ALTER TABLE `test2` ADD INDEX ( `id` ) #修改字段類型,並設置主鍵 # ALTER TABLE `category ` MODIFY COLUMN `id` int(11) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`id`); #建表後建立惟一索引: # create unique index UK_student_name on student (name); # 建表後添加約束 # alter table student add constraint uk_student_name unique (name); #1. select now(); 打印當前時間 #2. desc table_name; 查看字段的屬性 #3. show create table table_name ; 查看錶的建立代碼 #3. show create table table_name \G ; 豎着看,查看錶的建立代碼
# desc table_name; 查看列的屬性 #自增列的起始值修改: # show create table table_name \G ; 豎着看,查看錶的建立代碼 # 能夠看到auto_increment = 數值 #這個就是自增數列此時下一個要自增的id數 #修改自增列的值: #aler table table_name auto_increment = 你想要的數值; #取消自增列: #alter table table_name change id id int; #自增列的步長: # 1. mysql : 基於會話級別,一次mysql登錄使用,就是一次會話 #show session variables like 'auto_inc%'; 查看步長 #set session auto_increment_increment=2; #設置步長 #set session auto_increment_offset=10; #設置起始值 #基於全局級別的,應用於全部會話全部表,【儘可能別使用】 #shwo global variables like 'auto_inc%'; #set global auto_increment_increment=2; #set global auto_increment_offset=10; #2.sql server: 基於表級別能夠在表最後 #)engine=inndb auto_increment=4,步長=5 default charset=utf8;
自增列步長,起始值的修改cors
#有道筆記20181006 mysql #惟一索引 : 看到索引立刻想到是 加速查找 #惟一 : 約束,不能重複 #約束功能: 主鍵,外鍵 #create table t1( id int auto_increment primary key, # num int, # name char(10), #unique 索引名 (num) #單列惟一索引 #index 索引名 (num) #建立普通索引 #unique 索引名 (num,name) #聯合惟一索引: 不能由兩行如出一轍的 num和name # #建表後建立惟一索引: # create unique index UK_student_name on student (name); # 建表後添加約束 # alter table student add constraint uk_student_name unique (name); #要先建聯合索引,乖乖刪除原來的索引,再操做吧 #刪除索引: # ALTER TABLE t1 DROP INDEX uq_name; # ERROR !!! :needed in a foreign key constraint問題 #要先乖乖刪除外鍵,才能繼續操做索引 #惟一索引和主鍵的區別: #惟一索引 能夠爲空 #主鍵 不能爲空
武老師博客目錄:http://www.cnblogs.com/wupeiqi/articles/5729934.html