sql中“delete from 表名”表示_SQL查询语句知识点总结
- 為什么要學(xué)習(xí)SQL?
SQL知識(shí)點(diǎn)總結(jié)1
- 數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)
什么是數(shù)據(jù)庫(kù)?什么是是sql?
數(shù)據(jù)庫(kù)database:用于存放數(shù)據(jù)的容器(一個(gè)文件或者一組文件)。區(qū)別于數(shù)據(jù)庫(kù)管理軟件(DBMS-database management system)。
SQL:數(shù)據(jù)庫(kù)查詢語言,Structured Query Language的簡(jiǎn)稱。SQL語言是用于操縱數(shù)據(jù)庫(kù)軟件的語言。
(為什么要使用數(shù)據(jù)庫(kù)?數(shù)據(jù)庫(kù)比excel有更多的優(yōu)點(diǎn):數(shù)據(jù)庫(kù)可以存放比excel更多的數(shù)據(jù),允許很多人同時(shí)使用數(shù)據(jù)。excel好比是移動(dòng)硬盤,數(shù)據(jù)庫(kù)好比是網(wǎng)盤很多人可以同時(shí)訪問里面的數(shù)據(jù)。)
- 關(guān)系數(shù)據(jù)庫(kù)的原理
關(guān)系數(shù)據(jù)庫(kù):多張表+各表之間的關(guān)系
需要掌握:多張表里每一張表的結(jié)構(gòu)是什么樣?各表之間的關(guān)系是什么樣的?
表的結(jié)構(gòu):表名;列;行
列名:知道這一列記錄的是什么數(shù)據(jù)。每一行記錄的是數(shù)據(jù)。每一行表示記錄學(xué)生的信息。
列名學(xué)號(hào)是用來唯一標(biāo)識(shí)一個(gè)學(xué)生的。為什么要用學(xué)號(hào)標(biāo)識(shí)數(shù)據(jù)的唯一性?姓名無法唯一標(biāo)識(shí),可能有重名。
主鍵:表中用來表示數(shù)據(jù)唯一性的列,叫主鍵。是關(guān)系數(shù)據(jù)庫(kù)的重要概念。
生活中,我們用主鍵來確定數(shù)據(jù)的唯一性,典型的例子:身份證證號(hào)。
各表之間的關(guān)系:關(guān)系數(shù)據(jù)庫(kù)是由多張表組成的。
聯(lián)結(jié)join:學(xué)生表和成績(jī)表之間通過學(xué)號(hào)關(guān)聯(lián)起來。關(guān)系就是數(shù)據(jù)能夠?qū)?yīng)的匹配。在關(guān)系數(shù)據(jù)庫(kù)中,這種數(shù)據(jù)集的關(guān)系叫做“聯(lián)結(jié)join”。(核心概念,在多表查詢中經(jīng)常用到。)
關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng):
關(guān)系數(shù)據(jù)庫(kù)原理:設(shè)計(jì)草圖;
實(shí)現(xiàn)數(shù)據(jù)庫(kù)原理的建筑人員:數(shù)據(jù)庫(kù)管理系統(tǒng),用來管理數(shù)據(jù)庫(kù)的計(jì)算機(jī)軟件。mysql,oracle,sql service.
操作數(shù)據(jù)庫(kù)的工具:sql,為了操作數(shù)據(jù)庫(kù)而開發(fā)的語言。對(duì)數(shù)據(jù)庫(kù)里的表進(jìn)行操作,修改查找等。(sql是操作數(shù)據(jù)庫(kù)的一種工具。)
把數(shù)據(jù)庫(kù)比作一碗米飯,里面放的米就是數(shù)據(jù),現(xiàn)在我們要吃碗里的米飯,怎么取出米飯,我們用筷子操作取出米飯。
- 如何安裝mysql數(shù)據(jù)庫(kù)軟件?
mysql數(shù)據(jù)庫(kù)(存放數(shù)據(jù))客戶端navicat(用來操作數(shù)據(jù)庫(kù)的軟件)只要安裝了客戶端,都可以連接到數(shù)據(jù)庫(kù)。
安裝文檔
如何用客戶端navicat連接到mysql數(shù)據(jù)庫(kù)?
步驟:點(diǎn)擊連接;填寫數(shù)據(jù)庫(kù)連接信息;連接測(cè)試;確定。
安裝好客戶端后,在左上角有一個(gè)“鏈接”的按鈕,點(diǎn)擊彈出"連接屬性“的客戶端。
localhost,說明數(shù)據(jù)庫(kù)在自己的電腦上。端口:默認(rèn)端口。
- 表的創(chuàng)建,刪除和更新?
創(chuàng)建數(shù)據(jù)庫(kù):
鼠標(biāo)左鍵da;新建數(shù)據(jù)庫(kù);設(shè)置數(shù)據(jù)庫(kù)信息(數(shù)據(jù)庫(kù)名:school;字符集:utf8(可以同時(shí)支持英文和中文。如果這里創(chuàng)建不對(duì),后面會(huì)出現(xiàn)亂碼的情況);排序規(guī)則)
school是灰色的,說明沒用打開數(shù)據(jù)庫(kù)。右鍵:打開數(shù)據(jù)庫(kù);school圖標(biāo)變亮,說明打開。
表的創(chuàng)建:
選中數(shù)據(jù)庫(kù),表放在哪個(gè)數(shù)據(jù)庫(kù)下。選中表;右鍵:新建表;輸入列名(學(xué)號(hào)),類型(varchar),長(zhǎng)度(255),不是null(?)。
點(diǎn)擊”添加欄位“,可以給表增加新的列,增加新的列;
添加”主鍵(黃色的 標(biāo)記)
保存:輸入表名(student),點(diǎn)擊“確定”。
保存后的student的表,在school下找到,然后雙擊表名,打開表。
數(shù)據(jù)類型:
數(shù)據(jù)庫(kù)的數(shù)據(jù)類型:3種。數(shù)據(jù)大小:字節(jié)。字節(jié)是計(jì)算機(jī)存儲(chǔ)單位。表示數(shù)據(jù)大小。
字符串:類型:char;varchar;text;tinytext;mediumtext;longtext;blob;tinyblob;mediumblob;longblob。
數(shù)字:類型: int/integer;tinyint;smallint;mediumint;bigint;float;double;decimal。
日期:類型:date;datetime;timestamp;time;year。
例子:student表:長(zhǎng)度(默認(rèn)值:255)。設(shè)定了數(shù)值類型后,不能存放和所設(shè)置數(shù)值類型不一致的數(shù)據(jù)。
約束:是除了數(shù)據(jù)類型以外,對(duì)表中數(shù)據(jù)條件進(jìn)行約束的一種功能。(根據(jù)業(yè)務(wù)需求設(shè)置:null:對(duì)應(yīng)列中的數(shù)據(jù)可以包含空置。not null:對(duì)應(yīng)列中的數(shù)據(jù)不可以包含空值(必須填)。primary key:主鍵(表示那一列的數(shù)值不能添加重復(fù)值。聯(lián)合主鍵:多個(gè)列組合起來作為主鍵。)
表的更新:
選中表名student;設(shè)計(jì)表;添加欄位;刪除欄位。
選中表名,刪除表。
注意:刪除表后很難恢復(fù)。
- 數(shù)據(jù)的插入,刪除和更新?
數(shù)據(jù)的插入:
選中表student;打開表;通過“增加行”,“刪除行”添加和刪除數(shù)據(jù)。然后保存。
也可以使用sql語句批量插入數(shù)據(jù)。
sql插入數(shù)據(jù)語句:
insert into <表名>(<列名1>,<列名2>,......)values(<值1>,<值2>,......);
藍(lán)色的字是sql的關(guān)鍵字。
列名不能加單引號(hào),值加單引號(hào)表示一個(gè)字符串。
在客戶端navicat里哪里寫sql呢?查詢-新建查詢-查詢編輯器。在界面空白的地方寫sql語句。這個(gè)界面叫查詢編輯器,不是只能寫查詢語句,可以寫任何的sql語句。
第一步寫sql語句,第二步點(diǎn)擊運(yùn)行,第三步看運(yùn)行結(jié)果。
結(jié)果信息:err報(bào)錯(cuò)。duplicate entry .....for key primary.(插入的值中有和現(xiàn)有數(shù)據(jù)重復(fù)的值,觸發(fā)主鍵的約束條件(學(xué)號(hào)設(shè)置為主鍵。)解決辦法:打開表,將重復(fù)值刪除,然后運(yùn)行結(jié)果。
空值(null);空字符串(' ')SQL的基本語法:
DDL(數(shù)據(jù)定義語言):操作對(duì)象:數(shù)據(jù)庫(kù)和表。create;drop;alter
DML(數(shù)據(jù)操縱語言):操作對(duì)象:表的數(shù)據(jù)。insert;delete;select;update
DCL(數(shù)據(jù)控制語言):用來取消或者控制數(shù)據(jù)的變更。對(duì)關(guān)系數(shù)據(jù)庫(kù)的用戶是否有權(quán)限操縱數(shù)據(jù)進(jìn)行設(shè)置。commit;rollback;crant
SQL書寫規(guī)則:
1.SQL語句逐條執(zhí)行,以英文分號(hào);結(jié)尾。
2.SQL語句不區(qū)分關(guān)鍵字的大小寫。(關(guān)鍵字是數(shù)據(jù)庫(kù)設(shè)定好的有特別意義的單詞,在客戶端寫的SQL語句,關(guān)鍵字是藍(lán)色標(biāo)注的,比如insert into values,大小寫都可以。表名和列名也不區(qū)分大小寫;但是插入表中的值是區(qū)分大小寫的,比如A和a。
3.輸入符號(hào)的時(shí)候只能使用英文的。
寫sql語句遇到錯(cuò)誤,第一步先查有沒有把符號(hào)寫成中文的。列名不能加單引號(hào)。
- 基本的查詢語句
select語句:
selec<列名1>,<列名2>,......from<表名>;
select子句:希望從表中查出列的名稱(查詢結(jié)果的列名);from子句:從哪個(gè)表查詢。
整個(gè)查詢語句的含義是:從表中查詢出需要列名的數(shù)據(jù)。
查詢結(jié)果中列的順序和查詢語句中select后的順序是一樣的。
查詢多個(gè)列的時(shí)候,需要用英文逗號(hào)分開。
如果想查找出所有的列,用*表示。select * from student
運(yùn)行原理:通過sql語句向數(shù)據(jù)庫(kù)查詢數(shù)據(jù),通過客戶端navicat展示查詢內(nèi)容。
為列設(shè)置別名as:
select 姓名 as s_name, 性別as '人類性別' from student
使用別名的目的:使語句查詢結(jié)果更容易理解。英文轉(zhuǎn)化為中文。
刪除重復(fù)數(shù)據(jù)distinct:
在select語句中使用distinct
select distinct 姓名from student;
select distinct 學(xué)號(hào),姓名 from student;將多個(gè)列的數(shù)據(jù)進(jìn)行組合,這幾個(gè)列的數(shù)據(jù)都相同的時(shí)候才算做重復(fù)數(shù)據(jù)。
distinct只能放在第一個(gè)查詢的列名之前。SQL書寫規(guī)則:
sql語句逐條執(zhí)行,運(yùn)行完一條sql語句,再運(yùn)行下一條語句。一條sql語句以;結(jié)尾。
SQL語句不缺分關(guān)鍵字的大小寫。
列名不能加單引號(hào),列名命名的時(shí)候不能有空格。(姓名?;姓 名×)
符號(hào)只能使用英文符號(hào)。
- 指定查詢條件
where子句:限定條件的查詢語句
查出姓名為“猴子”的學(xué)生的學(xué)號(hào):select 姓名,學(xué)號(hào) from student where 姓名='猴子';
where 姓名='猴子'指定條件。(注意子句中的中文值用英文單引號(hào)。但是列名不能用單引號(hào)。
SQL運(yùn)行順序:
1.運(yùn)行from子句,從哪個(gè)表里查詢;2.運(yùn)行where子句,查詢的條件是什么?查詢列名為什么條件的行;3.運(yùn)行select子句,從where子句查詢的行中取出select語句指定的列。
書寫順序和運(yùn)行順序不一樣。
- 注釋和sql語句注意事項(xiàng)
注釋方法:單行注釋;多行注釋。
(團(tuán)隊(duì)協(xié)作中方便其他人和歷史記錄方便查看。)
單行注釋:
- - 查詢出全部列
select * from student;
多行注釋:
/*
查詢姓名是猴子學(xué)生的學(xué)號(hào)
*/
select 姓名,學(xué)號(hào)
from student
where 姓名='猴子';
sql語句注意事項(xiàng):符號(hào)的使用,英文符號(hào)。
- 運(yùn)算符
算數(shù)運(yùn)算符;比較運(yùn)算符;邏輯運(yùn)算符
算數(shù)運(yùn)算符:+-*/;含義:加法運(yùn)算;減法運(yùn)算;乘法運(yùn)算;除法運(yùn)算。
5+Null=Null Null是空值,所有含有空值的計(jì)算,結(jié)果還是空值。
()內(nèi)的表達(dá)式優(yōu)先進(jìn)行。(1+2)*3
例子:select 學(xué)號(hào),成績(jī),成績(jī)/100 as '成績(jī)百分比' from score;
比較運(yùn)算符:
=相等;<>不等于;>大于; >=大于等于; <小于;<=小于等于
select 姓名,學(xué)號(hào) from student where 姓名= '猴子';
select 學(xué)號(hào),成績(jī) from score where 成績(jī)<60;
select 姓名,出生日期 from student where 出生日期< '1990-01-01';
字符串比較規(guī)則:
字符串的順序是按照字典順序。
10是以1開頭的數(shù)字,因此10比2小。
'10' < '2'
如何查詢出null空值的行?
is null/is not null
查詢出教師姓名是空值的行?查詢出教師姓名不是空值的行?
select 教師號(hào),教師姓名 from teacher where 教師姓名 is null;
select 教師號(hào),教師姓名 from teacher where 教師姓名 is not null;
邏輯運(yùn)算符:可以將多個(gè)查詢條件組合起來
not否定某一條件;
and并且;
between范圍查找;
or或者;
in:or的簡(jiǎn)單寫法。
案例:
not:
select 學(xué)號(hào),成績(jī) from score where not 成績(jī) >= 60;和select 學(xué)號(hào),成績(jī) from score where 成績(jī) < 60;一般不適用not語句。
and: 并且
業(yè)務(wù)場(chǎng)景:同時(shí)使用多個(gè)查詢條件來查詢所需要的數(shù)據(jù)。
文氏圖。
select 學(xué)號(hào),成績(jī) from score where 成績(jī)>=60 and 成績(jī)<=90;
select 姓名,性別 from student where 姓名= '男' and (姓名='猴子' or 姓名=‘馬云');
()內(nèi)先運(yùn)行。
between:范圍查詢
select 學(xué)號(hào),成績(jī) from score where 成績(jī) between 60 and 90;
select 學(xué)號(hào),成績(jī) from score where 成績(jī) >=60 and 成績(jī) <=90;
or:或者。文氏圖
兩個(gè)條件中滿足任何一個(gè)。
select 學(xué)號(hào),成績(jī) from score where 成績(jī) < 60 or 成績(jī) > 90;
in:或者
是or的簡(jiǎn)便寫法。
select 姓名,性別 from student where 姓名 in ('猴子','馬云');
select 姓名,性別 from student where 姓名 not in ('猴子','馬云');
- 字符串模糊查詢
like:字符串模糊查詢。
%表示任意字符串。
猴%:
--查詢姓“猴”的學(xué)生名單
/*
查詢姓“猴”的學(xué)生名單
*/
select *
from student
where 姓名 like '猴%';
%猴:
--查詢姓名中最后一個(gè)字是“猴”的學(xué)生名單
/*
查詢姓名中最后一個(gè)字是“猴”的學(xué)生名單
*/
select *
from student
where 姓名 like '%猴';
%猴%:
--查詢姓名中帶“猴”字的學(xué)生名單
/*
查詢姓名中帶“猴”字的學(xué)生名單
*/
select *
from student
where 姓名 like '%猴%';
_1個(gè)下劃線表示任意一個(gè)字符。
/*
查詢姓”王“的學(xué)生名單,并且姓名是3個(gè)字的
*/
select *
from student
where 姓名 like '王__'
SQL運(yùn)行順序:
select子句最后運(yùn)行,其他子句按書寫順序運(yùn)行。
select查詢結(jié)果
from從哪張表中查詢數(shù)據(jù)
where查詢條件(運(yùn)算符,字符串模糊查詢);
- 匯總分析
匯總函數(shù):5個(gè)函數(shù)
count求某列的行數(shù):count(*)包含空值。可以對(duì)任何數(shù)據(jù)類型進(jìn)行計(jì)算。
sum對(duì)某列數(shù)據(jù)求和:只能對(duì)數(shù)值類型的列計(jì)算
avg求某列數(shù)據(jù)的平均值:只能對(duì)數(shù)值類型的列計(jì)算
max求某列數(shù)據(jù)的最大值
min求某列數(shù)據(jù)的最小值
函數(shù):
三個(gè)功能:1.功能;2.輸入(參數(shù));3.輸出(返回值)。
如何將函數(shù)寫在SQL語句中:
count:
select count(教師姓名) from teacher;
count行數(shù)如果計(jì)算的是列名,會(huì)除去空值null計(jì)算。
select count(*) from teacher;
如果count行數(shù)計(jì)算的是空值,會(huì)計(jì)算所有的行數(shù),包括空值的部分。
sum:
select sum(成績(jī)) from score;
select max(成績(jī)), min(成績(jī)) from score;
select count (distinct 姓名) from student;如果不想計(jì)算重復(fù)值,在count前面加上distinct。
在列名前面加上distinct,去除重復(fù)值計(jì)算。
- 對(duì)數(shù)據(jù)分組
SQL分組:group by
在SQL中,用group by子句按某個(gè)條件進(jìn)行分組。
經(jīng)常和匯總函數(shù)進(jìn)行使用,數(shù)據(jù)分析通用模板方法。分析方法:數(shù)據(jù)分組;應(yīng)用函數(shù);組合結(jié)果。
select 性別,count(*)
from student
where 出生日期 > '1990-01-01'
group by 性別;SQL運(yùn)行順序:
1.from student; 通過from子句指定從哪張表中查找數(shù)據(jù);
2.where 出生日期 > '1990-01-01';運(yùn)行where子句,通過這個(gè)子句查詢出符合條件的行;3.group by 性別;對(duì)第二步查出的數(shù)據(jù)進(jìn)行分組;
4.select 性別,count(*);對(duì)分組后的每個(gè)組運(yùn)用函數(shù),并組合結(jié)果。并篩選出select中指定的列。
如何識(shí)別問題要分組:每次/每個(gè)/每門?
- 對(duì)分組結(jié)果指定條件
having: 為分組結(jié)果指定條件;
where子句只能指定行的條件;having子句可以指定分組以后的條件,比如在分出男生組和女生組的數(shù)據(jù)后,只需要男生組的數(shù)據(jù)。
select 性別,count(*)
from student
group by 性別
having count(*)>1;
SQL運(yùn)行順序:
select 查詢結(jié)果 5
from 從哪張表中查找數(shù)據(jù) 1
where查詢條件 2
group by分組 3
having對(duì)分組結(jié)果指定條件; 4
- 如何用 SQL 解決業(yè)務(wù)問題?
業(yè)務(wù)問題解決套路
1.翻譯成大白話;2.寫出分析思路;3.寫出對(duì)應(yīng)的SQL子句。
如何計(jì)算各科的平均成績(jī)?
如何計(jì)算每門課程的平均成績(jī)?
select 課程號(hào), avg(成績(jī))
from score
group by 課程號(hào);
如何計(jì)算每門課程的平均成績(jī),并且平均成績(jī)大于等于80分?
如何計(jì)算每門課程(分組)的平均成績(jī)(匯總),并且平均成績(jī)大于等于80分(條件)?
select 課程號(hào), avg(成績(jī))
from score
group by 課程號(hào)
having avg(成績(jī)) >= 80;
- 如何對(duì)查詢結(jié)果排序?
對(duì)查詢結(jié)果排序:order by
升序/降序/指定多個(gè)排序列名/空值如何排序
降序(desc):從大到小;單詞descend的縮寫。
升序(asc):從小到大;單詞ascend的縮寫。
如何計(jì)算每門課程的平均成績(jī),并且平均成績(jī)大于等于80分?
select 課程號(hào), avg(成績(jī)) as 平均成績(jī)
from score
group by 課程號(hào)
having avg(成績(jī)) >= 80
order by 平均成績(jī) desc;
運(yùn)行順序:order by是查詢結(jié)果排序,因?yàn)椴樵兘Y(jié)果是在select子句后得到的,所以order by是在select子句后運(yùn)行的。
select 課程號(hào), avg(成績(jī)) as 平均成績(jī) 4
from score 1
group by 課程號(hào) 2
having avg(成績(jī)) >= 80 3
order by 平均成績(jī) desc; 5
指定多個(gè)排序列名:
select * 2
from score 1
order by 成績(jī) asc, 課程號(hào) desc; 3
先按照成績(jī)升序排列,相同成績(jī)的按照課程號(hào)降序排列。
空值null的排序:
如果數(shù)值中有空值,則空值null排列在前面。
null, ' ', 數(shù)值1 ,數(shù)值2從查詢結(jié)果中取出指定行:limit
--從查詢結(jié)果中取出前2行數(shù)據(jù)
selct *
from score
limit 2;SQL運(yùn)行順序:
select 查詢結(jié)果 5
from 從哪張表中查找數(shù)據(jù) 1
where查詢條件 2
group by分組 3
having對(duì)分組結(jié)果指定條件 4
order by對(duì)查詢結(jié)果排序 6
limit 從查詢結(jié)果中取出指定行;7
- 如何看懂 SQL 報(bào)錯(cuò)信息?
幾種常見的 SQL 錯(cuò)誤:
運(yùn)行報(bào)錯(cuò):Err
1. 在having/group by中不能使用了select里別名。having子句是先運(yùn)行的,select子句是后運(yùn)行的。having運(yùn)行時(shí)沒有”平均成績(jī)“這個(gè)別名。
2. 在where子句中不能使用聚合函數(shù)(匯總函數(shù))。
3. 字符串類型的數(shù)字。常見問題:數(shù)據(jù)存放的類型如果是字符串,如果進(jìn)行排序和計(jì)算,按照字符串類型計(jì)算。字符串和數(shù)值類型的計(jì)算規(guī)則是不一樣的。需要改成所需要的數(shù)據(jù)類型。
練習(xí):sqlzoo中習(xí)題練習(xí)。
- 視圖
表中存放的是實(shí)際數(shù)據(jù);
視圖中存放的是SQL查詢語句;
使用視圖時(shí),會(huì)運(yùn)行視圖里的sql查詢語句創(chuàng)建出一張臨時(shí)表。
臨時(shí)表:當(dāng)客戶端與數(shù)據(jù)庫(kù)斷開時(shí),這個(gè)表會(huì)自動(dòng)刪除。視圖不存放數(shù)據(jù),存放的是SQL語句。
create view .......as select 查詢語句;
注意事項(xiàng):不能往視圖里插入數(shù)據(jù)。不建議頻繁在視圖里創(chuàng)建視圖。
- 子查詢
SQL語句中有有子查詢,先運(yùn)行子查詢。
......in子查詢
......any/some 子查詢
......all子查詢
- 標(biāo)量子查詢
需要單一值的時(shí)候。(返回單一的值。)可以和比較運(yùn)算符/in/any/some/all一起使用。
編程-彈鋼琴
- 關(guān)聯(lián)子查詢
關(guān)聯(lián)條件:where。在每個(gè)組里比較(關(guān)聯(lián)子查詢)關(guān)聯(lián)條件。
where s1.課程號(hào)=s2.課程號(hào)
- 如何用SQL解決業(yè)務(wù)問題?
翻譯成大白話;寫出分析思路;寫出對(duì)應(yīng)的sql子句。
如何看懂sql報(bào)錯(cuò)信息?一 一排除錯(cuò)誤。
- 各種函數(shù)
匯總函數(shù):count;sum;avg;max;min;
算術(shù)函數(shù):round;abs;mod;
字符串函數(shù):length;lower;upper;contact;replace;substring;
日期函數(shù):current_date;current_time;year;mont;day'dayname;
- 表的加法
加法:union
(將兩個(gè)表中重復(fù)數(shù)據(jù)刪除,加起來)
union all
(不刪除重復(fù)值將表的內(nèi)容加起來)
- 表的聯(lián)結(jié)
聯(lián)結(jié):表之間的關(guān)系。
常見聯(lián)結(jié)類型/方式:交叉聯(lián)結(jié)cross join;內(nèi)聯(lián)結(jié)inner join;左聯(lián)結(jié)eft join;右聯(lián)結(jié)right join;全聯(lián)結(jié)full join。
on是表示通過什么產(chǎn)生關(guān)系。
交叉聯(lián)結(jié)(笛卡爾積):將兩個(gè)表的每一行合并。
inner join:同時(shí)存在的數(shù)據(jù)。
left join:
right join:
full join:
聯(lián)結(jié)在from子句。聯(lián)結(jié)的表。
- case表達(dá)式
判斷條件。
case when...then...when....then....else....end;
else可以省略,表示空值。最好寫。
case表達(dá)式+聚合函數(shù)可同時(shí)使用
SQL知識(shí)點(diǎn)總結(jié)2:
側(cè)重點(diǎn)SQL查詢語句的書寫邏輯和運(yùn)行順序mysql:增刪改查
SQL增刪改查:
對(duì)數(shù)據(jù)庫(kù)有修改的操作:增刪改
對(duì)數(shù)據(jù)庫(kù)沒有修改的操作:查(數(shù)據(jù)分析中最主要的sql語句)寫sql順序:
select....from....where...group by....having....order by....limit...;執(zhí)行順序:
select....輸出 4
from....獲取數(shù)據(jù) 1
where...過濾 2
group by....分組 3
having....過濾 5
order by....排序 6
limit...;限定個(gè)數(shù) 7數(shù)據(jù)流:
列:事物屬性
行:同一個(gè)事物的內(nèi)容
以表呈現(xiàn)的數(shù)據(jù)/二維數(shù)據(jù)
數(shù)據(jù)組織:表的形式
from student 把student這個(gè)表的所有數(shù)據(jù)都獲取過來
select.....from....當(dāng)這個(gè)表準(zhǔn)備好以后要展示的內(nèi)容有哪些?
select * from student
select name from student
select可以對(duì)數(shù)據(jù)進(jìn)行過濾。
where:在from中獲取的數(shù)據(jù)進(jìn)行過濾,符合條件的數(shù)據(jù)留下,不符合條件的數(shù)據(jù)丟棄。(and, or.....)SQL必知必會(huì)
select name from student where name = '小剛' ;
select * from student where name = '小剛';
group by:分組。分組后如果遇到select,那么輸出的代表是這一組的第一行數(shù)據(jù)。group by還可以和聚合函數(shù)放在一起。
select * from ....where...group by....;
select * from student group by classid;??分組后的第一行數(shù)據(jù)。不是很理解
把classid相同的分組。
selct count( id, classid ) from student group by classid;
selct count( id, classid ) from student group by classid, name;classid, name兩個(gè)相同才算是一組。多列 的分組。
select count( 1 ), classid from student;
select count( name ) , classid from student;
區(qū)別:如果Name 中有null值,那么count 1 不記錄null值。其他情況二者一致。
select count (distinct name) , classid form student;
distinct:排除重復(fù)值;
聚合函數(shù):count計(jì)數(shù);sum求和;max最大值;min最小值;avg平均數(shù);group-concat字符集;
區(qū)分:count(1);count(name);count(distinct name)
sql語句和mysql的關(guān)系:
sql語句:一種語言;mysql是一個(gè)軟件,數(shù)據(jù)處理軟件。用sql語言操作數(shù)據(jù)庫(kù)mysql。
開源數(shù)據(jù)庫(kù)中最流行的是mysql;oracle/sql server也是試用于sql。
區(qū)別:同一個(gè)表在不同的數(shù)據(jù)庫(kù)查詢的內(nèi)容不一致。有細(xì)微的區(qū)別。
創(chuàng)建數(shù)據(jù)庫(kù):(schema)
CREATE DATABASE student;
習(xí)慣(寫sql的時(shí)候如果是sql的關(guān)鍵字大寫,其他小寫)
CREATE TABLE student (id int primary key, name char(10), classid int) defaut charset=utf8mb4;
插入數(shù)據(jù)庫(kù)的SQL
INSERT INTO student(id,name, classid) VALUES (1, '假博學(xué)',1);
INSERT INTO student(id,name, classid) VALUES (2, '假博',2),(3, '假學(xué)',1),(4, '假仁',2),(5, '博學(xué)',20;
清空數(shù)據(jù)表:
TRUNCATE student;
TRUNCATE TABLE student;
where是對(duì)行的操作,一行一行的對(duì)比/排錯(cuò)是否滿足條件。
SELECT * FROM student GROUP BY classid;
為什么class id在輸出的時(shí)候還進(jìn)行了排序?
GROUP BY分組,為什么結(jié)構(gòu)還實(shí)現(xiàn)了排序,因?yàn)檫M(jìn)行分組的時(shí)候,默地先進(jìn)行了排序(升序asc)
如果是降序(desc),語句:
SELECT * FROM student GROUP BY classid DESC;
區(qū)別:
SELECT COUNT(*), clasid FROM student GROUP BY classid DESC;
SELECT COUNT(1), clasid FROM student GROUP BY classid DESC;
SELECT COUNT(name), clasid FROM student GROUP BY classid DESC;
SELECT COUNT(distinct 1), clasid FROM student GROUP BY classid DESC;
SELECT SUM(id), clasid FROM student GROUP BY classid DESC;
SELECT AVG(id), clasid FROM student GROUP BY classid DESC;
SELECT * FROM student WHERE 1=1 GROUP BY classid;
SELECT * FROM student GROUP BY classid;
where 1=1
where 1=0
1=1永遠(yuǎn)都是正確;1=0永遠(yuǎn)都是錯(cuò)誤。
HAVING 過濾的是GROUP BY之后的內(nèi)容。根據(jù)SQL語句執(zhí)行順序,HAVING 過濾的是GROUP BY后的數(shù)據(jù)。
查詢每個(gè)班中人數(shù)大于2個(gè)的班級(jí)號(hào)。
每個(gè):分組,GROUP BY,以班級(jí)分組class,人數(shù)大于2人數(shù)count(1)>2
SELECT classid FROM student GROUP BY classid HAVING COUNT (1)>2;
GROUP BY之后能勇select里別名的內(nèi)容,之前不可以。
ORDER BY 用那一列進(jìn)行排序
ORDER BY n;
ODER BY classid,n;
LIMIT:取前幾的行
LIMIT 1;取第一行
LIMIT 1,2;從1 開始取2個(gè)
CASE WHEN:
CASE WHEN 放在SELECT里,輸出的時(shí)候,把輸出信息置換。
CASE WHEN 表達(dá)式
THEN 輸出
WHEN 表達(dá)式
THEN輸出
ELSE輸出
END
CASE WHEN id=1
THEN 2
WHEN id=2
THEN 1
ELSE
10
END
對(duì)比python:
if id==1;
2
elif id==2;
1
else
0
if id=表達(dá)式;
輸出
elif id=表達(dá)式;
輸出
else
輸出
將1班的學(xué)生轉(zhuǎn)到2班
將2班的學(xué)生轉(zhuǎn)到1班
3班的學(xué)生不變
SELECT id,name FROM student
CASE WHEN 放在SELECT里,輸出的時(shí)候,把輸出信息置換。
(CASE WHEN classid=1 THEN
2
CASE WHEN classid=2 THEN
1
ELSE classid END) AS cld
SELECT id,mame, (CASE WHEN classid = 20 THEN 6 WHEN classid = 6 THEN 20 ELSE END) AS cld FROM student;
聚合函數(shù)+CASE WHEN:
SELECT name,
MAX(CASE WHEN stage = ' 基’ THEN score ELSE null END) AS '基',
MAX(CASE WHEN stage = ' 爬’ THEN score ELSE null END) AS '爬',
MAX(CASE WHEN stage = ' SQL’ THEN score ELSE null END) AS 'SQL',
FROM score GROUP BY name;
JOIN連接:兩個(gè)表相關(guān)的查詢
連接:對(duì)兩個(gè)表的數(shù)據(jù)進(jìn)行重組,將數(shù)據(jù)組合在一個(gè)表里。
SELECT studentid,classid,
FROM后的內(nèi)容:FROM student JOIN class
WHERE classid=2 AND studentid%=1;(ID是奇數(shù):studentid%=1;ID是偶數(shù):studentid%=0)
GROUP BY studentname;
ON條件:過濾條件
SELECT studentid,classid,FROM student JOIN class ON classid=class.id WHERE classid=2 AND studentid%=1 GROUP BY studentname;
SELECT studentid,classid,
FROM student JOIN class ON classid=class.id (JOIN是FROM后的內(nèi)容,新生成的表)
WHERE classid=2 AND studentid%=1(ID是奇數(shù):studentid%=1;ID是偶數(shù):studentid%=0)
GROUP BY studentname;
FROM 表 JOIN表ON條件
標(biāo)黃的當(dāng)作一個(gè)新表
ON可以改成WHERE嗎?單純寫JOIN是,ON可以和WHERE替換。但是LEFTJOIN這則不行。
LEFTJOIN和JOIN區(qū)別:
LEFTJOIN 必須有ON條件;
回去檢查左邊的數(shù)據(jù)是否都包含在新生成的表中。如果是,與JOIN沒有區(qū)別;如果不是,用NULL與不包含的行組成新行加入新表。
RIGHTJOIN:
A RIGHTJON B=B LEFTJOIN A
多表連接:ABC三個(gè)表連接, A和B表先結(jié)合成AB表,AB表在和C表結(jié)合。
A JOIN B ON....
JOIN C ON...
JOIN D ON...
A JOIN B JOIN C JOIN D
A LEFT JOIN B ON...LEFTJOIN C...
什么情況下用JOIN,什么時(shí)候用LEFTJOIN。
查詢通信A的班主任名稱:
SELECT 班主任名字 FROM student JOIN class ON classid=class.id WHERE studentname='A';
查詢哪些同學(xué)目前是沒有班級(jí)的?
SELECT studentname FROM student LEFTJOIN class ON classid=class.id WHERE class.id IS NULL;
兩個(gè)值做比較只能是同一行的數(shù)據(jù)。
需要兩行之間的對(duì)比,自己JOIN自己。
SELECT e1.name FROM employee AS e1 JOIN employee AS e_m2,id WHERE e1.salary>e_m2.salary;
PRIMARY是MYSQL的關(guān)鍵字,加反引號(hào)/雙引號(hào)。反引號(hào)在TAB鍵上。
分組,聚合函數(shù)不分家,分組一般都是用來做聚合函數(shù)。
子查詢:相當(dāng)直觀的SQL語句。
類似英語里的從句。
WHERE里面的子查詢:
在查詢?nèi)绻赪HERE/SELECT相當(dāng)于子查詢先計(jì)算結(jié)果再判斷。
SELECT id FROM class WHERE manager='小藍(lán)';
SELECT name FROM student WHERE classid=1;
子查詢語句:
SELECT name FROM student WHERE classid=(SELECT id FROM class WHERE manager='小藍(lán)');
SELECT里面的子查詢:
=的子查詢只能返回一個(gè)數(shù)值;但是in的子查詢能返回一列數(shù)據(jù)。
SELECT * , (SELECT id FROM class WHERE manager =’ LV‘ )FROM student
HAVING子查詢不常見;
FROM里面的子查詢:
在FROM里的子查詢必須有別名(as)。FROM里的自查詢相當(dāng)于一個(gè)新的表。
SELECT studentname FROM student JOIN class ON studentclassid=classid WHERE manager=’小藍(lán)';
自查詢語句:
SELECT studentname FROM student JOIN (SELECT * FROM class WHERE manager=’小藍(lán)') AS c ON studentclassid=classid;
任何子查詢都可以用JOIN的表變換。
半連接:semi-join
子查詢內(nèi)引用復(fù)查詢的表信息/在子查詢中有訪問復(fù)查詢表信息的叫做半連接。
半連接作用:找到每個(gè)classid中最大的ID做對(duì)應(yīng)的信息。
SELECT * FROM student s1 WHERE id=SELECT MAX(id) FROM student s2 WHERE classid=s1.class id;
半連接前置:
找到每個(gè)班級(jí)學(xué)生的最大學(xué)號(hào)對(duì)應(yīng)的學(xué)生信息。
SELECT * FROM student WHERE id IN (SELECT MAX(id) FROM student GROUP BY classid);
SQL書寫思路:按數(shù)據(jù)的流程一點(diǎn)點(diǎn)寫。SQL學(xué)習(xí)資料推薦專業(yè)書籍:MySQL必知必會(huì)/SQL必知必會(huì)
知乎課程:猴子數(shù)據(jù)分析
從零學(xué)會(huì)SQL:入門
從零學(xué)會(huì)SQL:簡(jiǎn)單查詢
從零學(xué)會(huì)SQL:匯總分析
從零學(xué)會(huì)SQL:多表查詢
從零學(xué)會(huì)SQL:復(fù)雜查詢我的另一個(gè)知乎問答:
高中生想學(xué)一門技術(shù)類似編程什么的,有什么推薦? - Rachel的回答 - 知乎
總結(jié)
以上是生活随笔為你收集整理的sql中“delete from 表名”表示_SQL查询语句知识点总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 快速读文件_java快速读取文
- 下一篇: 二阶振荡环节的谐振频率_自动控制系统时域