909422229__Mysql全部精华总结

来源:互联网 发布:d3.js 力学图 编辑:程序博客网 时间:2024/06/15 05:59


一,函数

1,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;
2,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;
3,AVG函数
语法
       SELECT AVG(列名) FROM 表名 [WHERE 条件语句];
注意事项
       计算指定列的平均值, 如果有WHERE子句, 则计算满足条件的记录
       AVG()统计平均数不包含NULL值
练习
       计算英语平均分
       select avg(english) from student;
       计算总分平均分, MySQL不支持组函数嵌套使用.
       select sum(english+math+chinese)/count(*) from student;
4,MAX / MIN函数
语法
       SELECT MAX(列名) FROM 表名 [WHERE 条件语句];
       SELECT MIN(列名) FROM 表名 [WHERE 条件语句];
注意事项
       获取指定列最高/最低值, NULL不参与统计
练习
       统计总分最高分和最低分
       select max(english+math+chinese),min(english+math+chinese) from student;
5,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;
6,时间函数
注意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');
7,字符串函数
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   '), '--');
8,数学函数
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();
二,连接表
,1,连接查询
当我们要插叙的数据不只是在一张表中, 我们就需要使用多表连接查询.
例如: 查询员工所在的部门名称, 查询部门中员工名称, 都需要查询两张表.
 
注意:
在多表连接查询的时候, 如果没有有效的连接条件, 所有表中的行会互相连接, 形成笛卡尔集.
为了避免笛卡尔集, 可以再where后加入有效的连接条件
 
 
练习:
查询出公司所有员工姓名, 所在部门名
查询出开发部所有员工名
查询出张三所在部门名称
2,多表连接
多张表连接查询, 一张表外键引用另外一张表, 另外一张表再引用其他表.
例如: 员工表引用部门, 部门表引用城市表. 这时如果想根据员工查城市, 或者根据城市查员工就需要将三张表连接查询
 
准备工作:
创建城市表, id主键自动生成, 带有名称
插入两条记录, 北京和上海
在部门表添加city_id, 外键引用城市表的id
将开发部的地址改为北京, 市场部的地址改为上海
 
练习:
查询所有员工, 员工所属部门以及部门所在城市
查询北京的所有员工
2,自连接
自己和自己连接, 当前表的外键引用自己的主键.
例如: 员工的经理也是员工, 应该在员工表中添加一列经理id. 之后添加一个外键, 引用员工表的主键.
 
准备工作:
在员工表中添加manager_id, 外键引用员工表id
插入赵六, 孙七. 分别属于开发部和市场部.
将张三和李四的经理设置为赵六, 王五经理设置为孙七.
 
练习:
查询王五的经理姓名
查询赵六手下的员工名
3,内连接、左外连接、右外连接(SQL99)
准备工作:
插入记录周八, 部门为空
插入部门财务部
 
1)内连接
 
之前我们使用逗号和where子句进行的连接就是内连接. 标准语法应使用 inner join 和 on, 例如:
select e.name,d.name from employee e,department d where e.department_id=d.id;
select e.name,d.name from employee e inner join department d on e.department_id=d.id;
内连接会将两张表完全匹配连接条件的记录查询出来, 不满足的不会显示
 
2.)左外连接
 
使用 left outer join 和 on 关键字进行连接查询, 这时左表中不满足条件的记录也会被查询出来
例如: 查询所有员工的部门, 要将没有部门的周八查询出来. 这时需要查询出员工表中所有记录, 即使不满足连接条件, 周八也要显示.
 
3.)右外连接
 
使用 right outer join 和 on 关键字进行连接查询, 这时右表中不满足条件的记录也会被查询出来
例如: 查询每个部门下都有哪些员工, 要将没有员工的财务部显示出来.
 
4.)全外连接
MySql不支持全外连接full outer join, 可以使用union distinct来实现.
 
练习:
使用左外连接查询每个部门下都有哪些员工
使用右外连接查询所有员工所属部门
查询所有员工名和所在部门, 以及部门所在城市.
查询在上海工作的所有员工
查询张三的经理姓名
三,嵌套查询
查询选修了计算机基础的课程的学生的学号
select xs_kc.sid,课程名 ,kid
from kc join xs_kc on kc.课程号=xs_kc.kid
where kc.课程名='计算机基础';
换思路:
select sid
from xs_kc
where kid=(
      select 课程号
      from kc
      where 课程名='计算机基础'
);
第一步:执行子查询,101
第二步:执行外部查询,外部查询的查询条件是依赖于子查询的
查询:所有成绩比平均成绩高的学生的sid,kid
0 0