Ø function 函数

函数的作用比较大,一般多用在select查询语句和where条件语句之后。按照函数返回的结果,

可以分为:多行函数和单行函数;所谓的单行函数就是将每条数据进行独立的计算,然后每条数据得到一条结果。

如:字符串函数;而多行函数,就是多条记录同时计算,得到最终只有一条结果记录。如:sum、avg等

多行函数也称为聚集函数、分组函数,主要用于完成一些统计功能。MySQL的单行函数有如下特征:

单行函数的参数可以是变量、常量或数据列。单行函数可以接受多个参数,但返回一个值。

单行函数就是它会对每一行单独起作用,每一行(可能包含多个参数)返回一个结果。

单行函数可以改变参数的数据类型。单行函数支持嵌套使用:内层函数的返回值是外层函数的参数。

单行函数可以分为:

类型转换函数;

位函数;

流程控制语句;

加密解密函数;

信息函数

单行函数

1、    char_length字符长度

select char_length(tel) from user;

2、    sin函数

select sin(age) from user;

select sin(1.57);

3、    添加日期函数

select date_add('2010-06-21', interval 2 month);

interval是一个关键字,2 month是2个月的意思,2是数值,month是单位

select addDate('2011-05-28', 2);

在前面的日期上加上后面的天数

4、    获取当前系统时间、日期

select curdate();

select curtime();

5、    加密函数

select md5('zhangsan');

6、    Null 处理函数

select ifnull(birthday, 'is null birthday') from user;

如果birthday为null,就返回后面的字符串

select nullif(age, 245) from user;

如果age等于245就返回null,不等就返回age

select isnull(birthday) from user;

判断birthday是否为null

select if(isnull(birthday), 'birthday is null', 'birthday not is null') from user;

如果birthday为null或是0就返回birthday is null,否则就返回birthday not is null;类似于三目运算符

7、    case 流程函数

case函数是一个流程控制函数,可以接受多个参数,但最终只会返回一个结果。

select name,

age,

(case sex

when 1 then '男'

when 0 then '女'

else '火星人'

end

) sex

from user;

组函数

组函数就是多行函数,组函数是完成一行或多行结果集的运算,最后返回一个结果,而不是每条记录返回一个结果。

1、    avg平均值运算

select avg(age) from user;

select avg(distinct age) from user;

2、    count 记录条数统计

select count(*), count(age), count(distinct age) from user;

3、    max 最大值

select max(age), max(distinct age) from user;

4、    min 最小值

select min(age), min(distinct age) from user;

5、    sum 求和、聚和

select sum(age), sum(distinct age) from user;

select sum(ifnull(age, 0)) from user;

6、    group by 分组

select count(*), sex from user group by sex;

select count(*) from user group by age;

select * from user group by sex, age;

7、    having进行条件过滤

不能在where子句中过滤组,where子句仅用于过滤行。过滤group by需要having

不能在where子句中用组函数,having中才能用组函数

select count(*) from user group by sex having sex <> 2;

Ø 多表查询和子查询

数据库的查询功能最为丰富,很多时候需要用到查询完成一些事物,而且不是单纯的对一个表进行操作。而是对多个表进行联合查询,

MySQL中多表连接查询有两种规范,较早的SQL92规范支持,如下几种表连接查询:

等值连接

非等值连接

外连接

广义笛卡尔积

SQL99规则提供了可读性更好的多表连接语法,并提供了更多类型的连接查询,SQL99支持如下几种多表连接查询:

交叉连接

自然连接

使用using子句的连接

使用on子句连接

全部连接或者左右外连接

SQL92的连接查询

SQL92的连接查询语法比较简单,多将多个table放置在from关键字之后,多个table用“,”隔开;

连接的条件放在where条件之后,与查询条件直接用and逻辑运算符进行连接。如果条件中使用的是相等,

则称为等值连接,相反则称为非等值,如果没有任何条件则称为广义笛卡尔积。

广义笛卡尔积:select s.*, c.* from student s, classes c;

等值:select s.*, c.* from student s, classes c where s.cid = c.id;

非等值:select s.*, c.* from student s, classes c where s.cid <> c.id;

select s.*, c.name classes from classes c, student s where c.id = s.classes_id and s.name is not null;

SQL99连接查询

1、交叉连接cross join,类似于SQL92的笛卡尔积查询,无需条件。如:

