1. 程式人生 > >Mysql資料庫學習(3)DQL

Mysql資料庫學習(3)DQL

恩 ,在資料庫中一直都是認為查詢是最難的。因為種類多,花樣也太多了,要查哭。但還是學到了很多東西啊,在以後的開發中一定可以用上的,回想起我們實踐周老師給講的。

一個模組 增刪改查 至少8個功能
    1.查詢全部
    2.按條件查詢
    3.按主鍵查詢
    4.按分頁查詢
    5.增加一個
    6.批量增加
    8.按主鍵修改主要欄位
    9.特殊修改(修改一個欄位就需要一個頁面,例如修改密碼 找回密碼 稽核)
    10.按主鍵刪除一個
    11.批量刪除

查詢中要用到的:

字句: where/having /limit(o,l) / ORDER BY(desc,asc) /  GROUP BY /

方式:精確查詢、模糊查詢

型別:聯合查詢 / 子查詢 / 連線查詢  針對多張表所做的查詢
         聯合查詢: 資料容易造成冗餘,影響查詢速度。

0.基本查詢

select sid,sname,sage,ssex,szhuanye from student
select * from student 這兩句話的作用是等效的,你可以把所有的欄位全部列出來,也可以寫星星(*)代表所有的欄位。在實際應用中這種查詢是存在的,比如檢視所用使用者資訊。

1. WHERE條件子句
# = !=(<>) > < >= <=  is   is not
# and or not
# between...and (包含邊界)
# in(value,value,value)

只能說where是非常強大的,基本上要新增條件都能搭得上這個關鍵字。where一下就很舒服~如果是多個條件用and關鍵字連線
利用了where很容易見名知意,翻譯起來比較順暢我覺得。

select sid,sname,sage,ssex,szhuanye from student where sid=100012
select sid,sname,sage from student where sage=19

select sid,sname,sage,ssex,szhuanye from student where sage>=18 and  sage<=20
select * from student where sage not between 18 and 20
select * from student where sage=18 or sage=20 or sage=25
select * from student where sage in(18,20,25)


# 起別名: as
select sage as 新年齡 from student where sid=100000

# 把查詢結果看做臨時的虛擬表

select uid,username as '使用者名稱' from users

查詢結果只能看做"虛擬表" : 具有表的形式,但沒有物理存在

#在查詢中使用聚合函式 count sum avg min max

聚合函式
統計
select count(uid) as '使用者總數' from users
select count(uid) from users where age>30

求和
select SUM(age) as '年齡之和' from users

求平均值
select avg(age) as '平均年齡'  from users

最大值和最小值
select min(age) as '最小年齡' from users;
select max(age) as '最大年齡' from users

# where中使用模糊查詢 LIKE
# 萬用字元:  %表示任意數量的任意字元 _表示一個單位的任意字元,我覺得模糊查詢是第二簡單的,哈哈哈。只要按照語法匹配一下,他叫什麼,姓什麼,記清楚%和_的含義,就很容易寫出滿足條件的sql語句。

名字中帶有"靜"
select * from users where username LIKE '%靜%'

姓張的人有誰
select * from users where username LIKE '張%'

名字是兩個字的人有哪些
select * from users where username LIKE '__'

2.LIMIT 限定(用於實現分頁)
limit offset,length
offset: 起始位置, 從0開始
length:長度
select * from users LIMIT 0,3
select * from users LIMIT 5,3

規定每頁顯示3條
第1頁:
select * from users LIMIT 0,3
第2頁:
select * from users LIMIT 3,3

頁數: pageNumber
每頁記錄數: pageSize

 根據變數,任意頁數/任意記錄數
select * from users LIMIT (pageNumber-1)*pageSize,pageSize

3.order by 排序
asc 升序 預設
desc 降序
select * from users ORDER BY age asc
select * from users ORDER BY age desc

4.group by 分組
select count(uid) from users where address='桐梓林'
select count(uid) from users where address='九眼橋'

select count(uid),address from users GROUP BY address

5.having子句  
#group by帶有條件:
# 如果和欄位有關的條件使用where,且where放在group by前邊
# 如果和查詢結果有關的條件使用having,且having放在group by的後邊

--------------------------------

6. 聯合查詢 多張錶針對指定的欄位全查詢過程(數量:笛卡爾積)
A表  B表   通過A和B之間的欄位的聯絡,建立對等關係

--------------------------------
7. 子查詢,方式一,where型子查詢
# 查詢所有年齡比平均年齡小的同學資訊

-- select sid,sname,sage,avg(sage) as a from student having sage<a

-- 把括號內部看做內查詢, 括號外看做外查詢
select *  from student where sage<(select avg(sage) from student)

# 本質上,把內查詢的結果看成一個定值,供外查詢作為查詢條件
    注意: 內查詢的結果必須是1個值

#子查詢,方式二
# in / not in

select * from student where sid  in
(select sid from students where sex='男')

# 本質上,把內查詢的結果看成一個虛擬表,供外查詢作為查詢條件

-- 子查詢方式三: from型子查詢
本質: 把子查詢的結果看做一張表
select * from (select * from tableName)

-- 使用not in 改寫分頁操作
    每頁顯示10條記錄
-- 第1頁: 排除0頁的內容之外的記錄數
    select * from tableName limit 0,10
-- 第2頁: 排除1頁的內容之外的記錄數
    select * from tablename where id
    not in(select * from(select id from tableName limit 0,10) as t) limit 0,10

-- 第3頁: 排除1和2頁的內容之外的記錄數

注意: 子查詢在執行效率上,常常會和連線查詢做比較
    通常, 能使用連線查詢的時候儘量不用子查詢 ,但非絕對
    具體的使用方式,要通過執行速度的測試
--------------------------------

8. 連線查詢: 左連線 右連線 內連線
-- 連線條件使用on(不使用where)

-- 左連線: left join
-- 表a left jion 表b , 資料將參照表a的完整性,表b去匹配表a的資料,如果沒有匹配的資料就顯示null

select * from students s
LEFT JOIN score sc
on s.sid = sc.sid
where s.age>18

-- 右連線: right join
-- 表a right jion 表b   等價於:   表b left jion 表a
select * from student s RIGHT JOIN score sc on s.sid = sc.sid

-- 內連線: inner join
-- 在保證連線的表之間都不存在null的情況下,進行資料的匹配
select * from student s INNER JOIN score sc on s.sid = sc.sid