數(shù)據(jù)庫的三個階段:人工管理階段、文件系統(tǒng)階段、數(shù)據(jù)庫系統(tǒng)階段
數(shù)據(jù)庫管理系統(tǒng):DBMS
常見的關系型數(shù)據(jù)庫:Oracle、DB2、mysql
常見的非關系型數(shù)據(jù)庫:MongoDB、redies
sql的四部分:
DML(update、delete、insert)
DDL(create、drop、alter、truncate)
DQL(select查詢語句)
DCL(對數(shù)據(jù)進行變更)
MySQL數(shù)據(jù)庫的常見操作:
查看所有數(shù)據(jù)庫:show databases;
查看以a開頭的數(shù)據(jù)庫:show databases like 'a%';
創(chuàng)建數(shù)據(jù)庫:create database if not? exists 數(shù)據(jù)庫名;
刪除數(shù)據(jù)庫:drop database if exists 數(shù)據(jù)庫名;
注:在數(shù)據(jù)庫的語法規(guī)定里是不區(qū)分大小寫,但通常關鍵字大寫,數(shù)據(jù)庫名、表名、字段名小寫。
查詢數(shù)據(jù):
提示:使用select語句進行查詢數(shù)據(jù),語法格式如下
SELECT
{* | <字段列名>}
[
FROM <表 1>, <表 2>…
[WHERE <表達式>
[GROUP BY <group by definition>
[HAVING <expression> [{<operator> <expression>}…]]
[ORDER BY <order by definition>]
[LIMIT[<offset>,] <row count>]
]
下面我們來分條解析使用select 的語法格式:
-
{*|<字段列名>}
包含星號通配符的字段列表,表示所要查詢字段的名稱。 -
<表 1>
,<表 2>
…,表 1 和表 2 表示查詢數(shù)據(jù)的來源,可以是單個或多個。 -
WHERE <表達式>
是可選項,如果選擇該項,將限定查詢數(shù)據(jù)必須滿足該查詢條件。 -
GROUP BY< 字段 >
,該子句告訴 MySQL 如何顯示查詢出來的數(shù)據(jù),并按照指定的字段分組。 -
[ORDER BY< 字段 >]
,該子句告訴 MySQL 按什么樣的順序顯示查詢出來的數(shù)據(jù),可以進行的排序有升序(ASC)和降序(DESC),默認情況下是升序。 -
[LIMIT[<offset>,]<row count>]
,該子句告訴 MySQL 每次顯示查詢出來的數(shù)據(jù)條數(shù)
查詢表中所有字段或指定字段,字段去重distinct
? 所有字段:
- 使用“*”通配符查詢所有字段,語法格式:SELECT * FROM 表名;? 給所有的字段內容去重在*前面加distinct即可。
- 在select后面列出表的所有字段名,用 英文的逗號? , 分隔開。 在第一個字段名前面加distinct即可。
? 指定字段:
- 在select后跟指定字段名稱即可;去重在字段名前加distinct。? ? ?
表名很長時,可以在標明后面 通過 AS 關鍵字 為表指定一個別名;字段也是 語法一樣,可以給字段也指定別名。
表名 AS 別名;
字段名 AS 別名;
limit:可以限制文件的輸出條數(shù)和輸出位置
LIMIT 初始位置,輸出條數(shù) --下表是從0開始
LIMIT 輸出條數(shù) --默認從第一條開始
LIMIT 輸出條數(shù) OFFSET 初始位置
?order by:對查詢結果通過某一字段排序(可以通過字段名排序)
ORDER BY <字段名> [ASC|DESC]? --ASC是默認的升序的 如果不寫,默認ASC , desc是降序
where 條件查詢語句?
- 帶比較運算符和邏輯運算符的查詢條件
- 帶 BETWEEN AND OR關鍵字的查詢條件
- 帶 IS NULL 關鍵字的查詢條件
- 帶 IN 關鍵字的查詢條件
- 帶 LIKE 關鍵字的查詢條件
--查詢日本2018年的電影
SELECT * FROM 表名
WHERE 字段名='日本'AND 字段名='2018';
--查詢在 xian上映或者在中國大陸上映且類型為喜劇/奇幻/古裝的影片信息
SELECT * FROM cinema_later
WHERE city='xian'OR (region='中國大陸'AND tag='喜劇/奇幻/古裝');
--模糊查詢
--查詢以人結尾,前面有任意字符的title
SELECT *FROM cinema_later
WHERE title LIKE '%人';
--查詢包含有人字的title
SELECT * FROM cinema_later
WHERE title LIKE '%人%';
--查詢人字前面有固定字符(兩個下劃線表示),但以任意字符結尾的
SELECT * FROM cinema_later
WHERE title LIKE '__人%';
--默認不區(qū)分 加binary按照區(qū)分大小寫字母查詢,
SELECT * FROM cinema_later
WHERE city LIKE BINARY 'C%';
--范圍區(qū)間查詢between
-- 5000到8000之間,且上映城市為xian的
SELECT * FROM cinema_later
WHERE (wish_count BETWEEN 5000 and 8000)AND city='xian';
--查詢英文片名為null的影片
SELECT * FROM north_american_box_office
WHERE yingwenpianming IS NULL
--查詢英文片名不為null的影片
SELECT * FROM north_american_box_office
WHERE yingwenpianming IS not NULL
--查詢當日票房為100或200或300的
SELECT *FROM north_american_box_office
WHERE dangripiaofang IN(100,200,300);
?group by 分組
group by單獨使用時,后面跟字段名即可。GROUP BY 關鍵字也可以和 GROUP_CONCAT() 函數(shù)一起使用。這樣可以把分組的某一字段的每個字段值都顯示。
SELECT 分組的字段名, GROUP_CONCAT(傳入需要全部顯示的字段名)
FROM 表名
GROUP BY 分組的字段名;
在數(shù)據(jù)統(tǒng)計時,GROUP BY 關鍵字經(jīng)常和聚合函數(shù)一起使用。聚合函數(shù)包括: COUNT()
,SUM()
,AVG()
,MAX()
和 MIN()
。
-
COUNT()
用來統(tǒng)計記錄的條數(shù); -
SUM()
用來計算字段值的總和; -
AVG()
用來計算字段值的平均值; -
MAX()
用來查詢字段的最大值; -
MIN()
用來查詢字段的最小值。
SELECT sex,COUNT(sex) FROM tb_students_info GROUP BY sex; --統(tǒng)計指定的字段的數(shù)量
WITH POLLUP 關鍵字用來在打印所有分組記錄的最后加上一條記錄,這條記錄是上面所有記錄的總和,即統(tǒng)計記錄數(shù)量。?GROUP BY sex WITH ROLLUP;
having 可以用來過濾分組的一些信息,類似where,支持where里所有的操作。但也有差異
- where用于過濾數(shù)據(jù)行,having用于過濾分組
- where查詢不可以使用聚合函數(shù),having可以使用聚合函數(shù)。
- where語句是在分組前進行過濾,而having是在分組后進行過濾。
- where是根據(jù)數(shù)據(jù)庫文件過濾,而having是根據(jù)查詢結果進行過濾。(having查詢的結果必須select有查詢)
- where查詢中不可以使用字段別名,但having可以使用字段別名。
表連接:
表連接分為三種:交叉連接、內連接、外連接
交叉連接相當于兩個表的笛卡爾積,和內連接不加過濾條件是一樣的效果。交叉用的較少,因為效率不高。使用的關鍵字是cross join 也可以省略。使用語法如下
SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句]
或者
SELECT <字段名> FROM <表1>, <表2> [WHERE子句]
?內連接:通過關鍵字inner join 來連接兩張表。再通過on來設置內連條件(通過條件來連接對應的數(shù)據(jù)行,有對應匹配關系),如果不加on設置條件,則也相當于計算兩個表的笛卡爾積。且多個表連接時,在from后面繼續(xù)使用inner join on即可實現(xiàn)多表連接。
SELECT *
FROM resource AS b
INNER JOIN resource_type AS a
ON a.type_id=b.resource_type
--多表查詢
SELECT *
FROM material_record_info AS a
INNER JOIN material_info AS b1
ON a.m_id=b1.material_id
INNER JOIN user_info AS b2
ON a.u_id=b2.user_id
外連接:?外連接會先將表分為基表和參考表,再以基表為依據(jù)返回滿足和不滿足條件的記錄,外連接分為左連接和右連接。
左外連接和右外連接的區(qū)別是:左外連接即基表在關鍵字left outer join的左邊,右外連接基表在關鍵字left outer join的右邊。
那么基表有什么意義和作用呢?就是在進行條件匹配時,基表沒有匹配到對應數(shù)據(jù)的數(shù)據(jù)行也會被返回,在沒有匹配到對應數(shù)據(jù)的行里用null來填充。簡單來說就是基表的所有數(shù)據(jù)行均會被返回。
外連接的使用語法和內連接很類似,只是在關鍵字前加了限定詞left或者right
SELECT *
FROM resource_type AS a
LEFT OUTER JOIN resource AS b
ON a.type_id=b.resource_type
子查詢:? ?
子查詢也可以實現(xiàn)類似于表連接的多表查詢,但也有區(qū)別,子查詢是將一個查詢語句嵌套在另一條查詢語句里。其中,連接子查詢的操作符可以是 in、not in、exists、not exists等關鍵字。子查詢可以在select、update、delete里使用。
--查大于80分的教師信息 子查詢
SELECT *
FROM teacher AS t
INNER JOIN course AS c
ON t.t_id=c.t_id
WHERE c.c_id IN(
SELECT c_id
from score student_db
GROUP BY c_id
HAVING AVG(score>80)
)
-- exists:如果符合條件,外集合返回表所有內容;加上and判斷條件,就只返回符合兩個條件的信息
SELECT *
FROM user_info AS a
WHERE EXISTS(
SELECT *
FROM material_record_info as b
WHERE b.u_id=7
)AND user_id=7;
子查詢和表連接的區(qū)別:
? 一般來說,表連接都可以用子查詢來替代,反之不然,有點子查詢不能用表連接替換。子查詢比較靈活,直觀,會使sql語句更容易閱讀和編寫,適合用于篩選數(shù)據(jù)。而表連接更適合查看數(shù)據(jù)表的連接。
select查詢語句的執(zhí)行順序:
除了select查詢語句的語法順序我們需要掌握,select語句在內存的執(zhí)行順序我們也需要掌握。大題一共可以分為10步:文章來源:http://www.zghlxwxcb.cn/news/detail-480544.html
- From:計算兩個表的笛卡爾積,都到一個虛擬表V1,這是所有select語句最先執(zhí)行的操作,其操作都需要在V1的基礎上。
- On:從V1中篩選出符合條件的數(shù)據(jù),形成虛擬表V2。
- Join:將該join的數(shù)據(jù)補充到V2,形成V3。
- Where:執(zhí)行篩選(不能使用聚合函數(shù)),得到V4。
- Group By:對數(shù)據(jù)進行分組,得到V5.
- Having:對分組后的數(shù)據(jù)進行篩選(可以用聚合函數(shù)),篩選結果為V6。
- Select:得到返回列的數(shù)據(jù)V7。
- Distinct:去重,過濾掉重復數(shù)據(jù),得到V8。
- Order By:排序,得到V9。
- limit:返回需要的行數(shù)。
注意:文章來源地址http://www.zghlxwxcb.cn/news/detail-480544.html
- GROUP BY 條件中,每個列必須是有效列,不能是聚合函數(shù)
- NULL 值也會作為一個分組返回
- 除了聚合函數(shù),SELECT 子句中的列必須在 GROUP BY 條件中
到了這里,關于數(shù)據(jù)庫的基礎學習1:select語句的查詢的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!