1. 程式人生 > >MYSQL(簡單查詢,單行查詢,多行查詢)

MYSQL(簡單查詢,單行查詢,多行查詢)

一、簡單查詢

1.資料查詢      

 SELECT colName1,colName2,colName3,.. FROM tName [約束]

    SELECT 選擇查詢列表    FROM 提供資料來源(表、檢視或者其他資料來源)

    //查詢所有的列,顯示順序和建立表中的順序一致

    SELECT * FROM tName 

=======================================
                        全列/投影查詢
=======================================
練習
1,查詢所有員工資訊
select * from emp;
2,查詢每個員工的編號、姓名、職位
select empno,ename,job form emp;
3,查詢所有部門資訊
select * from dept; 

2.避免重讀(去重)-DISTINCT

SELECT DISTINCT colName FROM tName

  =======================================
                        消除重複
=======================================
distinct關鍵字可以用於一列,也可以用於多列

練習
1,查詢所有有員工的部門編號
select distinct deptno  from emp;
2,查詢哪些部門和職位有員工
select distinct job,deptno from emp;
 只有當job和deptno相同,才認為是重複的資料。

3.資料運算查詢

        對NUMBER型別,可以使用算術操作符建立表示式 (+ - * /)
        對DATE型別,可以使用部分算術運算子建立表示式(+ -)
        運算子優先順序
            1.先乘除後加減
            2.同級運算子,從左到右
            3.表示式中使用“括號”,可強行改變運算順序
=======================================
                        算術操作符
=======================================
練習
1,查詢所有員工的年薪
select ename,sal * 12 '年薪' from emp;
2,查詢所有員工的年薪(使用別名)
3,查詢每月都有500元的餐補和200元交通補助並且年底多發一個月工資的年薪
select ename,(sal + 500 + 200)*12+sal '年薪'from emp;
4,演示date型別資料的運算:查詢員工的僱傭日期加上10
select DATE_ADD(hiredate,INTERVAL 10 DAY) from emp;

4.空值查詢-IS NULL

WHERE colName IS NULL

=======================================
                        空值判斷
=======================================
空值:
1、空值是指不可用、未分配的值,也就是沒有值。
2、空值不等於零或空格
3、任意型別都可以支援空值,也就是說任何型別的欄位都可以允許空值作為值的存在
*注意:包括空值的任何算術表示式都等於空

練習:
查詢所有員工的年終獎((月薪+獎金)*12)
select ename,(IFNULL(comm,0)+sal)*12 '年薪' from emp ;
函式:IFNULL(expr1,expr2)          
如果expr1不是NULL,IFNULL()返回expr1,否則它返回expr2

使用IS NULL(IS NOT NUll)運算子
1,查詢有獎金的員工資訊
SELECT * from emp where comm is not NULL;
2,查詢公司的老闆
select * from emp where mgr is null;   

5.where子句  

    使用WHERE子句限定返回的記錄
  

 SELECT colName1,colName2 FROM tName [WHERE 限制條件 AND/OR 限制條件2]

=======================================

                        限定查詢
=======================================
注意:
1、字串和日期要用單引號擴起來
2、數字型別直接書寫
3、字串是大小寫不敏感的,日期值是格式敏感的
4、字串敏感,需要新增binary關鍵字

練習
要求查詢出基本工資高於1500的所有員工資訊
select * from emp where sal >= 1500;
1,查詢名字叫SCOTT的員工所從事的工作
select * from emp where ename = 'scott';
嚴格區分大小寫,binary
select * from emp where binary ename = 'SCOTT';
2,查詢1981年入職的員工資訊.
select * from emp where hiredate between '1981-01-01' and '1981-12-31';

6.比較運算子(字串型別和日期型別需要加上單引號)

   >,<,>=,<=,=,!=(<>)
  =======================================
                        比較運算子
