1.排序
select * from table order by desc/asc
2.去重
select distinct(column) from table...
3.group by与having区别
使用group by的sql语句,select后的字段只能是group by后的字段,如果需要展示其他字段数据,需要给该列使用聚合函数,否则默认展示分组后的第一行数据。
select sum(price),order_id from order where price>100 group by order_id
having是对分组后的数据进行过滤
select sum(price),order_id from order where price>100 group by order_id HAVING sum(price)>1000
SQL语句执行顺序:from--where--group by--having--select--order by
4.连接查询
内连接(等值连接):组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集部分
select * from user u INNER JOIN order o ON u.id=o.user_id
左连接:左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL(用户信息表中的记录全部展示,用户没有下单数据的显示null,有数据的显示对应用户的下单数据)
select * from user u LEFT JOIN order o ON u.id=o.user_id
右连接:右表的记录将会全部表示出来,而左表只会显示符合搜索条件的记录。左表记录不足的地方均为NULL(订单表中的记录全部展示,订单中对应用户的信息如果没有显示Null,有则显示对应用户的用户信息)
select * from user u RIGHT JOIN order o ON u.id=o.user_id
全连接:
(select colum1,colum2...columN from tableA ) union (select colum1,colum2...columN from tableB)
或(select colum1,colum2...columN from tableA ) union all (select colum1,colum2...columN from tableB)
union语句注意事项:
通过union连接的SQL它们分别单独取出的列数必须相同;
不要求合并的表列名称相同时,以第一个sql 表列名为准;
使用union 时,完全相等的行,将会被合并,由于合并比较耗时,一般不直接使用 union 进行合并,而是通常采用union all 进行合并;
被union 连接的sql 子句,单个子句中不用写order by ,因为不会有排序的效果。但可以对最终的结果集进行排序;
5.嵌套查询
select user_name,iphone from user where id in (select user_id from order)
嵌套的语句可以在select之后,from之后,where条件之后
6.delete与truncate的区别
delete删除表中的数据,表结构还存在,删除后的数据可以找回
trancate删除把表直接drop掉,然后再新建一个同样的新表。删除的数据不能找回,执行速度要比delete要快
一般删除上万条垃圾数据可使用truncate特别快,因为他不记录日志
7.索引的作用?优缺点?联合索引与单列索引的使用?
索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息。相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提高性能(查询速度)
优点:可以加快数据的检索速度,可以加速表与表之间的连接,在使用分组和排序进行检索的时候,可以减少查询中分组和排序的时间,通过创建唯一性索引,可以保证数据库表中的每一行数据的唯一性。
缺点:创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加,索引需要占用物理空间,数据量越大,占用空间越大,会降低表的增删改的效率,因为每次增删改索引,都需要进行动态维护
什么时候需要创建索引:频繁作为查询条件的字段应该创建索引,查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找,查询中统计或者分组的字段,主键自动建立唯一索引
什么时候不创建索引:频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件,where条件里用不到的字段,不创建索引;表记录太少,不需要创建索引;经常增删改的表;数据重复且分布平均的字段,因此为经常查询的和经常排序的字段建立索引。注意某些数据包含大量重复数据,因此他建立索引就没有太大的效果,例如性别字段,只有男女,不适合建立索引。
联合索引:在多个字段上建立索引,能够加速查询到速度
8.一条SQL查询出每门课大于80分的学生姓名
#解题思路:按照学生分组,过滤出成绩最小值仍大于80的
select user_name,min(score) from user_score group by user_name having min(score)>80
9.一条SQL查询出,订单金额低于本地区平均订单金额的人员名称
SELECT
m.user_id,
u.user_name,
m.region,
m.order_price
FROM
morder m
INNER JOIN (SELECT region, AVG( order_price ) as avg_price FROM morder GROUP BY region) AS avg_m
INNER JOIN USER u
WHERE
m.region = avg_m.region
AND m.user_id=u.id
AND m.order_price < avg_m.avg_price
10.一条SQL统计每个地区订单总金额占全国订单总金额的比例,按照倒序排列
SELECT
region,
sum( order_price ) / ( SELECT sum( order_price ) FROM morder ) AS precent_price
FROM
morder
GROUP BY
region
ORDER BY
precent_price DESC