2011-9-13 mysql的查询、函数、连接
2011-09-13 20:37
411 查看
2011-9-13阴
开始想好好的记录自己的生活,不只是学习。还有我的生活……
今天复习了mysql的主键外间和子查询及其他内容,之后把今天所学的一部分记录下来。
消除查询结果中的重复行
select distinct 列名,列名
from 表名;多列或是一列的重复值只显示一次
选择运算--where
关系表达式
> >= < <= = <>!=
select * from xs
where statol<>45;显示表中学分大于45的学生显示出来小于的不显示
where 备注 =null;只要有一边是空就返回假
<=>相等关系的比较可以比较空值
逻辑表达式
select sid,sname,statol
from xs
where statol>=40 and statol<=50;and 可以用 &&表示
select sid,sname,statol
from xs
where statol<=40 or statol>=50;表示显示大于50或小于40的显示or用||表示
select sid,sname,statol
from xs
where not (statol>=40 and statol<=50);挑选不在40到50之间的数据
select sid,sname,statol
from xs
where!(sid='081101');
between val1 and val2;在 val1 到 val2 之内
select sid,sname,statol
from xs
where statol between 45 and 50;表示45到50之间
select sid,sname,sbrithday
from xs
where sbrithday beween '1989-1-1' and '1989-12-31';查找1989-1-1到1989-12-31出生的人
如果显示不连续的多个值:in
select sid,sname,statol
from xs
where statol=38 or statol=40 or statol=48;
可写成
select sid,sname,statol
from xs
where statol in(38,40,48);查找总学分38,40,48的
select zhuanye,sname,statol
from xs
where zhuanye='计算机' or zhuanye='通讯工程';
select zhuanye,sname,statol
from xs
where zhuanye in('计算机','通讯工程');
5>模糊查询 like ‘模式匹配字符串’
在‘模式匹配字符串’中可使用通配符:%任意个任意的字符,_一个任意的字符
select sid,sname,statol
from xs
where sname like '王%';查找姓王的人
select sid,sname
from xs
where sid like '__11__';
标准的sql语句推荐使用
有内连接,外连接,自然连接,交叉连接
1)
select 列名
from 表名1 join 表名2
on 连接条件
select xs.sid,sname,kid,chengji
from xs join xs_kc
on xs.sid=xs_kc.sid;
select sname,课程号,chengji
from xs join xs_kc on xs.sid=xs_kc.sid
join kc on xs_kc.kid=kc.课程号;
当两个表有同一个字段那么可以用useing(字段名);代替on
2)外连接:包含来自一张表的所有记录行和另一张的匹配记录行
左外连接from 表1 left join 表2 连接条件
右外连接from 表1 right join 表2 连接条件
查询所有:所有学生的信息和课程号,得分
select xs.sid,sname,kid,chengji
from xs left outer join xs_kc
on xs.sid=xs_kc.sid;左外连接中左边的表全部显示右边的只显示对应的xs 就在左,因为有left
查询:学生选修课程的信息(sid,kid,课程名),还有没有被学生选修的课程情况
select sid,kid,课程名
from xs_kc right join kc
on xs_kc.kid=kc.课程号;右外连接中右边的表全部显示左边的只显示对应的xs 就在右,因为有right
3)自然连接
natural join 自然连接
natural left join 自然连接
natural right join 自然连接
select xs.sid,sname,kid,chengji
from xs natural join xs_kc;自然连接不要条件件
COUNT函数
语法
SELECT COUNT(*)|COUNT(列名) from 表名 [WHERE 条件语句]
注意事项
COUNT(列名)的方式是统计指定列中有多少条记录, 不包括值为NULL的
COUNT(*)则是统计表中有多少条数据
COUNT(DISTINCT 列名) 统计不重复的记录数
如果加上WHERE子句, 则是统计满足条件的记录
练习
统计student表中有多少条记录
select count(*) from student;
统计学生语文成绩大于80的有多少人
select count(*) from student where chinese>80;
统计总分大于250的有多少人
select count(*) from student where english+math+chinese>250;
统计参加英语考试的有多少人
select count(english) from student;
SUM函数
语法
SELECT SUM(列名) FROM 表名 [WHERE 条件语句];
注意事项
计算指定列中所有记录的和, 如果有WHERE子句则计算满足条件的记录
练习
计算所有学生的数学成绩总和
select sum(math) from student;
显示所有学生的语文成绩总和, 数学成绩总和, 英语成绩总和
select sum(chinese),sum(math),sum(english) from student;
计算所有学生的分数总和
select sum(chinese)+sum(math)+sum(english) from student;
统计英语平均分
select sum(english)/count(*) from student;
select sum(english)/count(english) from student;
AVG函数
语法
SELECT AVG(列名) FROM 表名 [WHERE 条件语句];
注意事项
计算指定列的平均值, 如果有WHERE子句, 则计算满足条件的记录
AVG()统计平均数不包含NULL值
练习
计算英语平均分
select avg(english) from student;
计算总分平均分, MySQL不支持组函数嵌套使用.
select sum(english+math+chinese)/count(*) from student;
MAX / MIN函数
语法
SELECT MAX(列名) FROM 表名 [WHERE 条件语句];
SELECT MIN(列名) FROM 表名 [WHERE 条件语句];
注意事项
获取指定列最高/最低值, NULL不参与统计
练习
统计总分最高分和最低分
select max(english+math+chinese),min(english+math+chinese) from student;
GROUP BY(重点)
语法
SELECT 列名 FROM 表名 GROUP BY 列名 [HAVING 条件语句]
注意事项
按照某列归类
HAVING和WHERE类似, 但HAVING是作用于组, 其中可以使用组函数
SELECT列表中未包含在组函数中的列名, 只能是GROUP BY中的列名
HAVING中可以使用组函数, WHERE不能.
练习
导入order.sql
对订单表归类, 显示购买过哪些商品
select product from orders group by product;
select distinct product from orders;
对订单表归类, 显示购买过哪些商品, 并显示每种购买了几个, 以及总价
select product,count(product),sum(price) from orders group by product;
查询总价大于5000的商品有哪几类
select product,count(product),sum(price) sum_price from orders group by product having sum_price>5000;
函数
时间函数
注意date, datetime, timestamp之间的区别
ADDTIME(原时间, 增加值) 在某个时间上增加一段时间
select addtime('18:23:01', '01:01:01');
select addtime(now(),'3:0:0');
CURRENT_DATE() 当前日期
select current_date();
CURRENT_TIME() 当前时间
select current_time();
CURRENT_TIMESTAMP() 当前时间戳
select current_timestamp();
DATE(时间) 返回制定时间的日期部分
select date('2011-02-14 18:00:00');
DATE_ADD(日期,INTERVAL 增加值 类型) 在指定日期上对某个字段增加
select date_add('2011-02-14 23:00:00', interval 10 month);
DATE_SUB(日期,INTERVAL 减少值 类型) 在指定日期上对某个字段减少
select date_sub('2011-02-14 23:00:00', interval 1 year);
DATEDIFF(日期1, 日期2) 计算两个日期之间的差值
select datediff('2000-02-14', '2001-02-14');
NOW() 当前时间
select now();
YEAR|MONTH|DATE|HOUR|MINUTE|SECOND(时间) 获取指定时间的某个字段
select year('2011-02-14 23:00:00');
select hour('2011-02-14 23:00:00');
字符串函数
CHARSET(字符串) 返回字符串字符集
select charset(name) from student;
CONCAT(字符串1[, 字符串2]... ) 连接字符串
select concat('aaa', 'bbb', 'ccc');
INSTR(字符串, 子字符串) 查找子字符串出现位置, 注意序号从1开始
select instr('abc', 'a');
UCASE(字符串) 将字符串转为大写
select ucase('aBc');
LCASE(字符串) 将字符串转为小写
select lcase('aBc');
LEFT(字符串, 长度) 从字符串左边取指定长度个字符
select left('aBc',2);
LENGTH(字符串) 计算字符串长度
select length('aBc');
REPLACE(字符串, 搜索字符串, 替换字符串) 将字符串中指定字符串替换为其他字符串
select replace('abbcbbd', 'bb', 'ee');
STRCMP(字符串1, 字符串2) 逐个字符比较两个字符串, 如果是包含关系, 则返回长度差值
select strcmp('abcc', 'abde');
select strcmp('abc', 'ab');
SUBSTRING(字符串, 开始坐标[, 个数])
从字符串中截取
select substring('abcdef', 3);
select substring('abcdef', 3, 2);
LTRIM(字符串) 去掉左边空白
select ltrim(' abc ');
select concat('--', ltrim(' abc '), '--');
RTRIM(字符串) 去掉右边空白
select concat('--', rtrim(' abc '), '--');
TRIM(字符串) 去掉左右两边空白
select concat('--', trim(' abc '), '--');
数学函数
ABS(数字) 求绝对值
select abs(10);
select abs(-10);
BIN(十进制数) 将十进制转换为二进制
select bin(5);
HEX(十进制数) 将十进制转换为十六进制
select hex(10);
CONV(数字, 原进制, 目标进制)
转换进制
select conv(12, 10, 16);
select conv(12, 10, 2);
select conv(12, 16, 2);
CEILING(小数) 向上取整
select ceiling(3.4);
FLOOR(小数) 向下取整
select floor(3.4);
ROUND(小数) 四舍五入
select round(3.4);
select round(3.5);
FORMAT(小数, 保留位数) 保留小数位
select format(3.1415926, 2);
LEAST(值,值[,值]...)
取最小值
select least(1,2,3,4);
select least('a', 'b', 'c', 'd');
GREATEST(值,值[,值]...)
取最大值
select greatest(1,2,3,4);
select greatest('a', 'b', 'c', 'd');
MOD(数字, 数字) 取余
select mod(3,2);
select 3%2;
RAND() 生成随机数, 14位小数, 0 <= n <= 1
select rand();
开始想好好的记录自己的生活,不只是学习。还有我的生活……
今天复习了mysql的主键外间和子查询及其他内容,之后把今天所学的一部分记录下来。
消除查询结果中的重复行
select distinct 列名,列名
from 表名;多列或是一列的重复值只显示一次
选择运算--where
关系表达式
> >= < <= = <>!=
select * from xs
where statol<>45;显示表中学分大于45的学生显示出来小于的不显示
where 备注 =null;只要有一边是空就返回假
<=>相等关系的比较可以比较空值
逻辑表达式
select sid,sname,statol
from xs
where statol>=40 and statol<=50;and 可以用 &&表示
select sid,sname,statol
from xs
where statol<=40 or statol>=50;表示显示大于50或小于40的显示or用||表示
select sid,sname,statol
from xs
where not (statol>=40 and statol<=50);挑选不在40到50之间的数据
select sid,sname,statol
from xs
where!(sid='081101');
between val1 and val2;在 val1 到 val2 之内
select sid,sname,statol
from xs
where statol between 45 and 50;表示45到50之间
select sid,sname,sbrithday
from xs
where sbrithday beween '1989-1-1' and '1989-12-31';查找1989-1-1到1989-12-31出生的人
如果显示不连续的多个值:in
select sid,sname,statol
from xs
where statol=38 or statol=40 or statol=48;
可写成
select sid,sname,statol
from xs
where statol in(38,40,48);查找总学分38,40,48的
select zhuanye,sname,statol
from xs
where zhuanye='计算机' or zhuanye='通讯工程';
select zhuanye,sname,statol
from xs
where zhuanye in('计算机','通讯工程');
5>模糊查询 like ‘模式匹配字符串’
在‘模式匹配字符串’中可使用通配符:%任意个任意的字符,_一个任意的字符
select sid,sname,statol
from xs
where sname like '王%';查找姓王的人
select sid,sname
from xs
where sid like '__11__';
标准的sql语句推荐使用
有内连接,外连接,自然连接,交叉连接
1)
select 列名
from 表名1 join 表名2
on 连接条件
select xs.sid,sname,kid,chengji
from xs join xs_kc
on xs.sid=xs_kc.sid;
select sname,课程号,chengji
from xs join xs_kc on xs.sid=xs_kc.sid
join kc on xs_kc.kid=kc.课程号;
当两个表有同一个字段那么可以用useing(字段名);代替on
2)外连接:包含来自一张表的所有记录行和另一张的匹配记录行
左外连接from 表1 left join 表2 连接条件
右外连接from 表1 right join 表2 连接条件
查询所有:所有学生的信息和课程号,得分
select xs.sid,sname,kid,chengji
from xs left outer join xs_kc
on xs.sid=xs_kc.sid;左外连接中左边的表全部显示右边的只显示对应的xs 就在左,因为有left
查询:学生选修课程的信息(sid,kid,课程名),还有没有被学生选修的课程情况
select sid,kid,课程名
from xs_kc right join kc
on xs_kc.kid=kc.课程号;右外连接中右边的表全部显示左边的只显示对应的xs 就在右,因为有right
3)自然连接
natural join 自然连接
natural left join 自然连接
natural right join 自然连接
select xs.sid,sname,kid,chengji
from xs natural join xs_kc;自然连接不要条件件
COUNT函数
语法
SELECT COUNT(*)|COUNT(列名) from 表名 [WHERE 条件语句]
注意事项
COUNT(列名)的方式是统计指定列中有多少条记录, 不包括值为NULL的
COUNT(*)则是统计表中有多少条数据
COUNT(DISTINCT 列名) 统计不重复的记录数
如果加上WHERE子句, 则是统计满足条件的记录
练习
统计student表中有多少条记录
select count(*) from student;
统计学生语文成绩大于80的有多少人
select count(*) from student where chinese>80;
统计总分大于250的有多少人
select count(*) from student where english+math+chinese>250;
统计参加英语考试的有多少人
select count(english) from student;
SUM函数
语法
SELECT SUM(列名) FROM 表名 [WHERE 条件语句];
注意事项
计算指定列中所有记录的和, 如果有WHERE子句则计算满足条件的记录
练习
计算所有学生的数学成绩总和
select sum(math) from student;
显示所有学生的语文成绩总和, 数学成绩总和, 英语成绩总和
select sum(chinese),sum(math),sum(english) from student;
计算所有学生的分数总和
select sum(chinese)+sum(math)+sum(english) from student;
统计英语平均分
select sum(english)/count(*) from student;
select sum(english)/count(english) from student;
AVG函数
语法
SELECT AVG(列名) FROM 表名 [WHERE 条件语句];
注意事项
计算指定列的平均值, 如果有WHERE子句, 则计算满足条件的记录
AVG()统计平均数不包含NULL值
练习
计算英语平均分
select avg(english) from student;
计算总分平均分, MySQL不支持组函数嵌套使用.
select sum(english+math+chinese)/count(*) from student;
MAX / MIN函数
语法
SELECT MAX(列名) FROM 表名 [WHERE 条件语句];
SELECT MIN(列名) FROM 表名 [WHERE 条件语句];
注意事项
获取指定列最高/最低值, NULL不参与统计
练习
统计总分最高分和最低分
select max(english+math+chinese),min(english+math+chinese) from student;
GROUP BY(重点)
语法
SELECT 列名 FROM 表名 GROUP BY 列名 [HAVING 条件语句]
注意事项
按照某列归类
HAVING和WHERE类似, 但HAVING是作用于组, 其中可以使用组函数
SELECT列表中未包含在组函数中的列名, 只能是GROUP BY中的列名
HAVING中可以使用组函数, WHERE不能.
练习
导入order.sql
对订单表归类, 显示购买过哪些商品
select product from orders group by product;
select distinct product from orders;
对订单表归类, 显示购买过哪些商品, 并显示每种购买了几个, 以及总价
select product,count(product),sum(price) from orders group by product;
查询总价大于5000的商品有哪几类
select product,count(product),sum(price) sum_price from orders group by product having sum_price>5000;
函数
时间函数
注意date, datetime, timestamp之间的区别
ADDTIME(原时间, 增加值) 在某个时间上增加一段时间
select addtime('18:23:01', '01:01:01');
select addtime(now(),'3:0:0');
CURRENT_DATE() 当前日期
select current_date();
CURRENT_TIME() 当前时间
select current_time();
CURRENT_TIMESTAMP() 当前时间戳
select current_timestamp();
DATE(时间) 返回制定时间的日期部分
select date('2011-02-14 18:00:00');
DATE_ADD(日期,INTERVAL 增加值 类型) 在指定日期上对某个字段增加
select date_add('2011-02-14 23:00:00', interval 10 month);
DATE_SUB(日期,INTERVAL 减少值 类型) 在指定日期上对某个字段减少
select date_sub('2011-02-14 23:00:00', interval 1 year);
DATEDIFF(日期1, 日期2) 计算两个日期之间的差值
select datediff('2000-02-14', '2001-02-14');
NOW() 当前时间
select now();
YEAR|MONTH|DATE|HOUR|MINUTE|SECOND(时间) 获取指定时间的某个字段
select year('2011-02-14 23:00:00');
select hour('2011-02-14 23:00:00');
字符串函数
CHARSET(字符串) 返回字符串字符集
select charset(name) from student;
CONCAT(字符串1[, 字符串2]... ) 连接字符串
select concat('aaa', 'bbb', 'ccc');
INSTR(字符串, 子字符串) 查找子字符串出现位置, 注意序号从1开始
select instr('abc', 'a');
UCASE(字符串) 将字符串转为大写
select ucase('aBc');
LCASE(字符串) 将字符串转为小写
select lcase('aBc');
LEFT(字符串, 长度) 从字符串左边取指定长度个字符
select left('aBc',2);
LENGTH(字符串) 计算字符串长度
select length('aBc');
REPLACE(字符串, 搜索字符串, 替换字符串) 将字符串中指定字符串替换为其他字符串
select replace('abbcbbd', 'bb', 'ee');
STRCMP(字符串1, 字符串2) 逐个字符比较两个字符串, 如果是包含关系, 则返回长度差值
select strcmp('abcc', 'abde');
select strcmp('abc', 'ab');
SUBSTRING(字符串, 开始坐标[, 个数])
从字符串中截取
select substring('abcdef', 3);
select substring('abcdef', 3, 2);
LTRIM(字符串) 去掉左边空白
select ltrim(' abc ');
select concat('--', ltrim(' abc '), '--');
RTRIM(字符串) 去掉右边空白
select concat('--', rtrim(' abc '), '--');
TRIM(字符串) 去掉左右两边空白
select concat('--', trim(' abc '), '--');
数学函数
ABS(数字) 求绝对值
select abs(10);
select abs(-10);
BIN(十进制数) 将十进制转换为二进制
select bin(5);
HEX(十进制数) 将十进制转换为十六进制
select hex(10);
CONV(数字, 原进制, 目标进制)
转换进制
select conv(12, 10, 16);
select conv(12, 10, 2);
select conv(12, 16, 2);
CEILING(小数) 向上取整
select ceiling(3.4);
FLOOR(小数) 向下取整
select floor(3.4);
ROUND(小数) 四舍五入
select round(3.4);
select round(3.5);
FORMAT(小数, 保留位数) 保留小数位
select format(3.1415926, 2);
LEAST(值,值[,值]...)
取最小值
select least(1,2,3,4);
select least('a', 'b', 'c', 'd');
GREATEST(值,值[,值]...)
取最大值
select greatest(1,2,3,4);
select greatest('a', 'b', 'c', 'd');
MOD(数字, 数字) 取余
select mod(3,2);
select 3%2;
RAND() 生成随机数, 14位小数, 0 <= n <= 1
select rand();
相关文章推荐
- MySQL(3)-子查询、连接、运算符及函数
- MySQL学习笔记 3:子查询、连接、运算符和函数
- MYSQL group_concat()函数 将查询结果用,连接起来
- 【从零开始学习MySql数据库】(3)函数与子查询和连接查询
- mysql连接字符串,大小写不敏感查询
- 查询数据库当前用户连接信息(MySQL,Oracle)
- MySql从一窍不通到入门(三)连接查询、联合查询、子查询
- mysql的查询、子查询及连接查询
- ORACLE-SQL积累(查询外检约束、记录长度、字段长度、启用禁用触发器、case用法、分组连接函数、查询被锁表)
- mysql的查询、子查询及连接查询
- mysql 反向查询 函数创建
- mysql查询锁表及删除连接
- Asp.net+Mysql,查询出错:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败
- 百度查询复制粘贴: MySQL 中取子串函数 SUBSTR(SUBSTRING)
- MySQL多表查询合并结果union all,内连接查询
- MySQL的行转列、列转行、连接字符串 concat、concat_ws、group_concat函数用法
- sql(三):多表查询、左右连接、组函数与分组统计
- 通过linux远程连接mysql,查询结果中文为乱码小结
- mysql多表连接查询inner/left/right/full/cross join
- mysql面试题:使用表连接的方式查询出指定的结果