1. 程式人生 > >MySQL 數據庫之單表查詢

MySQL 數據庫之單表查詢

and 使用 count 得到 註意 記錄 order by 我們 函數

一.查詢語法

SELECT 字段1,字段2... FROM 表名
                  WHERE 條件
                  GROUP BY field
                  HAVING 篩選
                  ORDER BY field
                  LIMIT 限制條數

二.關鍵字執行優先級

from
where
group by
having
select
distinct
order by
limit

1.找到表:from
2.拿著where指定的約束條件,去文件/表中取出一條條記錄
3.將取出的一條條記錄進行分組group by,如果沒有group by,則整體作為一組 4.按照select後的字段得到一張新的虛擬表,如果有聚合函數,則將組內數據進行聚合 5.將4的結果過濾:having 6.查出結果:select 7.去重 8.將結果按條件排序:order by 9.限制結果的顯示條數

三.查詢實例

#簡單查詢
    SELECT id,name,sex,age,hire_date,post,post_comment,salary,office,depart_id 
    FROM employee;

    SELECT * FROM employee;

    SELECT name,salary FROM employee;

#避免重復DISTINCT SELECT DISTINCT post FROM employee; #通過四則運算查詢 SELECT name, salary*12 FROM employee; SELECT name, salary*12 AS Annual_salary FROM employee; SELECT name, salary*12 Annual_salary FROM employee; #定義顯示格式 CONCAT() 函數用於連接字符串 SELECT CONCAT(姓名: ,name, 年薪: , salary*12) AS Annual_salary FROM employee; CONCAT_WS() 第一個參數為分隔符 SELECT CONCAT_WS(
:,name,salary*12) AS Annual_salary FROM employee;

四.where約束

  註意:where是一種約束條件,mysql會拿著where指定的條件去表中取數據,而having則是在取出數據後進行過濾

where字句中可以使用:
1. 比較運算符:> < >= <= <> !=
2. between 80 and 100 值在10到20之間
3. in(80,90,100) 值是10或20或30
4. like egon%
    pattern可以是%或_,
    %表示任意多字符
    _表示一個字符 
5. 邏輯運算符:在多個條件直接可以使用邏輯運算符 and or not

五.group by

  大前提:可以按照任意字段分組,但分完組後,只能查看分組的那個字段,要想取的組內的其他字段信息,需要借助函數

實例:
單獨使用GROUP BY關鍵字分組 SELECT post FROM employee GROUP BY post; 註意:我們按照post字段分組,那麽select查詢的字段只能是post,想要獲取組內的其他相關信息,需要借助函數 GROUP BY關鍵字和GROUP_CONCAT()函數一起使用 SELECT post,GROUP_CONCAT(name) FROM employee GROUP BY post;
#按照崗位分組,並查看組內成員名 SELECT post,GROUP_CONCAT(name) as emp_members FROM employee GROUP BY post; GROUP BY與聚合函數一起使用 select post,count(id) as count from employee group by post;#按照崗位分組,並查看每個組有多少人

六.使用聚合函數查詢 

先from找到表

再用where的條件約束去表中取出記錄

然後進行分組group by,沒有分組則默認一組

然後進行聚合

最後select出結果

示例:
    SELECT COUNT(*) FROM employee;
    SELECT COUNT(*) FROM employee WHERE depart_id=1;
    SELECT MAX(salary) FROM employee;
    SELECT MIN(salary) FROM employee;
    SELECT AVG(salary) FROM employee;
    SELECT SUM(salary) FROM employee;
    SELECT SUM(salary) FROM employee WHERE depart_id=3;

七.having過濾

HAVING與WHERE在語法上是一樣的
select * from employee where salary > 10000;
select * from employee having salary > 10000;
#!!!執行優先級從高到低:where > group by > 聚合函數 > having 
#1. Where 是一個約束聲明,使用Where約束來自數據庫的數據,Where是在結果返回之前起作用的(先找到表,按照where的約束條件,從表(文件)中取出數據),Where中不能使用聚合函數。

#2. Having是一個過濾聲明,是在查詢返回結果集以後對查詢結果進行的過濾操作(先找到表,按照where的約束條件,從表(文件)中取出數據,然後group by分組,如果沒有group by則所有記錄整體為一組,然後執行聚合函數,然後使用having對聚合的結果進行過濾),在Having中可以使用聚合函數。

#3. having可以放到group by之後,而where只能放到group by之前

#4. 在查詢過程中聚合語句(sum,min,max,avg,count)要比having子句優先執行。而where子句在查詢過程中執行優先級高於聚合語句。

八.查詢排序

按單列排序
    SELECT * FROM employee ORDER BY salary;
    SELECT * FROM employee ORDER BY salary ASC;
    SELECT * FROM employee ORDER BY salary DESC;

按多列排序:先按照age排序,如果年紀相同,則按照薪資排序
    SELECT * from employee
        ORDER BY age,
        salary DESC;

九.限制查詢的記錄數

示例:
    SELECT * FROM employee ORDER BY salary DESC 
        LIMIT 3;                    #默認初始位置為0 
    
    SELECT * FROM employee ORDER BY salary DESC
        LIMIT 0,5; #從第0開始,即先查詢出第一條,然後包含這一條在內往後查5條

    SELECT * FROM employee ORDER BY salary DESC
        LIMIT 5,5; #從第5開始,即先查詢出第6條,然後包含這一條在內往後查5條

MySQL 數據庫之單表查詢