=======================================
常用算術比較運算子:
1,=,!=,<>,>,>=,<,<=:等於和不等於
2,BETWEEN ... AND  ...:在兩值之間 (包含開始和結尾);
3,IN(list):匹配列出的值;
4,LIKE :匹配字串模式;
5,IS NULL:是否為空;

練習:
使用比較運算子
1,查詢1981年之後入職的員工資訊
select * from emp where hiredate > '1981-12-31';
2,查詢年薪小於3W的員工
select * from emp where (sal * 12) < 30000;
3,查詢所有不是銷售人員的員工資訊
select * from emp where not job = 'salesman';
使用BETWEEN運算子
1,查詢工資在2000-3000之間的員工資訊
select * from emp where sal between 2000 and 3000;
2,查詢工資不在2000-3000之間的員工資訊
select * from emp where  not sal between 2000 and 3000;
3,查詢1981年入職的員工
select * from emp where hiredate between '1981-01-01' and '1981-12-31';
        限制區分大小寫,在WHERE子句後面加上BINARY(很少用)

7.集合查詢

        IN運算子,判斷列的值是否在指定的集合中
      

 WHERE colName in(value1,value2...)

1,查詢工資為800或1600或3000的員工
select * from emp where sal in(800,1600,3000);
2,查詢工資不為800或1600或3000的員工
select * from emp where not sal in(800,1600,3000);

8.模糊查詢

        使用LIKE運算子執行萬用字元查詢,查詢條件可包含文字字元或數字,  使用LIKE運算子LIKE運算子必須使用萬用字元才有意義:
        萬用字元:用來實現匹配部分值的特殊字元
        匹配單個字元:_;             ->  1個
        匹配任意多個字元:%;      ->  0個、1個、多個
=======================================
                        like運算子
=======================================
1.查詢出所有僱員姓名是以A開頭的全部僱員資訊。
select * from emp where ename like 'A%';
2.查詢出僱員姓名第二個字母是M的全部僱員資訊。
select * from emp where ename like '_M%';
3.查詢出僱員姓名任意位置上包含字母A的全部僱員資訊。
select * from emp where ename like '%a%';

9.邏輯運算子    

AND                      組合條件都是TRUE,返回TRUE
OR 一個條件為TRUE,返回TRUE
NOT     如果跟上的條件為TRUE,返回FALSE

        優先順序    比較運算子>NOT>AND>OR
    範圍查詢-BETWEEN minvalue AND maxvalue[閉區間範圍]
        使用between運算子顯示某一值域範圍內的記錄,這個操作符最常見的使用在數字型別和日期型別資料的範圍上,但對於字元型別和日期型別同樣可用
        select * from tName where colName between minvalue and maxvalue

=======================================
                        邏輯運算子
=======================================
AND:如果組合的條件都是true,返回true.  
OR:如果組合的條件 之一是true,返回true.
NOT:如果下面的條件是false,返回true.

優先順序規則:    比較運算子 > NOT > AND > OR

SQL的執行順序是from-->where-->select-->ORDER BY

練習:
1,查詢姓名中有e或者a的員工姓名
select * from emp where ename like '%e%' or ename like '%a%';
2,查詢工資在1500~3000之間的全部員工資訊
select * from emp where sal between 1500 and 3000;
3,查詢出職位是辦事員(CLERK)或者是銷售人員(SALESMAN)的全部資訊,並且工資在1000以上.
select * from emp where (job = 'CLERK'or job ='SALESMAN') and sal >= 1000;

10.結果排序

    排序語法和規則
        使用ORDER BY 子句將查詢記錄進行排序
        ASC:升序,預設
        DESC:降序
        ORDER BY 子句在SELECT子句的最後
    
    按單列排序

  SELECT * FROM tName ORDER BY colName [DESC\ASC]    

    按多列排序(先後)

