時(shí)間:2020/9/21-2020/9/28
學(xué)習(xí)內(nèi)容:第一階段MYSQL教程第一章節(jié)到第七章節(jié)
心得體會(huì):
1.雖然說SQL的內(nèi)容自己之前掌握了很大一部分,但報(bào)班之后才發(fā)現(xiàn)自己很多知識(shí)點(diǎn)的細(xì)節(jié)沒有做到位,遇到深入一點(diǎn)的知識(shí)點(diǎn)或者題目就會(huì)很有些棘手,另外自己的知識(shí)體系系統(tǒng)性仍需加強(qiáng)扒俯。
2.在sql的書寫過程中胯盯,特別是針對(duì)比較復(fù)雜的sql內(nèi)容書寫吭露,首先要耐心一點(diǎn),理清自己的思路伊滋,一步步分析題目的條件,寫出一個(gè)條件之后去思考下一個(gè)條件严里,而不要短期內(nèi)就追求一步到位新啼,對(duì)于題目有自己的分析思路更重要,哪怕前期語句不夠簡潔刹碾,后期可以優(yōu)化燥撞。
后續(xù)目標(biāo):努力練習(xí)做到最多5分鐘之內(nèi)不管什么難度的一道sql題目都可以解出來
后期安排:抓住利用運(yùn)營工作的機(jī)會(huì),盡可能多去了解業(yè)務(wù)迷帜,把自己技能上的薄弱點(diǎn)增強(qiáng)物舒,做好就業(yè)班項(xiàng)目練習(xí)
知識(shí)點(diǎn)歸納
階段1 mysql教程
數(shù)據(jù)庫的作用
存儲(chǔ)數(shù)據(jù)
相對(duì)于Excel,數(shù)據(jù)庫的存儲(chǔ)數(shù)據(jù)量更大戏锹,讀寫速度高冠胯,程序支持性好
數(shù)據(jù)庫
數(shù)據(jù)庫是有一系列表構(gòu)成的數(shù)據(jù)集合
由列和行構(gòu)成,列成為字段锦针,行成為紀(jì)錄
主鍵:唯一標(biāo)識(shí)的紀(jì)錄字段
關(guān)系型數(shù)據(jù)庫
表與表之間可以相互關(guān)聯(lián)的數(shù)據(jù)庫
RDBMS——關(guān)系型數(shù)據(jù)庫管理系統(tǒng)
SQL
不區(qū)分大小寫
數(shù)據(jù)完整性
如何完整:數(shù)據(jù)類型+約束
數(shù)據(jù)類型
使用數(shù)據(jù)類型的原則是:夠用就行荠察,盡量使用取值范圍小的,而不用大的奈搜,這樣可以更多的節(jié)省存儲(chǔ)空間
常用數(shù)據(jù)類型如下:
整數(shù):int悉盆,bit
小數(shù):decimal
字符串:varchar,char
日期時(shí)間:?date, time, datetime
枚舉類型(enum)——例如:enum('男','女')
特別說明的類型如下:
decimal表示浮點(diǎn)數(shù)馋吗,如decimal(5,2)表示共存5位數(shù)焕盟,小數(shù)占2位
char表示固定長度的字符串,如char(3)宏粤,如果填充'ab'時(shí)會(huì)補(bǔ)一個(gè)空格為'ab '
varchar表示可變長度的字符串脚翘,如varchar(3),填充'ab'時(shí)就會(huì)存儲(chǔ)'ab'
字符串text表示存儲(chǔ)大文本绍哎,當(dāng)字符大于4000時(shí)推薦使用
對(duì)于圖片来农、音頻、視頻等文件崇堰,不存儲(chǔ)在數(shù)據(jù)庫中沃于,而是上傳到某個(gè)服務(wù)器上,然后在表中存儲(chǔ)這個(gè)文件的保存路徑
約束
主鍵primary key
非空 not null
唯一unique
默認(rèn)default
外鍵foreign key:對(duì)關(guān)系字段進(jìn)行約束,當(dāng)為關(guān)系字段填寫值時(shí)揽涮,會(huì)到關(guān)聯(lián)的表中查詢此值是否存在抠藕,如果存在則填寫成功,如果不存在則填寫失敗并拋出異常(說明:雖然外鍵約束可以保證數(shù)據(jù)的有效性蒋困,但是在進(jìn)行數(shù)據(jù)的crud(增加盾似、修改、刪除雪标、查詢)時(shí)零院,都會(huì)降低數(shù)據(jù)庫的性能,所以不推薦使用村刨,那么數(shù)據(jù)的有效性怎么保證呢告抄?答:可以在邏輯層進(jìn)行控制)
數(shù)據(jù)庫的設(shè)計(jì)
基本要滿足三范式
第一范式(1NF):強(qiáng)調(diào)的是列的原子性,即列不能夠再分成其他幾列嵌牺。
第二范式(2NF):首先是 1NF打洼,另外包含兩部分內(nèi)容,一是表必須有一個(gè)主鍵逆粹;二是沒有包含在主鍵中的列必須完全依賴于主鍵募疮,而不能只依賴于主鍵的一部分。
第三范式(3NF):首先是 2NF僻弹,另外非主鍵列必須直接依賴于主鍵阿浓,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴于非主鍵列 B蹋绽,非主鍵列 B 依賴于主鍵的情況芭毙。
第二章節(jié)
數(shù)據(jù)庫的連接
1 命令行查詢——mysql(部分不行)
2 window+R? 輸入mysql路徑bin目錄——mysql -utest -p/mysql -uroot -pmysql
3使用navicat或者workbench連接
數(shù)據(jù)庫操作
顯示版本——select version();
查看時(shí)間——select now();
查看數(shù)據(jù)庫——show databases;
查看現(xiàn)在使用的數(shù)據(jù)庫——select? database();
使用某個(gè)數(shù)據(jù)庫——use 數(shù)據(jù)庫名卸耘;
創(chuàng)建數(shù)據(jù)庫(不指定字符集)——create database 數(shù)據(jù)庫名退敦;
創(chuàng)建數(shù)據(jù)庫(指定字符集)——create database 數(shù)據(jù)庫名?charset=utf8;
查看數(shù)據(jù)庫的創(chuàng)建——show create database 數(shù)據(jù)庫名鹊奖;
數(shù)據(jù)表操作
若沒有進(jìn)入某數(shù)據(jù)庫苛聘,要在表前面加上 (數(shù)據(jù)庫名).表名
查看當(dāng)前數(shù)據(jù)庫的所有表——show tables涂炎;
創(chuàng)建表 ——create table(列名 數(shù)據(jù)類型 約束忠聚,列名2 數(shù)據(jù)類型 約束.......)
查看表的信息——desc 表名;
查看表的創(chuàng)建語句——show create table 表名唱捣;
更改表(增加列)——ALTER TABLE 表名?ADD?列名?數(shù)據(jù)類型 約束两蟀;
更改表(修改列modify)——ALTER TABLE 表名 MODIFY 列名 類型+約束;
更改表(修改列change)——ALTER TABLE 表名?CHANGE?原列名 新列名?類型+約束震缭;
更改表(刪除類)——ALTER TABLE表名 DROP 列名赂毯;
刪除表——drop table 表名;(刪除不存在的表會(huì)報(bào)錯(cuò))
數(shù)據(jù)操作
插入數(shù)據(jù)INSERT(全部列) ——INSERT INTO 表名 VALUES(第一行第一列,第一行第二列....),(第二行第一列党涕,第二行第二列.........).......
插入數(shù)據(jù)INSERT(部分列單行插入)——INSERT INTO 表名(列1烦感,列2) VALUES(列1第一行,列2第一行)
插入多行數(shù)據(jù)——INSERT INTO 表名(列1膛堤,列2) VALUES(列1第一行手趣,列2第一行),(列1第二行肥荔,列2第二行)........
更改數(shù)據(jù)UPDATE——update?表名?set 列名 = 值(where 列名 = 某值)绿渣;
查找數(shù)據(jù)——select 列名1,列名2.../* from 表名燕耿;
查找數(shù)據(jù)作為別名——select 列名1中符,列名2...as別名 from 表名;
(物理刪除)刪除某行數(shù)據(jù)—— delect from 表名 where 列名 = 值誉帅;
(邏輯刪除)——1 增加列 isdelete——2?update 表名 set isdelete = 1?(where 列名 = 值)
(很少用)數(shù)據(jù)備份:mysqldump –uroot –p 數(shù)據(jù)庫名 > python.sql;
(很少用)數(shù)據(jù)恢復(fù):mysql -uroot –p 新數(shù)據(jù)庫名 < python.sql
第三章節(jié) 查詢1
簡單查詢
查詢?nèi)? SELECT * FROM 表淀散;
查詢部分列? SELECT 列名1,列名2....FROM 表名蚜锨;
查詢并且命名別名: SELECT 列名 AS 別名吧凉, 列名2 FROM 表名 AS 別名2;(取了別名的表必須要用踏志,不然會(huì)出錯(cuò))
去重查詢: SELECT DISTINCT 列名? FROM 表名阀捅;
條件查詢 WHERE 條件
注意語序:邏輯——NOT 條件
? ? ? ? ? ? ? ?空值判斷——?IS NOT NULL
比較查詢:
等于: =
大于: >
大于等于: >=
小于: <
小于等于: <=
不等于: != 或 <>
邏輯查詢:
and
or
not
模糊查詢LIKE
like
%表示任意多個(gè)任意字符
'x%'——以x開頭, ‘%x%’——含有x针余,不管開頭結(jié)尾饲鄙,‘%x’——以x結(jié)尾
_表示一個(gè)任意字符
‘__’——有兩個(gè)字符? ‘__%’——至少有連個(gè)字符,后面還有其他的
范圍查詢:
in表示在一個(gè)非連續(xù)的范圍內(nèi)
in(條件1圆雁,條件2忍级,條件3)——非連續(xù)集合
between....and....——連續(xù)性集合
空值查詢:
注意:null與''是不同的
判空is null
排序查詢 order by
一個(gè)字段排序: ......ORDER BY 字段 (DESC/ASC)
多個(gè)字段排序:........ORDER BY 字段1,字段2伪朽,字段3(注意有先后順序......,轴咱,如果都分不出來,最后默認(rèn)按主鍵排序)
聚合函數(shù)
數(shù)量——SELECT COUNT(列名/*)FROM 表名烈涮;
最大值——SELECT MAX(列名/*)FROM 表名朴肺;
最小值——SELECT?MIN(列名/*)FROM 表名;
平均值——SELECT AVG(列名/*)FROM 表名坚洽;
求和值——SELECT?SUM(列名/*)FROM 表名戈稿;
保留小數(shù)位數(shù)——SELECT?ROUND(值,保留的小數(shù)位數(shù))FROM 表名讶舰;(注意鞍盗,round可以保留負(fù)數(shù)的小數(shù)位數(shù)需了,指小數(shù)點(diǎn)前面進(jìn)多少位)
分組查詢GROUP BY
查詢某字段有幾種——SELECT 某列 FROM 表名 GROUP BY 某列?;
查詢某字段有幾種,各類的統(tǒng)計(jì)值多少——SELECT 某列般甲,COUNT/AVG/MIN/MAX/SUM(*/列名)?FROM 表名 GROUP BY 某列;
對(duì)分組值限定條件——SELECT 某列 FROM 表名 GROUP BY 某列?HAVING 條件肋乍;
group concat函數(shù)——select 列名,group_concat(列名2)? from 表名 group by 列名; (把所有這個(gè)列名的類相關(guān)列全部聯(lián)在一起作為查詢內(nèi)容)
with rollup匯總——?select 列名,group_concat(列名2)? from 表名 group by 列名 with rollup;(與不加 with rollup 相比多了一行匯總求和選項(xiàng))
第四章節(jié)? MYSQL查詢2
分頁查詢
limit start(開始顯示位置),count(顯示條數(shù))——限制結(jié)果條數(shù)
limit 放在所有語句的最后
每頁顯示x個(gè)敷存,第n個(gè)頁面——limit (n-1)*x,x
內(nèi)連接
沒有別名:select 表1.某列住拭,表2.某列........from 表1 inner join 表2 on 表1.列1 = 表2.列2
有別名:select 表1.某列,表2.某列........from 表1?as 別名1?inner join 表2?as 別名2?on 表1.列1 = 表2.列2
為什么內(nèi)連接一定有 on語句?——確定和誰關(guān)聯(lián)历帚,如果不確定滔岳,那和誰都可以關(guān)聯(lián)(笛卡爾積),這樣的結(jié)果不具意義
最好不要用where 那種寫法
左連接
inner join = 兩個(gè)表都有的交集
left join/right join?= 取其中一個(gè)表的全部(包括兩者都有的交集)挽牢,具體以left/right位置為主
子查詢
標(biāo)量子查詢(查詢一個(gè)值)
行級(jí)子查詢(查詢一行值)
select * from students
where (gender,height) = (select gender, max(height) from students where gender=1);
該案例中?gender,height是一行記錄谱煤,子查詢與之匹配
列級(jí)子查詢(查詢一列值)
select * from students
where cls_id IN (select id from classes);
該案例中注意子查詢查的是一列數(shù)據(jù)因此不可能是一個(gè),要用 IN
完整的select語句
selectdistinct*from表名where....groupby...having...orderby...limitstart,count
執(zhí)行順序?yàn)椋?/b>
from 表名 >?where ....?>group by ...?>select distinct *?>having ...?>order by ...?>limit start,count
第五章視圖(工作中較為少用)
視圖
注意:1 show tables 可以查到視圖??2 視圖不存儲(chǔ)數(shù)據(jù)禽拔,即使原數(shù)據(jù)改變刘离,結(jié)果也不會(huì)改變?
用視圖解決的問題——比如列名更改后,視圖也不會(huì)改變查詢結(jié)果
創(chuàng)建視圖:create view 視圖名? ? as? select 語句睹栖;
刪除視圖 : drop view 視圖名硫惕;
使用視圖:select*from視圖名;
事務(wù)
原子性(atomicity)
一個(gè)事務(wù)必須被視為一個(gè)不可分割的最小工作單元,整個(gè)事務(wù)中的所有操作要么全部提交成功野来,要么全部失敗回滾恼除,對(duì)于一個(gè)事務(wù)來說,不可能只執(zhí)行其中的一部分操作曼氛,這就是事務(wù)的原子性
一致性(consistency)
數(shù)據(jù)庫總是從一個(gè)一致性的狀態(tài)轉(zhuǎn)換到另一個(gè)一致性的狀態(tài)豁辉。(在前面的例子中,一致性確保了舀患,即使在執(zhí)行第三徽级、四條語句之間時(shí)系統(tǒng)崩潰,支票賬戶中也不會(huì)損失200美元聊浅,因?yàn)槭聞?wù)最終沒有提交餐抢,所以事務(wù)中所做的修改也不會(huì)保存到數(shù)據(jù)庫中。)
隔離性(isolation)
通常來說低匙,一個(gè)事務(wù)所做的修改在最終提交以前旷痕,對(duì)其他事務(wù)是不可見的。(在前面的例子中努咐,當(dāng)執(zhí)行完第三條語句苦蒿、第四條語句還未開始時(shí)殴胧,此時(shí)有另外的一個(gè)賬戶匯總程序開始運(yùn)行渗稍,則其看到支票帳戶的余額并沒有被減去200美元佩迟。)
持久性(durability)
一旦事務(wù)提交,則其所做的修改會(huì)永久保存到數(shù)據(jù)庫竿屹。(此時(shí)即使系統(tǒng)崩潰报强,修改的數(shù)據(jù)也不會(huì)丟失。)
開始事務(wù)——start transaction拱燃; +語句(增刪改查)秉溉;......? 結(jié)束事務(wù)(提交)——commit; /結(jié)束事務(wù)(撤銷)——rollback碗誉;
注意:一旦提交就不可更改
注意:書寫時(shí)每一句都要寫分號(hào)召嘶,事務(wù)中每一句話都是單獨(dú)語句,表的引擎類型必須是innodb類型才可以使用事務(wù)
作用:增加查詢速度?
索引
加快查詢速度哮缺,優(yōu)化查詢工具
原理:把有相似元素的內(nèi)容放在一起成為一個(gè)“組”弄跌,直接在這個(gè)“組”里找內(nèi)容
開始時(shí)間監(jiān)測(cè):?set profiling =1;
創(chuàng)建索引: create index 索引名?on 表名(列名);
查看操作時(shí)間:show profiles尝苇;
第六章? 時(shí)間函數(shù)(新內(nèi)容)
獲取當(dāng)前時(shí)間
select now()與select sysdate( )
兩者區(qū)別:?Now在輸出結(jié)果前就已經(jīng)得到結(jié)果铛只,?Sys date可以保持是實(shí)時(shí)更新
select?now(),??sleep(3),now();?中sleep指時(shí)間往后面走3秒,前后兩個(gè)now()時(shí)間保持不變select?sysdate(),??sleep(3),sysdate(); 前后兩個(gè)sysdate()時(shí)間相差3秒
獲取當(dāng)前年月日
select current_date()/select curdate()——兩者分別表示完整與縮寫糠溜,沒有區(qū)別
獲取當(dāng)前時(shí)分秒
select current_time()/select curtime()——兩者分別表示完整與縮寫淳玩,沒有區(qū)別
字符串和日期相互轉(zhuǎn)換
str_to_date函數(shù)——將文本轉(zhuǎn)化為日期(新內(nèi)容)
格式 描述
%Y 年,4 位
%y 年非竿,2 位
%M 英文名稱的月名(一月為January蜕着,二月為February)
%m 數(shù)值月份 (00-12)
%D 帶有英文后綴的天(不太直觀)
%d 數(shù)值天 (00-31)
%H 小時(shí) (00-23)
%h 小時(shí) (01-12)
%I 小時(shí) (01-12)
%i 分鐘,數(shù)值(00-59)
%S 秒(00-59)
%s 秒(00-59)
%a 英文縮寫星期名
%b 英文縮寫月名
%c 月红柱,數(shù)值
%f 微秒
%p 顯示是 AM 還是 PM
%r 顯示時(shí)分秒時(shí)間侮东,12小時(shí)制(hh:mm:ss AM 或 PM)
%T 顯示時(shí)分秒時(shí)間, 24小時(shí)制 (hh:mm:ss)
%j 顯示當(dāng)前日期是今年的第幾天 (001-366)
注意,前后參數(shù)格式一定要一致
select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09
select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09
select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); --2008-08-09 08:09:30
日期轉(zhuǎn)換為字符串(易錯(cuò)點(diǎn))
dateformat——日期轉(zhuǎn)換為字符串
select date_format(now(),'%Y-%M-%d %H') ; -- 2020-May-23 17
select date_format('2020-02-03 13:45:06.676','%Y-%M-%D %I:%i:%S-%T') ; --2020-February-3rd 01:45:06-13:45:06
提取日期信息
直接用year豹芯、month 等函數(shù)提取悄雅,不建議使用extract函數(shù)
時(shí)間函數(shù)名作用
date獲取日期(年月日)
time獲取時(shí)間(時(shí)分秒)
year獲取年份
month獲取月份
day獲取日
hour獲取時(shí)
minute獲取分
second獲取秒
microsecond獲取毫秒
quarter獲取季度
week獲取周
weekofyear獲取周
dayofyear日期在年度中第幾天
dayofmonth日期在月度中第幾天
dayofweek日期在周中第幾天;周日為第一天
weekday日期在周中第幾天铁蹈;周二為第一天
yearweek年和周
dayname返回英文星期
monthname返回英文月份
last_day返回月份中最后一天
SELECT TIME('2018-05-15 10:37:14.123456');-- 獲取時(shí)間:10:37:14.123456
SELECT YEAR('2018-05-15 10:37:14.123456');-- 獲取年份: 2018
SELECT MONTH('2018-05-15 10:37:14.123456');-- 獲取月份: 5
SELECT DAY('2018-05-15 10:37:14.123456');-- 獲取日:15
SELECT HOUR('2018-05-15 10:37:14.123456');-- 獲取時(shí):10
SELECT MINUTE('2018-05-15 10:37:14.123456');-- 獲取分:37
SELECT SECOND('2018-05-15 10:37:14.123456');-- 獲取秒:14
SELECT MICROSECOND('2018-05-15 10:37:14.123456');-- 獲取毫秒:123456
SELECT QUARTER('2018-05-15 10:37:14.123456');-- 獲取季度:2
SELECT WEEK('2018-05-15 10:37:14.123456');-- 獲取周:19
日期數(shù)據(jù)計(jì)算
將日期進(jìn)行偏移
date_sub(date(偏移基準(zhǔn)), interval? ?數(shù)字? 日期單位)
date_add(date, interval 數(shù)字 日期單位)
時(shí)間函數(shù)名作用
YEAR增加減少年
MONTH增加減少月
DAY增加減少天
HOUR增加減少小時(shí)
MINUTE增加減少分鐘
SECOND增加減少秒
MICROSECOND增加減少毫秒
WEEK增加減少周
QUARTER增加減少季度
SECOND_MICROSECOND增加減少秒到毫秒
MINUTE_MICROSECOND增加減少分鐘到毫秒
MINUTE_SECOND增加減少分鐘到秒
HOUR_MICROSECOND增加減少小時(shí)到毫秒
HOUR_SECOND增加減少小時(shí)到秒
HOUR_MINUTE增加減少小時(shí)到分鐘
DAY_MICROSECOND增加減少天到毫秒
DAY_SECOND增加減少天到秒
DAY_MINUTE增加減少天到分鐘
DAY_HOUR增加減少天到小時(shí)
YEAR_MONTH增加減少年到月
select date_add('2008-08-08 10:12:33', interval '01:10:30' hour_second);
--偏移時(shí)間到秒宽闲,1小時(shí)10分30秒:2008-08-08 11:23:03
select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);
--偏移天到秒,1天1小時(shí)1分1秒:1997-12-30 22:58:59
兩個(gè)日期之間的計(jì)算
datediff(日期1握牧,日期2)
兩個(gè)時(shí)間之間的計(jì)算
timediff(時(shí)間1容诬,時(shí)間2)
兩個(gè)時(shí)間的制定差(推薦,新知識(shí))
timestampdiff(時(shí)間單位沿腰,開始時(shí)間值览徒,結(jié)束時(shí)間值)
unit格式unit實(shí)際含義
YEAR年份
MONTH月份
DAY天
HOUR小時(shí)
MINUTE分鐘
SECOND秒
MICROSECOND微秒
QUARTER季度
WEEK周
select timestampdiff(year,'2002-05-01','2001-01-01');-- -1
select timestampdiff(day,'2002-05-01','2001-01-01');-- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00');-- -12
timestampdiff用來計(jì)算生日十分有用,沒有滿一年的就算不出結(jié)果