select s.*, c.name from student s cross join classes c;

2、自然连接 natural join查询,无需条件,默认条件是将2个table中的相同字段作为连接条件,如果没有相同字段,查询的结果就是空。

select s.*, c.name from student s natural join classes c;

3、using子句连接查询:using的子句可以是一列或多列,显示的指定两个表中同名列作为连接条件。

如果用natural join的连接查询,会把所有的相同字段作为连接查询。而using可以指定相同列及个数。

select s.*, c.name from student s join classes c using(id);

4、    join … on连接查询,查询条件在on中完成,每个on语句只能指定一个条件。

select s.*, c.name from student s join classes c on s.classes_id = c.id;

5、    左右外连接:3种外连接,left [outer] join、right [outer] join,连接条件都是通过用on子句来指定,条件可以等值、非等值。

select s.*, c.name from student s left join classes c on s.classes_id = c.id;

select s.*, c.name from student s right join classes c on s.classes_id = c.id;

子查询

子查询就是指在查询语句中嵌套另一个查询,子查询可以支持多层嵌套。子查询可以出现在2个位置:

from关键字之后,被当做一个表来进行查询,这种用法被称为行内视图,因为该子查询的实质就是一个临时视图

出现在where条件之后作为过滤条件的值

子查询注意点:

子查询用括号括起来,特别情况下需要起一个临时名称

子查询当做临时表时(在from之后的子查询),可以为该子查询起别名,尤其是要作为前缀来限定数据列名时

子查询用作过滤条件时,将子查询放在比较运算符的右边,提供可读性

子查询作为过滤条件时,单行子查询使用单行运算符,多行子查询用多行运算符

将from后面的子查询当做一个table来用:

select * from (select id, name from classes) s where s.id in (1, 2);

当做条件来用:

select * from student s where s.classes_id in (select id from classes);

select * from student s where s.classes_id = any (select id from classes);

select * from student s where s.classes_id > any (select id from classes);

Ø 操作符和函数

1、    boolean只判断

select 1 is true, 0 is false, null is unknown;

select 1 is not unknown, 0 is not unknown, null is not unknown;

2、    coalesce函数,返回第一个非null的值

select coalesce(null, 1);

select coalesce(1, 1);

select coalesce(null, 1);

select coalesce(null, null);

3、    当有2个或多个参数时,返回最大的那个参数值

select greatest(2, 3);

select greatest(2, 3, 1, 9, 55, 23);

select greatest('D', 'A', 'B');

4、    Least函数,返回最小值,如果有null就返回null值

select least(2, 0);

select least(2, 0, null);

select least(2, 10, 22.2, 35.1, 1.1);

5、    控制流函数

select case 1 when 1 then 'is 1' when 2 then 'is 2' else 'none' end;

select case when 1 > 2 then 'yes' else 'no' end;

6、    ascii字符串函数

select ascii('A');

select ascii('1');

7、    二进制函数

select bin(22);

8、    返回二进制字符串长度

select bit_length(11);

9、    char将值转换成字符,小数取整四舍五入

select char(65);

select char(65.4);

select char(65.5);

select char(65.6);

select char(65, 66, 67.4, 68.5, 69.6, '55.5', '97.3');

10、    using改变字符集

select charset(char(0*65)), charset(char(0*65 using utf8));

11、    得到字符长度char_length,character_length

select char_length('abc');

select character_length('eft');

12、    compress压缩字符串、uncompress解压缩

select compress('abcedf');

select uncompress(compress('abcedf'));

13、    concat_ws分隔字符串

select concat_ws('#', 'first', 'second', 'last');

select concat_ws('#', 'first', 'second', null, 'last');

Ø 事务处理

动作

开始事务:start transaction

提交事务:commit

回滚事务:rollback

设置自动提交:set autocommit 1 | 0

atuoCommit系统默认是1立即提交模式;如果要手动控制事务,需要设置set autoCommit 0;

这样我们就可以用commit、rollback来控制事务了。

在一段语句块中禁用autocommit 而不是set autocommit

start transaction;

select @result := avg(age) from temp;

update temp set age = @result where id = 2;

select * from temp where id = 2;//值被改变

rollback;//回滚

select * from temp where id = 2;//变回来了

在此期间只有遇到commit、rollback,start Transaction的禁用autocommit才会结束。然后就恢复到原来的autocommit模式;

不能回滚的语句