SELECT * FROM tName ORDER BY colName1 [DESC\ASC],colName2 [DESC\ASC]

    列的別名排序(別名使用單引號之後不能排序)

  1. SELECT colName AS cn FROM tName ORDER BY cn [DESC\ASC]

  2. SELECT colName AS 'c n' FROM tName ORDER BY 'c n' [DESC\ASC] FALSE

=======================================
                        結果排序
=======================================
使用ORDER BY 子句將記錄排序
ASC: 升序,預設
DESC: 降序

ORDER BY 子句出現在SELECT語句的最後
ORDER BY 可以使用別名

練習:
1,查詢所有員工資訊,按照工資排序
select * from emp order by sal ASC;
2,查詢所有員工資訊,按照年薪降序排序;
select ename,sal * 12 '年薪' from emp ORDER BY (sal * 12) DESC;
3,查詢所有員工資訊,按照部門和年薪降序排序;
select ename,deptno,sal * 12 '年薪' from emp ORDER BY deptno desc,sal * 12 ASC;
 

11.列別名

        1.改變列的標題頭       
        2.用於表示計算結果的含義
        3.作為列的表名
        4.如果別名中使用特殊字元,或者強制大小寫敏感,或者有空格的時候,都需要加單引號(不建議使用列的別名使用單引號,因為一旦使用,該列不能排序)
        5.as可以省略(不建議省略)
        SELECT colName as newName FROM tName

MySQL查詢函式

    函式的分類:
    1,單行函式:將每條資料進行獨立的計算,然後每條資料得到一條結果。
    2,多行函式:多條資料同時計算,最終得到一條結果資料。也成為聚集函式、分組函式, 主要用於完成一些統計功能。

二、聚合函式(組函式、多行函式)

 聚合函式作用於一組資料,並且對一組資料返回一個值

    統計結果記錄數:COUNT
    統計計算最大值:MAX
    統計計算最小值:MIN
    統計計算求和:   SUM
    統計計算平均值:AVG

  1. SELECT AVG(colName1) FROM tName

  2. SELECT COUNT(*)\COUNT(id) FROM tName

=======================================
            多行函式--->常用的統計函式
=======================================
分組函式在計算時省略列中的空值
不能在where語句中使用分組函式

查詢所有員工每個月支付的平均工資及總工資
select AVG(sal),sum(sal) from emp;
查詢月薪在2000以上的員工總人數.
select COUNT(*) from emp where sal > 2000;
查詢員工最高工資和最低工資差距
select MAX(sal),MIN(sal) from emp;

三、單行函式

1.字元函式

=======================================
            單行函式--->字元函式
