一、數據庫基本概述
數據庫(DataBase,DB):指長期保存在計算機的存儲設備上,按照一定規則組織起來,可以被各種用戶或應用共享的數據集合。(文件系統)
數據庫管理系統(DataBase Management System,DBMS):指一種操作和管理數據庫的大型軟件,用於建立、使用和維護數據庫,對數據庫進行統一管理和控制,以保證數據庫的安全性和完整性。用戶通過數據庫管理系統訪問數據庫中的數據。
數據庫軟件應該爲數據庫管理系統,數據庫是通過數據庫管理系統創建和操作的。
數據庫:存儲、維護和管理數據的集合。
二、sql概述
SQL:Structure Query Language。(結構化查詢語言)
SQL被美國國家標準局(ANSI)確定爲關係型數據庫語言的美國標準,後來被國際化標準組織(ISO)採納爲關係數據庫語言的國際標準。
各數據庫廠商都支持ISO的SQL標準。(普通話)
各數據庫廠商在標準的基礎上做了自己的擴展。(方言)
三、Sql的分類
4.1 DDL
Data Definition Language:數據定義語言,用來定義數據庫對象:庫、表、列等;
使用的關鍵字:CREATE、 ALTER、 DROP
4.1.1操作數據庫
創建名稱爲mydatabase的數據庫
create database mydatabase; //創建數據庫
查看當前數據庫服務器中所有的數據庫
show databases;
刪除mydatabase數據庫
drop database mydatabase;
查看當前使用的數據庫
select database();
切換數據庫
use mydatabase;
4.1.2操作數據表
* 創建表語法:
create table 表名(
字段1 字段類型 長度,
字段2 字段類型 長度,
...
字段n 字段類型 長度
);
* MySql常用數據類型:
int |
整型 |
double/float |
浮點型,例如double(5,2)表示最多5位,其中必須有2位小數 |
char |
固定長度字符串類型char(10) 'abc ' |
varchar |
可變長度字符串類型;varchar(10) 'abc' |
text |
大文本類型 |
blob |
字節類型,多用於存儲圖片 |
date |
日期類型,格式爲:yyyy-MM-dd |
time |
時間類型,格式爲:hh:mm:ss |
timestamp |
時間戳類型 yyyy-MM-dd hh:mm:ss 會自動賦值 |
datetime |
日期時間類型 yyyy-MM-dd hh:mm:ss |
修改表結構
ALTER TABLE table_name ADD column_name datatype
ALTER TABLE table_name DROP COLUMN column_name
ALTER TABLE table_name change COLUMN column_name datatype
查看錶的字段信息
desc emp;
爲emp表添加“age”字段(int類型,長度爲5):
alter table emp add age int(5) ;
刪除emp表中age字段:
alter table emp drop age;
修改emp表中name字段的名稱爲rname,類型改爲字符串,長度15;
alter table emp change name rname varchar(15);
修改emp表的名稱爲emp2:
rename table emp to emp2;
刪除表
drop table emp2 ;
4.2 DML
數據操縱語言;
DML是對表中的數據進行增、刪、改的操作。
INSERT 、UPDATE、 DELETE
小知識:
在mysql中,字符串類型和日期類型都要用單引號括起來。'tom' '2015-09-04'
空值:null
4.2.1 插入操作 INSERT:
語法: INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);
注意: 1.列名與列值的類型、個數、順序要一一對應。
2.值不要超出列定義的長度。
3.如果插入空值,使用null
4.插入的日期和字符一樣,都使用引號括起來。
Ø 逐條插入:
INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');
Ø 批量插入:
INSERT INTO emp VALUES
(2,'zs','m','2015-09-01',10000,'2015-09-01',NULL),
(3,'li','m','2015-09-01',10000,'2015-09-01',NULL),
4.2.2 修改操作 UPDATE:
Ø 語法:UPDATE 表名 SET 列名1=列值1,列名2=列值2 …… WHERE 列名=值
注:如果沒有where條件,那麼將會對所有行進行修改
練習:在修改上面創建的emp員工表
將所有員工薪水修改爲5000元。
UPDATE emp SET salary=5000
將姓名爲’tom’的員工薪水修改爲3000元。
UPDATE emp SET salary=3000 WHERE name=’ tom’;
將姓名爲 ’lili’ 的員工薪水修改爲4000元,job改爲’HR’。
UPDATE emp SET salary=4000,job=’HR’WHERE name='lili';
將tom的薪水在原有基礎上增加1000元。
UPDATE emp SET salary=salary+1000 WHERE name='tom';
4.2.3 刪除操作 DELETE:
語法 : delete from 表名 【WHERE 列名=值】
練習 :
刪除表中名稱爲’zs’的記錄。
delete from emp where name=‘zs’;
刪除表中所有記錄。
delete from emp;
注:不加where條件,會將表中所有數據刪除
4.3 DQL
DQL(Data Query Language):數據查詢語言,用來查詢表中記錄(數據)。使用SELECT命令;數據庫執行DQL語句不會對數據進行改變,而是讓數據庫發送結果集給客戶端。查詢返回的結果集是一張虛擬表。
語法: SELECT 列名1, 列名2…列名n from表名
【WHERE --> GROUP BY -->HAVING--> ORDER BY】
解析:
SELECT column1, column1…columnN /*要查詢的列名稱*/
FROM tablename /*要查詢的表名稱*/
WHERE condition /*行條件*/
GROUP BY grouping_columns /*對結果分組*/
HAVING condition /*分組後的行條件*/
ORDER BY sorting_columns /*對結果排序*/
LIMIT offset_start, row_count /*結果限定*/
1 基礎查詢
1.1 查詢所有列
SELECT * FROM stu;
1.2 查詢指定列
SELECT sid, sname, age FROM stu;
2 條件查詢
2.1運算符及關鍵字
條件查詢就是在查詢時給出WHERE子句,在WHERE子句中可以使用如下運算符及關鍵字:
Ø =、!=、<>、<、<=、>、>=;
Ø BETWEEN…AND;
Ø IN(….);
Ø IS NULL; IS NOT NULL
Ø AND;
Ø OR;
Ø NOT;
2.2 查詢性別爲女,並且年齡小於50的記錄
SELECT * FROM stu
WHERE gender='female' AND age<50;
2.3 查詢學號爲S_1001,或者姓名爲liSi的記錄
SELECT * FROM stu
WHERE sid ='S_1001' OR sname='liSi';
2.4 查詢學號爲S_1001,S_1002,S_1003的記錄
SELECT * FROM stu
WHERE sid IN ('S_1001','S_1002','S_1003');
2.5 查詢學號不是S_1001,S_1002,S_1003的記錄
SELECT * FROM tab_student
WHERE s_number NOT IN ('S_1001','S_1002','S_1003');
2.6 查詢年齡爲null的記錄
SELECT * FROM stu
WHERE age IS NULL;
2.7 查詢姓名不爲null的學生記錄
SELECT *
FROM stu
WHERE sname IS NOT NULL;
或者
SELECT *
FROM stu
WHERE NOT sname IS NULL;
2.8 查詢年齡在20到40之間的學生記錄
SELECT *
FROM stu
WHERE age>=20 AND age<=40;
或者
SELECT *
FROM stu
WHERE age BETWEEN 20 AND 40;
3 模糊查詢
當想查詢姓名中包含a字母的學生時,需要使用模糊查詢。
關鍵字:LIKE。
通配符:
l _: (下劃線)代表任意一個字符
l %: (百分號)代表任意0 ~ n個字符
3.1 查詢姓名由5個字母構成的學生記錄
SELECT *
FROM stu
WHERE sname LIKE '_ _ _ _ _';(5個下劃線)
模糊查詢必須使用LIKE關鍵字。其中 “_”匹配任意一個字母,5個“_”表示5個任意字母。
3.2 查詢姓名由5個字母構成,並且第5個字母爲“i”的學生記錄
SELECT *
FROM stu
WHERE sname LIKE '_ _ _ _ i';
3.3 查詢姓名以“z”開頭的學生記錄
SELECT *
FROM stu
WHERE sname LIKE 'z%';
其中“%”匹配0~n個任何字母。
3.4 查詢姓名中第2個字母爲“i”的學生記錄
SELECT *
FROM stu
WHERE sname LIKE '_i%';
3.5 查詢姓名中包含“a”字母的學生記錄
SELECT *
FROM stu WHERE sname LIKE '%a%';
4 字段控制查詢
4.1 去除重複記錄
如果需要找出表中的某一列有哪些不同的值,可以使用DISTINCT關鍵字(去重複值)
Select distinct 列名稱 from 表名稱
4.2 字段之間的運算
Ø 查看僱員的月薪與佣金之和
如果表中的兩列字段的類型都是數值類型,可以做算數運算。
SELECT *,sal+comm FROM emp;
如果相加的兩列中的其中一列值爲null,相加後得出的結果還是爲null,因爲任何數值與NULL相加結果還是NULL,所以結算結果可能會出現NULL需要使用ifnull()函數把NULL轉換成數值0:
SELECT *,sal+IFNULL(comm,0) FROM emp;
4.3 爲列名添加別名
在上面查詢結果中,出現列名爲sal+IFNULL(comm,0),這很不美觀,現在我們給這一列給出一個別名,爲total:
SELECT *, sal+IFNULL(comm,0) as total FROM emp;(as可以省略)
4.4 爲表添加別名
Select s.sid,s.sname,s.* from t_student s;
爲表添加別名,直接在表明後添加即可;這樣就可以通過別名的方式調用表中的字段。
5 排序
order by 列名 asc(默認- 升序) / desc(降序)
5.1 查詢所有學生記錄,按年齡升序排序
SELECT * FROM stu ORDER BY sage asc ; (asc可以省略)
5.2 查詢所有學生記錄,按年齡降序排序
SELECT * FROM stu ORDER BY age desc ;
5.3 查詢所有僱員,按月薪降序排序,月薪相同時,按編號升序
SELECT * FROM emp ORDER BY sal DESC , empno ASC;
6 聚合函數
sum()、 avg()、 max()、 min() 、count()
聚合函數是用來做縱向運算的函數:
l COUNT():統計指定列不爲NULL的記錄行數;
l MAX():計算指定列的最大值,如果指定列是字符串類型,那麼使用字符串排序運算;
l MIN():計算指定列的最小值,如果指定列是字符串類型,那麼使用字符串排序運算;
l SUM():計算指定列的數值和,如果指定列類型不是數值類型,那麼計算結果爲0;
l AVG():計算指定列的平均值,如果指定列類型不是數值類型,那麼計算結果爲0;
6.1COUNT
l 查詢emp表中記錄數:
SELECT COUNT(*) AS cnt FROM emp;
或
SELECT COUNT(1) AS cnt FROM emp;(效率更高,推薦使用)
l 查詢emp表中有佣金的人數:
SELECT COUNT(comm) cnt FROM emp;
注意,因爲count()函數中給出的是comm列,那麼只統計comm列非NULL的行數。
l 查詢emp表中月薪大於2500的人數:
SELECT OUNT(*) ROM emp WHERE sal > 2500;
l 統計月薪與佣金之和大於2500元的人數:
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;
6.2SUM和AVG
當需要縱向求和時使用sum()函數。
l 查詢所有僱員月薪和:
SELECT SUM(sal) FROM emp;
l 統計所有員工平均工資:
SELECT AVG(sal) FROM emp;
6.3MAX和MIN
l 查詢最高工資和最低工資:
SELECT MAX(sal), MIN(sal) FROM emp;
7 分組查詢
當需要分組查詢時需要使用GROUP BY子句;
例如查詢每個部門的工資和(部門,工資),這說明要使用部門來分組,對每個部門的工資求和;
select deptno,sum(sal) from emp group by deptno;
注:凡和聚合函數同時出現的列名,一定要寫在group by 之後作爲分組維度。
7.1 分組查詢
l 查詢每個部門的部門編號和每個部門的工資和:
SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;
l 查詢每個部門的部門編號以及每個部門的人數:
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
l 查詢每個部門的部門編號以及每個部門工資大於1500的人數:
SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;
7.2HAVING子句
l 查詢工資總和大於90000的部門編號以及工資和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 90000;
注:having與where的區別:
1. having是在分組後對數據進行過濾.
where是在分組前對數據進行過濾
2. having後面可以使用聚合函數(統計函數)
where後面不可以使用聚合函數。
8LIMIT 限定查詢
LIMIT用來限定查詢結果的起始行,以及要顯示的總行數。
8.1 起始行從第0行開始,查詢5行記錄
SELECT * FROM emp LIMIT 0, 5;
注意,起始行從0開始,即第一行開始!
8.2 查詢10行記錄,起始行從3開始
SELECT * FROM emp LIMIT 3, 10;
8.3分頁查詢
如果一頁記錄爲10條,希望查看第3頁記錄應該怎麼查呢?
l 第一頁記錄起始行爲0, 一共查詢10行;
l 第二頁記錄起始行爲10,一共查詢10行;
l 第三頁記錄起始行爲20,一共查詢10行;
4.4 DCL
DCL(Data Control Language):是數據庫控制功能;
用來設置或更改數據庫用戶或角色權限的語句,包括(grant,deny,revoke等)語句。在默認狀態下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人員纔有權力執行DCL
四、數據的完整性
保證用戶輸入的數據保存到數據庫中是正確的,確保數據的完整性就是在創建表時給表中添加約束。
完整性的分類:
> 實體完整性
> 域完整性
> 引用完整性
1、實體完整性
實體:即表中的一行(一條記錄)代表一個實體對象(entity)
實體完整性:指表中行的完整性。要求表中的所有行都有唯一的標識符,稱爲主關鍵字。
約束類型: 主鍵約束(primary key) 唯一約束(unique) 自動增長列(auto_increment)
1.1主鍵約束(primary key)
特點:數據唯一,且不能爲null
Ø 第一種添加方式:
Id int primary key not null,
Name varchar(50)
);
Ø 第二種添加方式
CREATE TABLE student(
id int,
Name varchar(50),
Primary key(id)
);
此種方式優勢在於,可以創建聯合主鍵(多個字段組合起來做爲一個表的主鍵)
CREATE TABLE student(
id int,
Name varchar(50),
Primary key(id,name)
);
Ø 第三種添加方式:
CREATE TABLE student(
Id int,
Name varchar(50)
);
ADD PRIMARY KEY (id);
1.2唯一約束(unique):
添加唯一約束
方式1:
CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);
方式2:
CREATE TABLE student(
Id int primary key,
Name varchar(50)
);
ALTER TABLE emp2
ADD UNIQUE (name);
使用場景:新浪微博校驗用戶名唯一
1.3自動增長(auto_increment)
給主鍵添加自動增長的數值,列只能是整數類型,但是如果刪除之前增長的序號,後面再添加的時候序號不會重新開始,而是會接着被刪除的那一列的序號
CREATE TABLE student(
Id int primary key auto_increment,
Name varchar(50)
);
INSERT INTO student(name) values(‘tom’);
2、域完整性
域完整性指列的值域的完整性,保證表中某些列不能輸入無效的值。
2.1 數據類型
包括:數值類型、日期類型、字符串類型…
例如:如果屬性類型是整數,那麼它就不能是101.5或任何非整數。
2.2 非空約束 not null
CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10)
);
INSERT INTO student values(1,’tom’,null);
2.3 默認值約束 default
CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10) default ‘男’
);
insert into student1 values(1,'tom','女');
insert into student1 values(2,'jerry',default);
2、引用完整性
3.1 表與表之間的關係
3.1.1一對一
例如t_person表和t_card表,即公民表和身份證表。這種情況需要找出主從關係,即誰是主表,誰是從表。人可以沒有身份證(黑戶),但每一張身份證必須要有對應的公民,所以人是主表,而身份證是從表。
設計從表可以有兩種方案:
1、在t_card表中添加“外鍵列”(指向t_person表主鍵)並且給外鍵添加唯一約束
2、給t_card表的主鍵添加外鍵約束(相對t_person表),即t_card表的主鍵也是外鍵
3.1.2一對多
例如班級與學生的關係(t_class和t_student)從t_class的角度來看是一對多,從t_student的角度來看就是多對一
處理方式:在多方表中創建外鍵字段(class_id),指向一方表的主鍵(cid)
3.1.3多對多
例如t_stu和t_teacher表,即一個學生可以有多個老師,而一個老師也可以有多個學生。這種情況通常需要創建中間表來處理多對多關係。例如再創建一張表t_stu_tea表,給出兩個外鍵,一個相對t_stu表的外鍵,另一個相對t_teacher表的外鍵。
3.2 引用完整性
引用完整性又稱參照完整性。引用完整性用來保證主表和從表之間的數據一致性,它通過主鍵(PRIMARY KEY)約束和外鍵(FOREIGN KEY)約束來實現。
五、多表查詢
多表查詢有如下幾種:
l 合併結果集(聯合查詢):UNION 、UNION ALL(縱向拼接)
l 連接查詢
Ø 內連接 [INNER] JOIN ON
Ø 外連接 OUTER JOIN ON
² 左外連接 LEFT [OUTER] JOIN
² 右外連接 RIGHT [OUTER] JOIN
² 全外連接(MySQL不支持)FULL JOIN
Ø 自然連接 NATURAL JOIN
l 子查詢
1 合併結果集
a) 合併結果集就是把兩個select語句的查詢結果合併到一起(縱向拼接)
b) 合併結果集有兩種方式:
l UNION:去除重複記錄,例如:SELECT * FROM t1 UNION SELECT * FROM t2
l UNION ALL:不去除重複記錄,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2
六、MySQL函數
一、數學函數ABS(x) 返回x的絕對值
CEILING(x) 返回大於x的最小整數值
EXP(x) 返回值e(自然對數的底)的x次方
FLOOR(x) 返回小於x的最大整數值
GREATEST(x1,x2,...,xn)返回集合中最大的值
LEAST(x1,x2,...,xn) 返回集合中最小的值
LN(x) 返回x的自然對數
LOG(x,y)返回x的以y爲底的對數
MOD(x,y) 返回x/y的模(餘數)
PI()返回pi的值(圓周率)
RAND()返回0到1內的隨機值,可以通過提供一個參數(種子)使RAND()隨機數生成器生成一個指定的值。
ROUND(x,y)返回參數x的四捨五入的有y位小數的值
SIGN(x) 返回代表數字x的符號的值
SQRT(x) 返回一個數的平方根
TRUNCATE(x,y) 返回數字x截短爲y位小數的結果
二、聚合函數(常用於GROUP BY從句的SELECT查詢中)
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的個數
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col) 返回由屬於一組的列值連接組合而成的結果
三、字符串函數
ASCII(char)返回字符的ASCII碼值
BIT_LENGTH(str)返回字符串的比特長度
CONCAT(s1,s2...,sn)將s1,s2...,sn連接成字符串
CONCAT_WS(sep,s1,s2...,sn)將s1,s2...,sn連接成字符串,並用sep字符間隔
INSERT(str,x,y,instr) 將字符串str從第x位置開始,y個字符長的子串替換爲字符串instr,返回結果
FIND_IN_SET(str,list)分析逗號分隔的list列表,如果發現str,返回str在list中的位置
LCASE(str)或LOWER(str) 返回將字符串str中所有字符改變爲小寫後的結果
LEFT(str,x)返回字符串str中最左邊的x個字符
LENGTH(s)返回字符串str中的字符數
LTRIM(str) 從字符串str中切掉開頭的空格
POSITION(substr,str) 返回子串substr在字符串str中第一次出現的位置
QUOTE(str) 用反斜槓轉義str中的單引號
REPEAT(str,srchstr,rplcstr)返回字符串str重複x次的結果
REVERSE(str) 返回顛倒字符串str的結果
RIGHT(str,x) 返回字符串str中最右邊的x個字符
RTRIM(str) 返回字符串str尾部的空格
STRCMP(s1,s2)比較字符串s1和s2
TRIM(str)去除字符串首部和尾部的所有空格
UCASE(str)或UPPER(str) 返回將字符串str中所有字符轉變爲大寫後的結果
四、日期和時間函數
CURDATE()或CURRENT_DATE() 返回當前的日期
CURTIME()或CURRENT_TIME() 返回當前的時間
DATE_ADD(date,INTERVAL int keyword)返回日期date加上間隔時間int的結果(int必須按照關鍵字進行格式化),如:SELECTDATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);
DATE_FORMAT(date,fmt) 依照指定的fmt格式格式化日期date值
DATE_SUB(date,INTERVAL int keyword)返回日期date加上間隔時間int的結果(int必須按照關鍵字進行格式化),如:SELECTDATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);
DAYOFWEEK(date) 返回date所代表的一星期中的第幾天(1~7)
DAYOFMONTH(date) 返回date是一個月的第幾天(1~31)
DAYOFYEAR(date) 返回date是一年的第幾天(1~366)
DAYNAME(date) 返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
FROM_UNIXTIME(ts,fmt) 根據指定的fmt格式,格式化UNIX時間戳ts
HOUR(time) 返回time的小時值(0~23)
MINUTE(time) 返回time的分鐘值(0~59)
MONTH(date) 返回date的月份值(1~12)
MONTHNAME(date) 返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
NOW() 返回當前的日期和時間
QUARTER(date) 返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
WEEK(date) 返回日期date爲一年中第幾周(0~53)
YEAR(date) 返回日期date的年份(1000~9999)
一些示例:
獲取當前系統時間:SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());
SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE);
SELECT EXTRACT(DAY_SECOND FROM CURRENT_DATE);
SELECT EXTRACT(HOUR_MINUTE FROM CURRENT_DATE);
返回兩個日期值之間的差值(月數):SELECT PERIOD_DIFF(200302,199802);
在Mysql中計算年齡:
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)),'%Y')+0 AS age FROM employee;
這樣,如果Brithday是未來的年月日的話,計算結果爲0。
下面的SQL語句計算員工的絕對年齡,即當Birthday是未來的日期時,將得到負值。
SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthday, '%Y') -(DATE_FORMAT(NOW(), '00-%m-%d') <DATE_FORMAT(birthday, '00-%m-%d')) AS age from employee
五、加密函數
AES_ENCRYPT(str,key) 返回用密鑰key對字符串str利用高級加密標準算法加密後的結果,調用AES_ENCRYPT的結果是一個二進制字符串,以BLOB類型存儲
AES_DECRYPT(str,key) 返回用密鑰key對字符串str利用高級加密標準算法解密後的結果
DECODE(str,key) 使用key作爲密鑰解密加密字符串str
ENCRYPT(str,salt) 使用UNIXcrypt()函數,用關鍵詞salt(一個可以惟一確定口令的字符串,就像鑰匙一樣)加密字符串str
ENCODE(str,key) 使用key作爲密鑰加密字符串str,調用ENCODE()的結果是一個二進制字符串,它以BLOB類型存儲
MD5() 計算字符串str的MD5校驗和
PASSWORD(str) 返回字符串str的加密版本,這個加密過程是不可逆轉的,和UNIX密碼加密過程使用不同的算法。
SHA() 計算字符串str的安全散列算法(SHA)校驗和
示例:
SELECT ENCRYPT('root','salt');
SELECT ENCODE('xufeng','key');
SELECT DECODE(ENCODE('xufeng','key'),'key');#加解密放在一起
SELECT AES_ENCRYPT('root','key');
SELECT AES_DECRYPT(AES_ENCRYPT('root','key'),'key');
SELECT MD5('123456');
SELECT SHA('123456');
六、控制流函數
MySQL有4個函數是用來進行條件操作的,這些函數可以實現SQL的條件邏輯,允許開發者將一些應用程序業務邏輯轉換到數據庫後臺。
MySQL控制流函數:
CASE WHEN[test1] THEN [result1]...ELSE [default] END如果testN是真,則返回resultN,否則返回default
CASE [test] WHEN[val1] THEN [result]...ELSE [default]END 如果test和valN相等,則返回resultN,否則返回default
IF(test,t,f) 如果test是真,返回t;否則返回f
IFNULL(arg1,arg2) 如果arg1不是空,返回arg1,否則返回arg2
NULLIF(arg1,arg2) 如果arg1=arg2返回NULL;否則返回arg1
這些函數的第一個是IFNULL(),它有兩個參數,並且對第一個參數進行判斷。如果第一個參數不是NULL,函數就會向調用者返回第一個參數;如果是NULL,將返回第二個參數。
如:SELECT IFNULL(1,2), IFNULL(NULL,10),IFNULL(4*NULL,'false');
NULLIF()函數將會檢驗提供的兩個參數是否相等,如果相等,則返回NULL,如果不相等,就返回第一個參數。
如:SELECT NULLIF(1,1),NULLIF('A','B'),NULLIF(2+3,4+1);
和許多腳本語言提供的IF()函數一樣,MySQL的IF()函數也可以建立一個簡單的條件測試,這個函數有三個參數,第一個是要被判斷的表達式,如果表達式爲真,IF()將會返回第二個參數,如果爲假,IF()將會返回第三個參數。
如:SELECTIF(1<10,2,3),IF(56>100,'true','false');
IF()函數在只有兩種可能結果時才適合使用。然而,在現實世界中,我們可能發現在條件測試中會需要多個分支。在這種情況下,MySQL提供了CASE函數,它和PHP及Perl語言的switch-case條件例程一樣。
CASE函數的格式有些複雜,通常如下所示:
CASE [expression to be evaluated]
WHEN [val 1] THEN [result 1]
WHEN [val 2] THEN [result 2]
WHEN [val 3] THEN [result 3]
......
WHEN [val n] THEN [result n]
ELSE [default result]
END
這裏,第一個參數是要被判斷的值或表達式,接下來的是一系列的WHEN-THEN塊,每一塊的第一個參數指定要比較的值,如果爲真,就返回結果。所有的WHEN-THEN塊將以ELSE塊結束,當END結束了所有外部的CASE塊時,如果前面的每一個塊都不匹配就會返回ELSE塊指定的默認結果。如果沒有指定ELSE塊,而且所有的WHEN-THEN比較都不是真,MySQL將會返回NULL。
CASE函數還有另外一種句法,有時使用起來非常方便,如下:
CASE
WHEN [conditional test 1] THEN [result 1]
WHEN [conditional test 2] THEN [result 2]
ELSE [default result]
END
這種條件下,返回的結果取決於相應的條件測試是否爲真。
示例:
mysql>SELECT CASE 'green'
WHEN 'red' THEN 'stop'
WHEN 'green' THEN 'go' END;
SELECT CASE 9 WHEN 1 THEN 'a' WHEN 2 THEN 'b' ELSE 'N/A' END;
SELECT CASE WHEN (2+2)=4 THEN 'OK' WHEN(2+2)<>4 THEN 'not OK' END ASSTATUS;
SELECT Name,IF((IsActive = 1),'已激活','未激活') AS RESULT FROMUserLoginInfo;
SELECT fname,lname,(math+sci+lit) AS total,
CASE WHEN (math+sci+lit) < 50 THEN 'D'
WHEN (math+sci+lit) BETWEEN 50 AND 150 THEN 'C'
WHEN (math+sci+lit) BETWEEN 151 AND 250 THEN 'B'
ELSE 'A' END
AS grade FROM marks;
SELECT IF(ENCRYPT('sue','ts')=upass,'allow','deny') AS LoginResultFROM users WHERE uname = 'sue';#一個登陸驗證
七、格式化函數
DATE_FORMAT(date,fmt) 依照字符串fmt格式化日期date值
FORMAT(x,y) 把x格式化爲以逗號隔開的數字序列,y是結果的小數位數
INET_ATON(ip) 返回IP地址的數字表示
INET_NTOA(num) 返回數字所代表的IP地址
TIME_FORMAT(time,fmt) 依照字符串fmt格式化時間time值
其中最簡單的是FORMAT()函數,它可以把大的數值格式化爲以逗號間隔的易讀的序列。
示例:
SELECT FORMAT(34234.34323432,3);
SELECT DATE_FORMAT(NOW(),'%W,%D %M %Y %r');
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');
SELECT DATE_FORMAT(19990330,'%Y-%m-%d');
SELECT DATE_FORMAT(NOW(),'%h:%i %p');
SELECT INET_ATON('10.122.89.47');
SELECT INET_NTOA(175790383);
八、類型轉化函數
爲了進行數據類型轉化,MySQL提供了CAST()函數,它可以把一個值轉化爲指定的數據類型。類型有:BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNED
示例:
SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0;
SELECT 'f'=BINARY 'F','f'=CAST('F' AS BINARY);
九、系統信息函數
DATABASE() 返回當前數據庫名
BENCHMARK(count,expr) 將表達式expr重複運行count次
CONNECTION_ID() 返回當前客戶的連接ID
FOUND_ROWS() 返回最後一個SELECT查詢進行檢索的總行數
USER()或SYSTEM_USER() 返回當前登陸用戶名
VERSION() 返回MySQL服務器的版本
示例:
SELECT DATABASE(),VERSION(),USER();
SELECTBENCHMARK(9999999,LOG(RAND()*PI()));#該例中,MySQL計算LOG(RAND()*PI())表達式9999999次。