有些语句不能被回滚。通常,这些语句包括数据定义语言(DDL)语句,比如创建或取消数据库的语句,

和创建、取消或更改表或存储的子程序的语句。

您在设计事务时,不应包含这类语句。如果您在事务的前部中发布了一个不能被回滚的语句,

则后部的其它语句会发生错误,在这些情况下,通过发布ROLLBACK语句不能 回滚事务的全部效果。

一些操作也会隐式的提交事务

如alter、create、drop、rename table、lock table、set autocommit、start transaction、truncate table 等等,

在事务中出现这些语句也会提交事务的

事务不能嵌套事务

事务的保存点

Savepoint pointName/Rollback to savepoint pointName

一个事务可以设置多个保存点,rollback可以回滚到指定的保存点,恢复保存点后面的操作。

如果有后面的保存点和前面的同名,则删除前面的保存点。

Release savepoint会删除一个保存点,如果在一段事务中执行commit或rollback,则事务结束,所以保存点删除。

Set Transaction设计数据库隔离级别

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL

{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

本语句用于设置事务隔离等级,用于下一个事务,或者用于当前会话。

在默认情况下,SET TRANSACTION会为下一个事务(还未开始)设置隔离等级。

如果您使用GLOBAL关键词,则语句会设置全局性的默认事务等级,

用于从该点以后创建的所有新连接。原有的连接不受影响。使用SESSION关键测可以设置默认事务等级,

用于对当前连接执行的所有将来事务。

默认的等级是REPEATABLE READ全局隔离等级。

Ø 注释

select 1+1;     # 单行注释

select 1+1;     -- 单行注释

select 1 /* 多行注释 */ + 1;

Ø 基本数据类型操作

字符串

select 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';

select "hello", "'hello'", "''hello''", "hel""lo", "\"hello";

\n换行

select 'This\nIs\nFour\nLines';

\转义

select 'hello \ world!';

select 'hello \world!';

select 'hello \\ world!';

select 'hello \' world!';

Ø 设置数据库mode模式

SET sql_mode='ANSI_QUOTES';

create table t(a int);

create table "tt"(a int);

create table "t""t"(a int);

craate talbe tab("a""b" int);

Ø 用户变量

set @num1 = 0, @num2 = 2, @result = 0;

select @result := (@num1 := 5) + @num2 := 3, @num1, @num2, @result;

Ø 存储过程

创建存储过程:

delimiter //

create procedure get(out result int)

begin

select max(age) into result from temp;

end//

调用存储过程:

call get(@temp);

查询结果:

select @temp;

删除存储过程:

drop procedure get;

查看存储过程创建语句:

show create procedure get;

select…into 可以完成单行记录的赋值:

create procedure getRecord(sid int)

begin

declare v_name varchar(20) default 'jason';

declare v_age int;

declare v_sex bit;

select name, age, sex into v_name, v_age, v_sex from temp where id = sid;

select v_name, v_age, v_sex;

end;

call getRecord(1);

Ø 函数

函数类似于存储过程,只是调用方式不同

例如:select max(age) from temp;

创建函数:

create function addAge(age int) returns int

return age + 5;

使用函数:

select addAge(age) from temp;

删除函数:

drop function if exists addAge;

drop function addAge;

显示创建语法:

show create function addAge;

Ø 游标

声明游标:declare cur_Name cursor for select name from temp;

打开游标:open cur_Name;

Fetch游标:fetch cur_Name into @temp;

关闭游标:close cur_Name;

示例:

CREATE PROCEDURE cur_show()

BEGIN

DECLARE done INT DEFAULT 0;

DECLARE v_id, v_age INT;

DECLARE v_name varchar(20);

DECLARE cur_temp CURSOR FOR SELECT id, name, age FROM temp;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cur_temp;

REPEAT

FETCH cur_temp INTO v_id, v_name, v_age;

IF NOT done THEN

IF isnull(v_name) THEN

update temp set name = concat('test-json', v_id) where id = v_id;

ELSEIF isnull(v_age) THEN

update temp set age = 22 where id = v_id;

END IF;

END IF;

UNTIL done END REPEAT;

CLOSE cur_temp;

END

Ø 触发器

触发器分为insert、update、delete三种触发器事件类型

还有after、before触发时间

创建触发器:

create trigger trg_temp_ins

before insert

on temp for each row

begin

insert into temp_log values(NEW.id, NEW.name);

end//

删除触发器:

drop trigger trg_temp_ins

MySQL学习笔记二的更多相关文章

  1. MySQL学习笔记(二):MySQL数据类型汇总及选择参考

    本文主要介绍了MySQL 的常用数据类型,以及实际应用时如何选择合适的类型.  ******几个通用的简单原则:******* 1. 更小的通常更好.但是要确保没有低估需要存储的值的范围,如果无法确定 ...

  2. MySQL学习笔记(二)

    连接与断开服务器 应该以下面的方式连接MySQL服务器,而不是将密码以明文方式输入连接. C:\> mysql -h host -u user -pEnter password: ******* ...

  3. MySQL学习笔记二:权限管理

    1. 创建和删除用户,mysql中的用户是由用户名和主机名来确定的 create user "user_name@host_name" identified by passwd; ...

  4. sql分类及基本sql操作,校对规则(mysql学习笔记二)

    sql针对操作对象分为不同语言 数据操作(管理)语言 DML或者将其细分为 ( 查询  DQL 管理(增,删,改)  DML) 数据定义语言(对保存数据的格式进行定义) DDL 数据库控制语言(针对数 ...

  5. MySQL学习笔记(二)—查询

    一.多表连接查询 新建两张表t_user.t_order.              1.内连接      返回满足条件的所有记录. (1)显式内连接      使用inner join关键字,在on ...

  6. mysql学习笔记二 —— 权限体系

    要点: 1.MySQL的API2.MySQL的相关文件3.MySQL的权限体系 1.MySQL的API 应用程序接口 (application program interface) 1.1 命令行中的 ...

  7. MySQL 学习笔记 二

    Ø function 函数 函数的作用比较大,一般多用在select查询语句和where条件语句之后.按照函数返回的结果, 可以分为:多行函数和单行函数:所谓的单行函数就是将每条数据进行独立的计算,然 ...

  8. MySql学习笔记(二) —— 正则表达式的使用

    前面介绍利用一些关键字搭配相应的SQL语句进行数据库查找过滤,但随着过滤条件的复杂性的增加,where 子句本身的复杂性也会增加.这时我们就可以利用正则表达式来进行匹配查找. 1.基本字符匹配 ' o ...

  9. Mysql学习笔记(二)数据类型 补充

    原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...

随机推荐

  1. UML中的六大关系

    转自:http://www.cnblogs.com/shengtianlong/archive/2010/10/23/1858953.html UML定义的关系主要有六种:依赖.类属.关联.实现.聚合 ...

  2. Javascript 面向对象编程

    Javascript是一个类C的语言,他的面向对象的东西相对于C++/Java比较奇怪,但是其的确相当的强大,在 Todd 同学的“对象的消息模型”一文中我们已经可以看到一些端倪了.这两天有个前同事总 ...

  3. ADT通过svn进行团队开发,svn插件不好使的解决方案

    在使用ADT的svn插件的时候老是会出现各种异常,所以就干脆不用svn插件了,直接将adt的工作空间建在svn上面,以保证团队成员共用一套代码,节约宝贵的整合时间. 使用步骤: 1.首先需要安装好sv ...

  4. smarty中的母板极制_extends和block标签

    模板继承 继承是从面向对象编程而来的概念,模板继承可以让你定义一个或多个父模板,提供给子模板来进行扩展. 扩展继承意味着子模板可以覆盖部分或全部父模板的块区域. 继承结构可以是多层次的,所以你可以继承 ...

  5. Codeforces Round #285 (Div. 1) A. Misha and Forest 拓扑排序

    题目链接: 题目 A. Misha and Forest time limit per test 1 second memory limit per test 256 megabytes 问题描述 L ...

  6. Wmware桥接网络虚拟机无法上网的问题

    之前装好的一个虚拟机,安装到本地的Wmware workstation的时候,发现无法上网. 虚拟机使用的是桥接模式:一开始怀疑IP被占用,修改后发现不起作用.    排查所有的网络配置,发现都没有问 ...

  7. 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  8. HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?

    // test02.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  9. dragsort拖动插件的使用

    <!DOCTYPE html><html><head> <title>DragSort Example</title> <meta c ...

  10. c++ 虚继承

    虚继承(个人感觉用到的地方不多,项目中没有用到这个的) 最典型的例子就是iostream的继承方式 class istream : virtual public ios{...};//此处就是虚继承, ...