=======================================

    (1).字串大小寫轉換

    LOWER(str):返回字串str變為小寫字母的字元

    UPPER(str):返回字串str變為大寫字母的字元
    --------------------------------------------------------
    把HelloWorld轉換為全大寫,全小寫.
    select LOWER('HelloWorld');
    select UPPER('HelloWorld');

    (2).字串拼接

    CONCAT(str1,str2,...):

    1,返回結果為連線引數產生的字串。
    2,如有任何一個引數為NULL ,則返回值為 NULL
    3,允許有一個或多個引數
    -------------------------------------------------------
    1,查詢所有員工的全名
    select CONCAT('查詢出',ename,'的全名') from emp;
    2,查詢得到輸出結果:某某's'的月薪是:xx
    select CONCAT(ename,'的月薪是',sal) from emp;

    (3).檢視字串長度

    CHAR_LENGTH:字串長度;

    LENGTH:字串長度(單位為位元組);

    對比試驗:
    SELECT CHAR_LENGTH('龍哥17歲') FROM DUAL;
    SELECT LENGTH('龍哥17歲') FROM DUAL;
 

    (4).字串填補

    LPAD(str,len,padstr)

    1,返回字串str, 其左邊由字串padstr 填補到len字元長度。
    2,假如str 的長度大於len, 則返回值被縮短至len 字元。
    SELECT LPAD('ABC',7,'X'),LPAD('ABC',5,'X'),LPAD('ABC',3,'X'),LPAD('ABC',1,'X') FROM DUAL;
    返回的結果是XXXXABC             XXABC             ABC                A

    RPAD(str,len,padstr)

    1,返回字串str, 其右邊被字串padstr填補至len 字元長度。
    2,假如字串str 的長度大於 len,則返回值被縮短到與len 字元相同長度。
 

    (5).字串去空格

    LTRIM(str):左邊空格被trim掉;
    RTRIM(str):右邊空格被trim掉;

    TRIM(str)=LTRIM+RTRIM
    TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str):高階用法,從str中按照指定方式擷取remstr;
    TRIM(remstr FROM] str):相當於TRIM(BOTH remstr FROM str);

    SELECT LTRIM(' A B C '),RTRIM(' A B C '),TRIM(' A B C ') FROM DUAL;
    返回的結果是   A B C_          _A B C           A B C

     (6).字串替換

    REPLACE(str,from_str,to_str):

    1,在str中把from_str全部替換為to_str;
    2,大小寫敏感;

    SELECT REPLACE('ABCDaBCABA','A','X') FROM DUAL;
                                XBCDaBCXBX

    (7).字串擷取

    SUBSTRING(str,pos):

    從字串str返回一個子字串,起始於位置pos
    SELECT SUBSTRING('asdfghijkl', 3);         [0,3)       dfghijkl

    SUBSTRING(str,pos,len):

    從字串str返回一個長度同len字元相同的子字串,起始於位置pos
    SELECT SUBSTRING('asdfghjkl', 3, 2);                df

    如果pos是負數,從字串尾部開始計算;
    SELECT SUBSTRING('ABCDEF',-3),SUBSTRING('ABCDEF',-3,3) FROM DUAL;

                                    def                                                def

2.數字函式

=======================================
            單行函式--->數字函式
=======================================

    (1).取絕對值

        ABS(x):返回一個數字的絕對值;

        SELECT ABS(-17),ABS(17) FROM DUAL;

        17       17

    (2).取模 

        MOD(N,M):返回N 被 M除後的餘數;
        SELECT MOD(10,5),MOD(10,3) FROM DUAL;
        0         1

    (3).取天花板

        CEIL(x):返回不小於X 的最小整數值;

        SELECT CEIL(0.5),CEIL(-1.5),CEIL(1.5) FROM DUAL;
                          1         -1        2

    (4).取地板

        FLOOR(x):返回不大於X的最大整數值;
        SELECT FLOOR(0.5),FLOOR(-1.5),FLOOR(1.5) FROM DUAL;
                                0              -2         1

    (5).四捨五入

        ROUND(X) /ROUND(X,D):

        1,返回引數X, 其值接近於最近似的整數。  
        2,在有兩個引數的情況下,返回X ,其值保留到小數點後D位,而第D位的保留方式為四捨五入。
        3,若要接保留X值小數點左邊的D 位,可將 D 設為負值。
        select ROUND(1.5);
        select ROUND(1.49);
        SELECT ROUND(3.1465926,2);            3.15
        SELECT ROUND(321.1415926,-2);
        TRUNCATE(X,D)

        (6).截去函式

        1,返回被捨去至小數點後D位的數字X。

            select TRUNCATE(3.1415926,2);
        2,若D 的值為 0, 則結果不帶有小數點或不帶有小數部分。可以將D設為負數,若要截去(歸零) X小數點左起  第D位開始後面所有低位的值.
            select TRUNCATE(3.1415926,0);
            select TRUNCATE(312.1415926,-1);

3.日期函式

=======================================
            單行函式--->日期函式
=======================================
獲取當前系統時間
select NOW();

DATE_ADD(date,INTERVAL expr type)/DATE_SUB(date,INTERVAL expr type)向日期新增指定的時間間隔
1,執行日期運算;
2,date 是一個 DATETIME 或DATE值,用來指定起始時間;
3,expr 是一個字串表示式,用來指定從起始日期新增或減去的時間間隔值;
4,type 為關鍵詞,它指示了表示式被解釋的方式

