Ø 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学习笔记二

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

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

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

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

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

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

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

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

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

随机推荐

  1. whu暑期集训#1

    题号:SGU123----SGU131 Problem A: 题意:求斐波那契的前N项和.. 做法:直接模拟,注意得用long long Problem B: 题意:给定一个封闭的多边形,求一个点在不 ...

  2. 深度学习主机环境配置: Ubuntu16.04+GeForce GTX 1080+TensorFlow

    接上文<深度学习主机环境配置: Ubuntu16.04+Nvidia GTX 1080+CUDA8.0>,我们继续来安装 TensorFlow,使其支持GeForce GTX 1080显卡 ...

  3. 第7章 "敏捷+"项目管理

    7.1  导入敏捷项目管理的步骤 1.导入敏捷的步骤 (1).培训 (2).教练与引导 (3).内化 2.敏捷混合型模式 7.2  项目启动与敏捷合同 1.敏捷项目启动 2.敏捷签约模式 在传统项目管 ...

  4. Win7下无法启动sql server fulltext search (mssqlserver)的问题

    在Win7下安装了SQL Server 2005, 但启动“SQL Server FullText Search (MSSQLSERVER)”服务时启动不成功,系统日志显示“SQL Server Fu ...

  5. 简单题(K-D Tree)

    简单题不简单-- 我们把单点加操作改成插入一个权值为增加量的点,将问题转化成询问一个矩阵中所有点的和,用 \(K-D\ Tree\) 维护,时间复杂度 \(O(n\sqrt{n})\) \(Code\ ...

  6. underscore.js源码研究(6)

    概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...

  7. cmd下【java监视和管理控制台】

    不需要安装插件,只要jmeter的运行环境配置好就可以了:打开这个小工具的步骤很简单,如果你已经配置好了Jmeter运行的环境,那么你也就不用去做其他的配置,直接 点击:开始——>运行——> ...

  8. Java - 初识Java

    Java是一种跨平台的面向对象的程序设计语言. 区分大小写: 标点符号为英文: 强类型语言,在Java中存储的数据,必须在编译时确定其类型: Java版本 Java按应用范围分为3个版本,即Java ...

  9. Info - Get technical information from the Internet

    Official Sites Overview / QuickStart Guide / Docs / E-books Community / Fourm / Blog Demo / Download ...

  10. 连接企业的人、事、物、知识--企业IM的第三类生存方式

    企业IM现状:尴尬 传统的企业IM在完成聊天.群组.文件传输.音频会话等传统IM功能后,发现自己陷入了尴尬的境地,因为功能的“同质化”,这些功能微信.QQ也有啊,其他IM厂商也有.于是IM厂商开始思考 ...