5.7 數據庫單表查詢

查詢語法

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

簡單查詢

查詢所有字段和值

SELECT * FROM 表名;

按照字段查詢 

SELECT 字段1,字段2  FROM 表名;

避免重複查詢

SELECT DISTINCT 字段 FROM 表名;

 帶運算符查詢

SELECT 字段1, 字段2*12 FROM 表名;  # 將字段2 的值 *12 後輸出
SELECT 字段1, 字段2*12 AS 別名 FROM 表名;
SELECT 字段1, 字段2*12 別名 FROM 表名;

定義顯示格式

CONCAT() 函數用於鏈接字符串
SELECT CONCAT('姓名: ',字段1,'  年薪: ', 字段2*12)  AS Annual_salary  FROM 表名;
   

CONCAT_WS() 第一個參數爲分隔符
SELECT CONCAT_WS(':',字段1,字段2*12)  AS 別名 FROM 表名;

where約束

where字句中可使用:

1. 比較運算符:> < >= <= <> !=

2. between 80 and 100 值在10到20之間

3. in(80,90,100) 值是80或90或100

4. like 'eg%' 能夠是%或_, %表示任意多字符 _表示一個字符  like 'e__n' :
5. 邏輯運算符:在多個條件直接可使用邏輯運算符 and or not

單條件查詢

SELECT 字段1 FROM 表名  WHERE 字段2='';

多條件查詢

and 和 or 同級別的時候, and 會先進行判斷, 其次輪到 or正則表達式

可使用 ()框選後進行順序的調整數據庫

where a and b or c  先計算 a and b。 而後是在計算 or c函數

where a and (b or c)  先計算 b or c。 而後是在計算 and apost

SELECT 字段,字段2 FROM 表名  WHERE 字段='' AND 字段>值;

關鍵字BETWEEN AND  

  左右都包含等於 >= 值1 and <=值2
spa

SELECT 字段1,字段2 FROM 表名 WHERE 字段 BETWEEN 值1 AND 值2;

關鍵字IS NULL

  判斷某個字段是否爲NULL不能用等號,須要用IScode

SELECT 字段1,字段2 FROM 表名 WHERE 字段2 IS NULL;

關鍵字IN集合查詢

SELECT 字段1,字段2 FROM 表名 WHERE 字段1=值1 OR 字段2=值2 OR 字段3=值3;

SELECT 字段1,字段2 FROM 表名 WHERE 字段1 IN (值1,值2,值3) ;

SELECT 字段1,字段2 FROM 表名 WHERE 字段1 NOT IN (值1,值2,值3) ;

關鍵字LIKE模糊查詢

通配符’%SELECT * FROM 表名
WHERE 字段 LIKE '值%';

通配符’_’
SELECT * FROM 表名
WHERE 字段 LIKE '值__';

使用正則表達式查詢

1.select * from 表名 where 字段 regexp '^ale';      #匹配以ale開頭的員工信息
2.select * from 表名 where 字段 regexp 'on$';      #匹配以on結尾的員工信息
3.select * from 表名 where 字段 regexp 'n{1,2}';    #匹配字段裏面包含1到2個n的員工信息

小結:對字符串匹配的方式
where 字段 = 'egon';
where 字段 like 'yua%';
where 字段 regexp 'on$';

having過濾

用法

用法同 where 

select * from 表名 where 字段>值;    
select * from 表名 having 字段>值;  

於 where 的區別

# 執行優先級從高到低:where > group by > 聚合函數 > having >order by

# where和having的區別
1. Where 是一個約束聲明,使用Where約束來自數據庫的數據,Where是在結果返回以前起做用的 (先找到表,按照where的約束條件,從表(文件)中取出數據),Where中不能使用聚合函數
2. Having 是一個過濾聲明,是在查詢返回結果集之後對查詢結果進行的過濾操做,可繼續使用聚合函數 (先找到表,按照where的約束條件,從表(文件)中取出數據,而後group by分組, 若是沒有group by則全部記錄總體爲一組,而後執行聚合函數,而後使用having對聚合的結果進行過濾),
3. where的優先級比having的優先級高
4. having能夠放到group by以後,而where只能放到group by 以前。

舉例

select depart_id,count(id) from employee group by depart_id having depart_id = 3;   # group 後只能使用 having 
select max(salary) 最大工資 from employee where id>2 group by depart_id having count(id)>3;  # where 只能使用在 group 以前  # having 中可使用聚合函數 

分組查詢 group by

單獨使用GROUP BY關鍵字分組

  咱們按照 字段1 分組,那麼select查詢的字段只能是 字段1,想要獲取組內的其餘相關信息,須要藉助函數regexp

select 字段1 from 表名 group by 字段1;

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;  #按照崗位分組,並查看每一個組有多少人

使用場景:

  通常查詢出來的數據有大量重複的時候基於分組能夠更好的摺疊數據orm

關鍵字的執行優先級(重點)

 重點中的重點

關鍵字的執行優先級blog

from
  where
    group by
      having
        select
          distinct
            order by
              limit排序

1.找到表:from

2.拿着where指定的約束條件,去文件/表中取出一條條記錄

3.將取出的一條條記錄進行分組group by,若是沒有group by,則總體做爲一組

4.若是有聚合函數,則將組進行聚合

5.將4的結果過濾:having

6.查出結果:select

7.去重

8.將6的結果按條件排序:order by

9.將7的結果限制顯示條數

查詢排序order by 

按單列排序
    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;


===========order by==========
1.select * from employee order by salary;  #若是不指定,默認就是升序
2.select * from employee order by salary asc;  # 升
3.select * from employee order by salary desc;  # 降

#先按照年齡升序,當年齡相同的太多,分不清大小時,在按照工資降序
4.select * from employee order by age asc, salary desc;

使用聚合函數查詢

先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) form employee WHERE depart_id=3;

限制查詢的記錄數:LIMIT

格式

limit n,m   

  n 從第幾條數據開始 ,默認爲 0 ,爲 0 時可忽略不寫 

  m 取出數據數量,不包含第n個數據 
=========limit:限制打印幾條=========
select * from 表名 limit 3;    #打印前三條

# 像這樣表示的:指的是從哪開始,日後取幾條 (這樣的操做通常用來分頁)
select * from 表名 limit 0,3;  # 取出 第 1,2,3 條數據
select * from 表名 limit 3,4;  # 取出 第 4,5,6,7 條數據 

select * from 表名 order by 字段 desc limit 3; #查看後三條
相關文章
相關標籤/搜索