SQL For MySQL
2013-4-8
1.如果需求字符串列值按照数字大小排列,则在语句中加上“-”或“--”。比如:
有一张商品表,其中有一个商品编号属性,有值为:1002,2003,1003等等,如果要求按照:1002,1003,2003这样排序,则SQL语句如下:
select * from merchandise order by '-'+merNo;
select * from merchandise order by '--'+merNo;
2.having语句
having语句是为了解决where关键字和合计函数无法一起使用而生的
select m.staffID,m.date,sum(m.times) as totalTimes
from manhour m,work_calendar wc
where m.date between startDate and endDate and m.date = wc.date and wc.able=1
group by m.staffID ,m.date
having sum(m.times) < 8 or sum(m.times)>24;
需要注意的是:
当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下:
执行where子句查找符合条件的数据;
使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;最后用having 子句去掉不符合条件的组。
having子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle、MySQL
having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。
3.join语句
- JOIN: 如果表中有至少一个匹配,则返回行
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
//2013-05-15 14:49:21:此处终于明白意思了:具体比如外键连接时,如果你用普通的连接或者不用连接,则会遗漏右表中外键连接左表,而此时右表列值为null的行。
//而关于多表连接以及表连接自身表:
例子:
1 select * from temp t left join value v on t.id = v.id 2 left join temp t2 on t.id = t2.boss where...
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行
注:full join在MySQL中并不适用。
题目:关系模式:User(userId, userName), Article(articleId, userId, title, content),Vote(articleId, score),User为用户关系,Article为用户发表的文章关系,Vote为文章得票关系,title为文章标题、score为得票数。
(1)用SQL语言查询所有没发表过文章的用户名;
(2)用SQL语言查询得票数大于100的所有文章标题,按得票数倒序排列;
(3)用SQL语言查询出发表文章数大于5,文章平均得票数大于100的用户名,按平均得票数倒序排列;
(4)设计这些表的主键、外键和索引,并指出上面三个查询所使用的索引。
(5)当用户数超过1000万,文章数超过1亿时,如何考虑存储及性能的改进和优化?