1.存儲數(shù)據(jù)的方式有哪些
?特定的文件/內(nèi)存/第三方云服務(wù)器/數(shù)據(jù)庫服務(wù)器
2.什么是數(shù)據(jù)庫
?數(shù)據(jù)庫按照特定的形式來組織存放數(shù)據(jù),目的是了更好的操作數(shù)據(jù) —— 增刪改查
?(1)數(shù)據(jù)庫的發(fā)展歷史
?網(wǎng)狀數(shù)據(jù)庫 ?-> ?層次型數(shù)據(jù)庫??-> ?關(guān)系型數(shù)據(jù)庫(RDBMS) ?-> ?非關(guān)系型數(shù)據(jù)庫(NoSQL)
?(2)關(guān)系型數(shù)據(jù)庫的邏輯結(jié)構(gòu)
?Server ??-> ?Database ?-> ?Table ?-> ?Row ?-> ?Column 數(shù)據(jù)庫服務(wù)器 ?數(shù)據(jù)庫????????數(shù)據(jù)表???????行??????????列
?MySQL3.mysql數(shù)據(jù)庫
?MariaDB
?Xampp:服務(wù)器套裝,包含多款服務(wù)器端軟件,例如:MySQL、Apache…
??服務(wù)器端:負(fù)責(zé)存儲/維護(hù)數(shù)據(jù) —— 銀行的數(shù)據(jù)庫服務(wù)器
???C:/xampp/mysql/bin/mysqld.exe????啟動文件
???占用端口3306
??客戶端:負(fù)責(zé)連接數(shù)據(jù)庫服務(wù)器,對數(shù)據(jù)執(zhí)行操作?—— ATM機(jī)
???C:/xampp/mysql/bin/mysql.exe????客戶端文件
?(2)使用客戶端連接服務(wù)器端
??mysql.exe ?-h127.0.0.1 ?-P3306 ??-uroot ?-p
??-h ??host ??要連接的服務(wù)器的域名或者IP地址???127.0.0.1?/ localhost
??-P ??port ??端口號
??-u ??user ??用戶名??root是mysql的管理員用戶
??-p ??password ???密碼????xampp下root的密碼是空
??mysql ??-uroot????簡寫形式
?結(jié)尾不能加分號
?(3)常用的管理命令
??quit;???退出服務(wù)器的連接
??show ??databases;???顯示當(dāng)前數(shù)據(jù)庫服務(wù)器下所有的數(shù)據(jù)庫
??use ??數(shù)據(jù)庫名稱;???進(jìn)入到指定的數(shù)據(jù)庫
??show ?tables;???顯示當(dāng)前數(shù)據(jù)庫下所有的數(shù)據(jù)表
??desc ?數(shù)據(jù)表名稱;???描述數(shù)據(jù)表中都有哪些列
?4.SQL命令
?結(jié)構(gòu)化查詢語言,用于操作關(guān)系型數(shù)據(jù)庫服務(wù)器,主要是數(shù)據(jù)進(jìn)行增刪改查
?SQL命令的執(zhí)行方式
?(1)交互模式
??客戶端輸入一行,點(diǎn)擊回車,服務(wù)器端就會執(zhí)行一行,適用于臨時(shí)性的查看數(shù)據(jù)。
?(2)腳本模式
??客戶端把要執(zhí)行的命令寫在一個(gè)腳本文件中,然后一次性的提交給服務(wù)器執(zhí)行,適用于批量的操作數(shù)據(jù)
??在建立連接之前
?????mysql ?-uroot<拖拽要運(yùn)行的腳本過來???
??(3)SQL命令的語法規(guī)范
??一行命令可以跨越多行,以英文的分號結(jié)束
??SQL命令不區(qū)分大小寫,習(xí)慣上關(guān)鍵字大寫,非關(guān)鍵字小寫
??假設(shè)某一條命令出現(xiàn)語法錯(cuò)誤,則此條命令以及后邊所有命令不再執(zhí)行
??分為單行注釋(#..)和多行注釋(/*…*/),注釋的代碼服務(wù)器不執(zhí)行
5.SQL命令
?(1)丟棄數(shù)據(jù)庫如果存在
??drop ?database ?if ?exists ?web;
?(2)創(chuàng)建新的數(shù)據(jù)庫
??create ?database ?web;
?(3)進(jìn)入數(shù)據(jù)庫
??use ?web;
?(4)創(chuàng)建數(shù)據(jù)表
??create ?table ?student(
id ?int,
name ?varchar(16),
sex ?varchar(1),
score ?int
);
?(5)插入數(shù)據(jù)
??insert ?into ?student ?values(‘1’, … );
?(6)查詢數(shù)據(jù)
??select ?* ?from ?student;
(7)修改數(shù)據(jù)
??update ?user ?set ?email=’tao@163.com’,…. ??where ?uid=’3’;
?(8)刪除數(shù)據(jù)
??delete ?from ?user ?where ?uid=’2’;
6.計(jì)算機(jī)如何存儲字符
?(1)如何存儲英文字符
??ASCII:對所有的英文字母及其符號進(jìn)行了編碼,總共有128個(gè)
??Latin-1:總共有256,對歐洲字符進(jìn)行了編碼,兼容ASCII碼
?(2)如何存儲中文字符
??GB2312:對常用的6000多漢字進(jìn)行了編碼,兼容ASCII碼
??GBK:對2萬多的漢字進(jìn)行了編碼,兼容GB2312
??BIG5:臺灣繁體字編碼
??Unicode:對世界上主流國家常用的語言進(jìn)行了編碼,總共有三種存儲方案,分別是utf-8,utf-16,utf-32
?(3)mysql中文亂碼產(chǎn)生的原因
??mysql默認(rèn)使用Latin-1編碼
?(4)解決mysql中文亂碼
??腳本文件另存為的編碼為utf-8
??客戶端連接服務(wù)器端的編碼為utf-8
??????set ?names ?utf8
??服務(wù)器端創(chuàng)建數(shù)據(jù)庫使用的存儲編碼為utf-8
??????charset=utf8
?7.列類型
?創(chuàng)建表的時(shí)候,指定的類所能存儲的數(shù)據(jù)類型
?create ?table ?news(
???nid ?列類型
);
?(1)數(shù)值型?——?引號可以省略
??tinyint??微整型,占1個(gè)字節(jié),范圍-128~127
??smallint??小整型,占2個(gè)字節(jié),范圍-32768~32767
??int??整型,占4個(gè)字節(jié),范圍-2147483648~2147483647
??bigint??大整型,占8個(gè)字節(jié),范圍很大
??float ??單精度浮點(diǎn)型,占4個(gè)字節(jié),比int存儲的大得多,以犧牲小數(shù)點(diǎn)后的若干位為代價(jià),存儲的值越大精度越低
??double ??雙精度浮點(diǎn)型,占8個(gè)字節(jié),比bigint存儲的大得多,以犧牲小數(shù)點(diǎn)后的若干位為代價(jià),存儲的值越大精度越低
??decimal(M,D)???定點(diǎn)小數(shù),小數(shù)點(diǎn)不會發(fā)生變化,M代表總的有效位數(shù),D代表小數(shù)點(diǎn)后的有效位數(shù)
??boolean/bool???布爾型,只有兩個(gè)值,分別是true(真)和false(假),用于存儲只有那個(gè)值的數(shù)據(jù),布爾型在使用的時(shí)候會自動轉(zhuǎn)為tinyint,也可以直接插入1或者0
?true和false屬于關(guān)鍵字,使用的時(shí)候不能加引號
?(2)日期時(shí)間型?——?必須加引號
??date???日期型???‘2020-12-25’
??time???時(shí)間型???‘15:22:30’
??datetime???日期時(shí)間型??‘2020-12-25 ?15:22:30’
?(3)字符串型?—— 必須加引號
??varchar(M)???變長字符串,幾乎不會產(chǎn)生空間浪費(fèi),數(shù)據(jù)操作速度相對慢,常用于保存變化長度的數(shù)據(jù),例如:姓名,標(biāo)題,詳情.. M的最大值是65535
??char(M) ??定長字符串,可能產(chǎn)生空間浪費(fèi),數(shù)據(jù)操作速度相對快,常用于保存固定長度的數(shù)據(jù),例如:手機(jī)號碼.. M的最大值是255
??text(M)???大型變長字符串,M的最大值是2
?
? 12345.6789
??1234.56789e1
??123.456789e2
??12.3456789e3
??1.23456789e4
?TB ??GB ??MB ??KB ??byte(字節(jié)) ??bit(位)
??1byte=8bit
??1 ??2 ??3 ???4 ???5 ???6 ????7
2進(jìn)制
??1 ?10 ?11 ?100 ?101 ?110 ?111
選擇合理的列類型
create table t1(
??id ?int,
??age ?tinyint,
??title ?varchar(32),
??birthday ?date,
??sex ?boolean, ?
??salary ?decimal(7,2), ???#99999.99
??phone ?char(11)
);
?4.列約束
?mysql可以對要插入的數(shù)據(jù)進(jìn)行驗(yàn)證,只有符合條件才允許插入
?例如:編號不允許重復(fù)、性別只能是男或者女、一個(gè)人的成績在0~100之間…
?create ?table ?t1(
???lid ?int ?列約束
);
?(1)主鍵約束?—— primary key
??聲明了主鍵約束的列上不允許出現(xiàn)重復(fù)的值,一個(gè)表中只能有一個(gè)主鍵約束,通常加在編號列,可以加快數(shù)據(jù)的查找速度
??主鍵約束的列上不允許插入null
?null:空,表示一個(gè)暫時(shí)無法確定的值,例如:無法確定一個(gè)新員工的手機(jī)號碼、家庭住址
?null是關(guān)鍵字,使用的時(shí)候不能加引號
?(2)非空約束?—— not null
??聲明了非空約束的列禁止插入null
1.列約束
?(1)唯一約束?—— unique
??聲明了唯一約束的列不允許出現(xiàn)重復(fù)的值,一個(gè)表中可以使用多次
??(2)默認(rèn)值約束
??可以使用default關(guān)鍵字設(shè)置默認(rèn)值,具體兩種應(yīng)用方式
??insert ?into ?family ?values(60, default);#通過default關(guān)鍵字調(diào)用列的默認(rèn)值
??insert ?into ?family(fid) values(70); #沒有出現(xiàn)的列自動應(yīng)用默認(rèn)值
??(3)檢查約束?—— check
??也稱為自定義約束,用戶可以根據(jù)實(shí)際需求添加約束條件
??create ?table ?student(
????score ?tinyint ?check(score>=0 and score<=100)
);
?mysql不支持檢查約束,會嚴(yán)重的影響數(shù)據(jù)的插入速度,后期可以通過JS實(shí)現(xiàn)
?(4)外鍵約束
??聲明了外鍵約束的列,要插入的值必須在另一個(gè)表的主鍵列中出現(xiàn)才允許的插入
??外鍵列要和對應(yīng)的主鍵列的列類型保持一致
??foreign key(familyid) references ?family(fid)
?2.自增列?
?auto_increment:自動增長,聲明了自增列,只需要賦值為null,就會獲取最大值然后加1插入
?注意事項(xiàng):
???必須添加在主鍵形式的整數(shù)列
???允許手動賦值
??10 ?研發(fā)部????20 ?市場部????30 ?運(yùn)營部???40 ?測試部
?3.簡單查詢
?(1)查詢特定的列
??示例:查詢出所有員工的編號和姓名
??select eid,ename from emp;
???select ename,sex,birthday,salary from emp;
?(2)查詢所有的列
??select eid,ename,sex,birthday,salary,deptId from emp;
??select * from emp;
?(3)給列起別名
??示例:查詢出所有員工的編號和姓名,使用漢字別名
??select eid as 編號,ename as 姓名?from?emp;
???select ename as a,sex as b,birthday as c,salary as d from emp;
??select ename a,sex b,birthday c,salary d from emp;?
?(4)顯示不同的記錄
??示例:查詢出都有哪些性別的員工
??select distinct?sex ?from emp;
??示例:查詢出員工都分布在哪些部門
??select distinct deptId from emp;
?(5)查詢時(shí)執(zhí)行計(jì)算
??示例:計(jì)算1+2+3+4
??select ?1+2+3+4;
???select ename,salary*12 from emp;
???select ename 姓名,(salary+2000)*12+10000 年薪 from emp;
?(6)查詢的結(jié)果排序
??示例:查詢出所有的部門,結(jié)果按照編號升序排列
??select * from dept?order by did asc; #ascendant升序
??示例:查詢出所有的部門,結(jié)果按照編號降序排列
??select * from dept order by did desc; #descendant 降序
??示例:查詢出所有的員工,結(jié)果按照工資降序排列
??select * from emp order by salary desc;
??示例:查詢出所有的員工,結(jié)果按照生日的升序排列
??select * from emp order by birthday;
沒有排序規(guī)則,默認(rèn)是按照升序排列
按照字符串排列,是按照首個(gè)字符的Unicode碼排列
?示例:查詢出所有的員工,結(jié)果按照姓名排列
??select * from emp order by ename;
??示例:查詢出所有的員工,結(jié)果按照工資的降序排列,如果工資相同按照姓名排列
??Select * from emp order by salary desc,ename;
??示例:查詢出所有的員工,結(jié)果要求女員工顯示在前,如果性別相同按照年齡從大到小排列
??select * from emp order by sex,birthday;
?(7)條件查詢
??示例:查詢出編號為5的員工
??select * from emp where eid=5;
??示例:查詢出姓名為tao的員工
??select * from emp where ename='tao';
??示例:查詢出30號部門的員工有哪些
??select * from emp where deptId=30;
比較運(yùn)算符:>??< ?>= ?<= ?= ?!=(不等于)
??示例:查詢出不在30號部門的員工有哪些
??select * from emp where deptId!=30;
??示例:查詢出沒有明確部門的員工有哪些
??select * from emp where deptId is null;
??示例:查詢出有明確部門的員工有哪些
??select * from emp where deptId is not null;
? and?/?&&?并且???兩個(gè)條件都滿足才可以
? or??/ ||???或者???有一個(gè)條件滿足就可以
??示例:查詢出工資在8000以上女員工有哪些
??select * from emp where salary>8000 and sex=0;
??select * from emp where salary>8000 && sex=0;
??示例:查詢出工資在6000~8000之間的員工有哪些
??select * from emp where salary>=6000 && salary<=8000;
??示例:查詢出工資在6000以下或者8000以上的員工有哪些
??select * from emp where salary<6000 or salary>8000;
??select * from emp where salary<6000 ||?salary>8000;
??示例:查詢出1993年出生的員工有哪些
??select * from emp where birthday>='1993-1-1' && birthday<='1993-12-31';
??示例:查詢出20號或者30號部門的員工有哪些
??select * from emp where deptId=20 || deptId=30;
??select * from emp where deptId in(20,30);
??示例:查詢出不在20號并且不在30號部門的員工有哪些
??select * from emp where deptId!=20 and deptId!=30;
??select * from emp where deptId not in(20,30);
?(8)模糊條件查詢
??示例:查詢出姓名中含有a的員工有哪些
??select * from emp where ename?like '%a%';
??示例:查詢出姓名中以a結(jié)尾的員工有哪些
??select * from emp where ename like '%a';
??示例:查詢出姓名中倒數(shù)第2個(gè)字符是a的員工有哪些
??select * from emp where ename like '%a_';
%??匹配任意個(gè)字符??>=0
_ ??匹配任意1個(gè)字符 ?=1
以上兩個(gè)匹配的符號必須結(jié)合like關(guān)鍵字使用
?
本文摘自 :https://www.cnblogs.com/