SELECT DATE_ADD('2016-10-13',INTERVAL 22 DAY) FROM DUAL;        2016-11-4
SELECT DATE_ADD(NOW(),INTERVAL 100 DAY) FROM DUAL;

使用方法參考MYSQL 5.5中文參考手冊547頁;
--------------------------------------------------------------------------
type 引數可以是下列值:
Type 值
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH

SELECT CURRENT_DATE(),CURRENT_TIME() FROM DUAL;

DATEDIFF(expr,expr2):返回起始時間expr和結束時間expr2之間的天數

SELECT DATEDIFF('2016-05-08','2016-11-04')'天數' FROM DUAL;

DAY(date):獲取日期中的天數(DAYOFMONTH)
select DAY(NOW());
HOUR(time)
返回time 對應的小時數。對於日時值的返回值範圍是從 0 到 23
select HOUR(NOW());
MINUTE(time)
返回 time 對應的分鐘數,範圍是從 0 到 59
select MINUTE(NOW());
MONTH(date)
返回date 對應的月份,範圍時從 1 到 12。
select MONTH(NOW());
YEAR(date)
返回date 對應的年份,範圍是從1000到9999。
select YEAR(NOW());
LAST_DAY(date)
獲取一個日期或日期時間值,返回該月最後一天對應的值
select LAST_DAY(NOW());
UNIX_TIMESTAMP(date):它會將引數值以'1970-01-01 00:00:00' GMT後的秒數的形式返回
FROM_UNIXTIME(unix_timestamp) , FROM_UNIXTIME(unix_timestamp,format):返回'YYYY-MM-DD HH:MM:SS'或指定format的日期

SELECT UNIX_TIMESTAMP(NOW()) FROM DUAL;

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())) FROM DUAL;

4.轉換

=======================================
            單行函式--->轉換函式
=======================================
FORMAT(X,D)
將數字X 的格式寫為'#,###,###.##',以四捨五入的方式保留小數點後D 位, 並將結果以字串的形式返
回。若D 為 0, 則返回結果不帶有小數點,或不含小數部分。
SELECT FORMAT(123456.789,2) FROM DUAL;

格式:DATE_FORMAT(date,format):把日期轉換為字串.

SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') FROM DUAL;

STR_TO_DATE(str,format):把字串轉換為日期。
SELECT STR_TO_DATE('2015/11/29','%Y/%m/%d') FROM DUAL;


單行函式可被嵌入到任何層在巢狀的時候,最內層的函式最先被執行,執行的結果被傳遞到它的外層函式,作為引數使用,然後依次從內向外執行,直到所有的函式執行完。


 

三、分頁查詢

    MySQL的分頁設計:
    假分頁(邏輯分頁,記憶體分頁):
        一次性查詢出所有的資料存放在記憶體中,每次翻頁的時候,都從記憶體中取出
        指定的條數
        特點:翻頁比較快,如果資料量過大,可能造成記憶體溢位,不推薦
    
    真分頁(物理分頁,資料庫分頁)(推薦):
        每次翻頁都從資料庫中擷取指定的條數
        假設每頁十條資料,第一頁0~9,第二頁重新查詢10~19條資料
        特點:翻頁比較慢,不會造成記憶體溢位

    設計:
        int pageSize=3:表示每頁最多顯示3條資料
        第一頁:SELECT * FROM tName LIMIT 0,3
        第二頁:                                                3,3
        第三頁:                                                   6,3    

        分頁查詢結果集的SQL

  1. SELECT * FROM tName LIMIT ?,?;

  2. 第一個?:(currentPage-1)*pageSize

  3. 第二個?:pageSize

--------------------- 本文來自 BigDodo 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/qq_38741971/article/details/80575955?utm_source=copy