mysql 两个整数连接_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中不支持全外连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值