當(dāng)前位置:首頁 > IT技術(shù) > 數(shù)據(jù)庫 > 正文

Database
2021-09-17 19:46:57

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/

開通會員,享受整站包年服務(wù)立即開通 >