zoukankan      html  css  js  c++  java
  • Mysql(二)函数与连接

    一、函数

         1、if函数

          if(exp1, exp2, exp3)     判断exp1是否为true(不为0,并且不为nlll),如果为true,返回 exp2的值,否则返回exp3的值。

    select if(5 > 3, 100, 200);
    select if(5 < 3, 100, 200);
    select if(true, 100, 200);

    MySQL中,true与1是同义词,false与0是同义词。

    select 1 = true, 0 = false;

    ifnull(exp1, exp2)  如果exp1不为null,返回exp1的值,否则,返回exp2的值。

    select ifnull(100, 200);
    select ifnull(null, 200);

    select ifnull(name, '无名氏') from student

    #nullif(exp1, exp2)
    #如果exp1=exp2,则返回null,否则返回exp1的值。

    select nullif(5, 5);
    select nullif(5, 6);

        2、case函数

    #case的第一种形式,类似于Java中的switch-case
    select age 年龄,
    case age
    when 10 then '小孩,10岁'
    when 20 then '弱冠之年'
    when 30 then '而立之年'
    else '其他年龄'
    end 年龄说明
    from student;

    #case的第二种形式,类似于Java中的if-else if
    select
    case
    when age <= 10 then '小孩,10岁'
    when age <= 20 then '弱冠之年'
    when age <= 30 then '而立之年'
    else '其他年龄'
    end 年龄说明
    from student;

    #可以使用第二种case代替第一种case。
    select
    case
    when age = 10 then '小孩,10岁'
    when age = 20 then '弱冠之年'
    when age = 30 then '而立之年'
    else '其他年龄'
    end 年龄说明
    from student;

         3、#abs 返回绝对值

    select abs(-2);

         4、ceil / ceiling 返回大于等于参数的最小整数。(向上取整)

    select ceil(3.2), ceiling(3.2)

         5、floor 返回小于等于参数的最大整数。(向下取整)

    select floor(3.5);

        6、mod 取余数

    select mod(5, 2);

        7、pow / power 求指数

    select pow(2, 5), power(2, 5);

    rand 返回0-1随机小数,包括0,包括1。
    select rand();

    round 返回最接近的整数值。(四舍五入)
    select round(5.5), round(5.2)

    #round函数也可以指定一个参数,参数用来指定保留几位小数。
    select round(2.222, 1), round(2.888, 2);

    一个参数的round可以使用两个参数的round函数来表示(第   二个参数为0)。

    select round(2.5), round(2.5, 0);
    #round的第二个参数还可以是负值。
    select round(1234.5678, -1), round(1256.789, -2);

    sqrt 求平方根(开方)
    select sqrt(3);

    length 返回字符串的长度,以字节为单位
    select length('abcdefg');

    在utf8编码下,一个中文要占用3个字节。
    select length('ab中文');

    char_length 返回字符串的长度,以字符为单位。
    select char_length('abcd');

    select char_length('ab中文');

    #concat 进行字符串的连接,返回连接之后的结果。
    #concat函数是可变参数。
    select concat('ab', 'cd');
    select concat('ab', 'cd', 'e', 'fg');
    #concat_ws 使用分隔符连连接字符串。第一个参数指定分隔符。
    #concat_ws函数是可变参数。
    select concat_ws('-', 'a', 'bc', 'def');
    select concat_ws('多个字符', 'a', 'bc', 'def');
    #insert(str, pos, len, newStr)
    #str待插入的字符串 pos开始的位置, len长度 newStr插入的字符串
    #返回str字符串从pos位置开始,len个长度的字符,使用newStr进行
    #替换后的结果。
    #MySQL中,索引从1开始。
    select insert('abcdefg', 2, 3, '12345');
    #instr(str, substr) 返回substr在str中首次出现的位置。
    #如果没有出现,返回0。
    select instr('abcdabcd', 'cd');
    select instr('abcdabcd', 'ef');
    #left(str, len) 返回str最左侧的len个字符
    select left('12345678', 5);
    #right(str, len) 返回str最右侧的len个字符
    select right('12345678', 5);
    #lower / lcase 返回字符串的小写形式
    select lower('ABCde'), lcase('ABCde');
    #upper / ucase 返回字符串的大写形式
    select upper('abc'), ucase('abc');
    #replace(str, from, to) 返回str中出现的from使用to
    #进行替换后的结果。
    select replace('abcdabcd', 'ab', 'xy');

    #mid / substr / substring
    #substr(str, pos) 截取子字符串,从str的pos开始,一直到字符串结束。
    select mid('abcdefg', 3), substr('abcdefg', 3), substring('abcdefg', 3);
    #substr(str, pos, len)
    #第二个参数指定开始点,第三个参数指定截取的长度。
    select substr('abcdefg', 3, 3);
    #mid / substr / substring 另外一种表示方式
    select substr('abcdefg', 3);
    select substr('abcdefg' from 3);
    select substr('abcdefg', 3, 3);
    select substr('abcdefg' from 3 for 3);
    #pos(开始点也可以去负值,表示从倒数的位置开始截取。
    select substr('abcdefg', -3);
    #ltrim 删除字符串左侧的空格
    select ltrim(' abc');
    #rtrim 删除字符串右侧的空格
    select rtrim(' abc '), length(rtrim('abc '));
    #trim 删除掉字符串两端的空格
    select trim(' abc ');
    #trim 可以指定删除掉字符串两点指定的字符
    select trim('X' from 'XXXabcXXX')
    #删除前端指定的字符
    select trim(leading 'X' from 'XXXabcXXX');
    #删除后端指定的字符
    select trim(trailing 'X' from 'XXXabcXXX');
    #删除两端指定的字符
    select trim(both 'X' from 'XXXabcXXX');

         8、聚合函数

    #avg 求平均值
    select avg(age) from student
    #count(字段) 返回该字段值非null的记录条数
    select count(age) from student;
    select age from student
    #count(*) 返回记录条数
    select count(*) from student;
    #max最大值
    select max(age) from student;
    #min最小值
    select min(age) from student;
    #sum求和
    select sum(age) from student;

    #分组统计 group by
    #当使用group by进行分组统计时,我们查询的字段要么使用聚合函数,
    #要么出现在group by的分组统计中。
    select sex, max(age), min(age) from student group by sex;

    #错误
    #select name, max(age) from student group by sex;
    

      

    #having
    #错误,where是对记录进行过滤,不能对组进行过滤。
    #因此,在where中不能使用聚合函数。
    #如果需要对组进行过滤,使用having,having中可以使用聚合函数。

    select sex, max(age), min(age) from student
    group by sex having min(age) > 12;

    #排序 order by
    #asc 升序排列, desc降序排列,默认为升序排列。
    select * from student order by age asc
    select * from student order by age desc
    #排序可以指定多个字段,当第一个字段相同时,会依次根据
    #后续的字段进行排序。
    select * from student order by age asc, id desc

    #当where,group by, order by,limit同时出现时,
    #顺序必须为:where -> group by -> order by -> limit

    #错误
    #select sex, max(age) from student order by id group by sex
    

      

    二、连接

         

    create table stay (
    	id int primary key,
        room varchar(10),
        stay_time date
    )
    insert into stay(id, room, stay_time)
    values (1, '1001', '2016-03-05');
    insert into stay(id, room, stay_time)
    values (2, '1002', '2016-04-11');
    insert into stay(id, room, stay_time)
    values (3, '1003', '2016-05-02');
    
    select stu.id id1, stu.name, sy.id id2, sy.room, sy.stay_time
    from student stu, stay sy where stu.id = sy.id;

    1、内连接

    交叉连接([cross] join ) 笛卡尔积连接,可以使用on指定连接 条件。
    内部连接([inner] join) MySQL中等同于交叉连接。
    自然连接(natural join) 以表中的同名字段作为连接条件。不 能使用on
    说明:自然连接会以表中所有的同名字段作为连接条件。
    如果想把指定的同名字段作为连接条件,可以在连接中使用 using子句。 

    #MySQL中cross join与inner join是等价的。
    #使用on来指定连接条件。
    #交叉连接 cross可以省略

    select stu.id id1, stu.name, sy.id id2, sy.room, sy.stay_time
    from student stu cross join stay sy on stu.id = sy.id
    #内部连接 inner可以省略
    select stu.id id1, stu.name, sy.id id2, sy.room, sy.stay_time
    from student stu inner join stay sy on stu.id = sy.id

    自然连接 natural join
    #自然连接是使用两张表中所有的同名字段进行等值连接。
    select stu.id id1, stu.name, sy.id id2, sy.room, sy.stay_time
    from student stu natural join stay sy
    #using 指定等值连接的字段
    select stu.id id1, stu.name, sy.id id2, sy.room, sy.stay_time
    from student stu join stay sy using(id)

    select stu.id id1, stu.name, sy.id id2, sy.room, sy.stay_time
    from student stu inner join stay sy on stu.id = sy.id
    where stu.age > 10

    2、外链接

    左外连接(left [outer] join)
    右外连接(right [outer] join)
    全外连接(full [outer] join)
    说明:外连接同样使用on作为连接条件,与内连接不同的是, 外连接即使不满足on指定的连接条件,也会保留相应的结果集。
    说明: MySQL不支持全外连接。

    外连接 [outer可以省略]
    select stu.id, stu.name, sy.room, sy.stay_time
    from student stu left outer join stay sy on stu.id = sy.id

    内连接与外连接
    对于内连接,不满足连接条件的记录一律不会在结果集中显示。
    对于外连接,不满足连接条件的记录也可能会在结果集中显示。
    以左外连接为例,左表的记录一定会在结果集中显示,如果右表
    有符合连接条件的记录,则正常显示相关字段值,如果右表没有
    符合连接条件的记录,则相关字段显示为null。

    MySQL中不支持全外连接。



  • 相关阅读:
    gThumb 3.1.2 发布,支持 WebP 图像
    航空例行天气预报解析 metaf2xml
    Baruwa 1.1.2 发布,邮件监控系统
    Bisect 1.3 发布,Caml 代码覆盖测试
    MoonScript 0.2.2 发布,基于 Lua 的脚本语言
    Varnish 入门
    快速增量备份程序 DeltaCopy
    恢复模糊的图像 SmartDeblur
    Cairo 1.12.8 发布,向量图形会图库
    iText 5.3.4 发布,Java 的 PDF 开发包
  • 原文地址:https://www.cnblogs.com/liuwei6/p/7275380.html
Copyright © 2011-2022 走看看