1. 程式人生 > >MySQL 的函式詳解!

MySQL 的函式詳解!

  1. 完整性約束
  1. 什麼是資料完整性

資料的準確性和可靠性。

  1. 分類
  1. 實體完整性

記錄準確的。(記錄不能重複)

  1. 主鍵約束: 不能重複,不能為空。  Primary key

欄位唯一的。

不能使用業務欄位。

無意義的不重複的資料。

#1.

create table stu(

  sid int primary key,

         sname varchar(20),

         age int

);

 

#2.

create table stu(

  sid int,

  sname varchar(20),

  age int,

         primary key(sid)

);

#3.                       約束  主鍵約束的名稱

alter table student add CONSTRAINT PK_SID primary key(sid);

 

# 刪除主鍵約束

alter table sc drop primary key;

主鍵約束只能有一個。

但是允許有聯合主鍵(多個欄位整體作為主鍵)

  1. 唯一約束:欄位值不重複 unique

#唯一約束

alter table student add CONSTRAINT UN_CARD unique(card);

  1. 主鍵自增(1開始 增長1 )  auto_increment

#主鍵自增

create table stu(

 sid int primary key auto_increment,

 sname varchar(20)

);

alter table student modify sid int auto_increment;

 

  1. 域完整性

域:欄位的值準確。

  1. 型別約束
  2. 非空約束 not null
  3. 預設值 default

create table student(

 sid int primary key auto_increment,

 sname varchar(20) not null,

 age int,

 sex varchar(10) default '男'

)

 

  1. 引用完整性:  外來鍵約束

外來鍵欄位所在表取值只能參考另一張表的主鍵的取值。

#外來鍵約束

alter table student add CONSTRAINT FK_CLID foreign key(clid)

references classroom(cid);

 

  1. 自定義完整性 check(oracle支援)

Alter table student add constraint CK_AGE check(age between 1 and 150);

  1. 運算子
  1. 算術運算子     + - * / %
  2. 比較運算子
  3. 邏輯運算子
  4. 位運算子

#運算子

 #1.算術運算子

  select 1+1;

         select 1-1;

         select 2*3;

         select 3/2;   #1.5

  select 3/0;   #null

  select 3 div 2;       #取整

         select 3%2;

 #2.比較運算子  > < >= <= !=/<>    true 1 / false 0

  select 1>2;

         select 1<2;

         select 1=2;

         select 1!=2;

         select 1<>2;

 #3.邏輯運算子

   select 1>2 and 2<3;

          select 1>2 or 2<3;

          select !(1<>2);

 #4.位運算(二進位制)

   select 2&3; #按位與  2

          select 2|3; #按位或 3

   select 2^3; #按位異或 1

 

  1. DML
  1. 新增(插入)  insert

#insert 

 # 3  ls  1

 insert into student values(3,'ls',1);

 # 插入部分欄位

 insert into student(clid,sname) values(1,'ww');

 # 插入三條資料(批量插入)

 insert into student(sname,clid) values('zl',1),('fq',1),('cb',1);

 #複製表中的值

 insert into stu select * from student;

 #向date型別資料插入資料(oracle不允許)

 insert into stu(sname,clid,birthday) values('zs',1,'1998-09-09');

  1. 修改 update

#update   update tname set 欄位=新值 [where 條件]

 update stu set sname='bq' where sid = 2;

  1. 刪除

delete from tname [where 條件]

 delete from stu where sid = 10;

 

# 逐行刪除

 delete from stu;

 # 清空表

 truncate table stu;

 

delete逐行刪除,truncate清空內部資料檔案。

Truncate效率高於delete。

Truncate自增重置,delete不會重置自增。

  1. 查詢

查詢的語法結構

Select 子句

From tname(結果集)

[where 條件

 Group by 分組

 Having 條件

 Order by 排序

 Limit 限制結果

]

