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]
列的別名排序(別名使用單引號之後不能排序)
-
SELECT colName AS cn FROM tName ORDER BY cn [DESC\ASC]
-
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
-
SELECT AVG(colName1) FROM tName
-
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
-
SELECT * FROM tName LIMIT ?,?;
-
第一個?:(currentPage-1)*pageSize
-
第二個?:pageSize
--------------------- 本文來自 BigDodo 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/qq_38741971/article/details/80575955?utm_source=copy