#查詢

 # 查詢emp表中所有的資料。

    select * from emp;

 # 查詢emp表中所有的員工姓名和職位資訊。

    select ename,job from emp;

 # 查詢emp表中工資超過2000的員工資訊。(單一條件)

    select * from emp where sal >= 2000;

 # 查詢emp表中工資大於2000並且不在20號部門的員工資訊。(組合條件)

    select * from emp where sal > 2000 and deptno <> 20;

 # 查詢emp表中工資大於2000和20號部門的員工資訊。

    select * from emp where sal > 2000 or deptno = 20;

 # 查詢emp表中工資在1000到2000之間的員工資訊。(範圍查詢)

           select * from emp where sal BETWEEN 1000 and 2000;

 # 查詢emp表中職位是CLERK,MANAGER,SALESMAN的員工資訊。(集合查詢)

  select * from emp where job in ('CLERK','MANAGER','SALESMAN');

 # 查詢emp表中所有的職位資訊。(去重)

   select distinct job from emp;

 # 起別名(欄位 表 結果集)   [as] 別名

   select 1+1 sum;

          select ename '姓名' from emp;

          select e.empno,e.ename from emp e;

 # 排序      order by 排序欄位 [ASC|DESC]

   select * from emp order by sal desc;

          # 工資降序排序,工資一樣的按照empno的降序排序。

          select * from emp order by sal desc,empno desc;

 # 查詢沒有獎金的員工資訊。 is null / is not null

    select * from emp where comm is not null;

 # 查詢emp表中姓名S打頭的員工資訊。(模糊查詢)  like   %:0到多位字元  _:代表一位

   select * from emp where ename like 's%';

          select * from emp where ename like '%t';

          select * from emp where ename like '%s%'; #包含

   # 第二個字母是L的員工

          select * from emp where ename like '_l%'

 # 限制結果查詢  limit index,length

   select * from emp limit 1,5;

 

        

  1. 函式
  1. 單行函式
  1. 數學函式
  2. 字元函式
  3. 日期函式

#數學函式

 select abs(-10);  #絕對值

 select ceil(-12.8); #向上取整(大最接近的整數)

 select floor(-12.3); #向下取整

 select rand();  #[0,1)隨機數

 select POW(2,3); #求冪運算

 select SQRT(9); #開方

 select ROUND(14.35,-1); #四捨五入

 select MOD(5,2);  #取餘

#字元函式

 select LENGTH('this');

 select length(ename) from emp;

 select UPPER('this');

 select LOWER(ename) from emp;

 select CONCAT('this ','is');  #連線

 select SUBSTR('abcdef',1,3);  #字串擷取從1開始

 select LPAD('aa',10,'*');  #左填充

 select RPAD('aa',10,'*'); #右填充

 select trim('    aa   a     ');  #去空格

#日期函式

 #獲取日期時間

 select now();

 select sysdate();

 #獲取日期

 select CURDATE();

 select CURTIME();

 select YEAR(now());

 select MONTH('1998-09-09');

 #select DAY(date);

 #日期計算

 select DATE_ADD(NOW(),interval 1 MONTH);

 select LAST_DAY(now()); #獲取某個月最後一天

 

  1. 聚合函式

Max()

Min()

Avg()

Sum()

Count()

#聚合函式

select max(sal) from emp;

select min(sal) from emp;

select avg(sal) from emp;

select sum(sal) from emp;

select count(*) from emp;   #統計記錄數

select count(1) from emp;   #統計記錄數

select count(comm) from emp; #統計該欄位不為空的數目

 

  1. 分組函式

#分組函式   group by 分組欄位   /   having 對分組的結果再次進行檢索,可以出現聚合函式

 

 # 檢視每個部門的平均工資

 select deptno,avg(sal) from emp group by deptno;

 # 查詢平均工資>2000的部門的編號和平均工資。

  select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;

 

  1. 加密函式

#加密函式

select MD5('root');

select SHA('root');

select PASSWORD('root');