sql语句复习总结(单表篇)

本文主要总结了那些我认为需要(没记住)再好好复习一遍的sql语句,有些语句虽然简单,但是还是有些细节需要注意,要不然一上手还是容易写错,复习中发现之前没有理解或者不记得的点,比如说为啥where不能跟聚集函数一起用,group by跟having有啥区别~,借此文做一个学习记录,我没有对这些语句做严格的分类,主要包含了alter相关,update相关,模糊查询,删除,聚集函数,group by跟having,外加一个别名,主要是单表,以后有时间再写一篇关于多表的~

1.alter相关

添加一个列:在user表中添加state属性列,该属性为DATE类型,要记得添加类型哦!

ALTER TABLE USER ADD state DATE;

result:多了一个列~

 

删除一个列:从user表中删除state这个列。

ALTER TABLE USER Drop state ;

result:state这个列消失啦~

 

修改列名:将username这个列名改为uname,同样,要明确新列名的类型

ALTER TABLE USER CHANGE username uname CHAR(20);

记得新列名后面加上类型~

result:

 

修改列属性:将telephone这个列的数据类型改为int,用的是modify

ALTER TABLE USER MODIFY  COLUMN telephone INT;

result:

telephone类型变成了int~

 

修改表的名字:将user表改成usertable表。

ALTER TABLE USER RENAME TO usertable;

result:

 

 

2.删除相关

删除表:删除掉user1这个表~

DROP TABLE user1;

result:

user1表没有啦!

 

删除数据库:删除掉xxxxx这个数据库。

DROP DATABASE xxxxx;

结果就不贴出来了吧~

 

删除数据:从usertable表中删除uname='haha'的这一行数据

DELETE  FROM usertable WHERE uname='haha';

result:

uname='haha'没有啦~

 

3.更新表数据相关

更新数据:将uid为1的uname改为‘alice’

 UPDATE usertable SET uname='alice' WHERE uid='1';

result:

 

updat中嵌套子查询:将所有男生的email地址改为'124@.com'

 UPDATE usertable  SET email='124@.com' WHERE uid IN(SELECT uid FROM (SELECT uid FROM usertable WHERE sex='男') t1) ;
/*
临时表:(SELECT uid FROM usertable WHERE sex='男') t1
注意,子表要有自己的别名,如果不加别名会报错
*/

小插曲:其实我一开始写的语句是这样的~

 UPDATE usertable  SET email='124@.com' WHERE uid IN(SELECT uid FROM usertable WHERE sex='男') ;

但是却报了一个错:

这个错误的意思是不能先select出同一表中的某些值,再update这个表(在同一语句中)

解决办法是,将select得到的结果,再通过中间表select一遍,这样就规避了错误,

这个问题只出现于mysql,oracle不会出现此问题(网上的解决方案)。

result:

 

4.查询相关

字符匹配:

%表示任意长度的字符串,比如说x%y表示以x开头,以y结尾的任意长度的字符串,例如xy,xiouy,xvy都是匹配的。

_(下划线)代表任意单个字符,例如x_y表示以x开头,y结尾的长度为3的任意字符串,例如xay,xcy都是匹配的。

匹配1:查找以海开头的名字(不限长度)相关信息

 SELECT * FROM product WHERE pname LIKE '海%';

result:

 

匹配2:查找以海开头的名字(长度为2)相关信息

 SELECT * FROM product WHERE pname LIKE '海_';

result:

 

order by字句:可以用该子句对查询结果按照一个或者多个列升序(ASC)或者降序(DESC)排列,默认为升序哦。

对上一个查询结果进行降序排列显示

 SELECT * FROM product WHERE pname LIKE '海%' ORDER BY pid DESC;

result:

pid降序排列了哦!

 

distinct消除某些相同的列:对product表中的pname去重

 SELECT DISTINCT pname FROM product;

results:

之前‘海尔’有重复,现在没有了哦~

 

5.聚集函数相关

   Count()统计所有:统计product表中总共有多少行数据

 SELECT COUNT(*) FROM product;

result:6行

 

Count()统计某个列有多少行数据:统计price这个列不重复的数据元组个数

SELECT COUNT(DISTINCT price) FROM product;

result:

 

   sum()函数计算某一个列值的总和(此列必须是数值型哦!):统计product表中所有价格之和

SELECT SUM(price) FROM product;

result:

 

  avg()函数计算某个列值的平均值(此列必须是数值型哦!):统计product表中所有价格的平均值

 SELECT AVG(price) FROM product;

result:

还有函数max()求最大值,min()求最小值,用法跟之前一样,就不做实验了~

 

group by子句,按照我自己的理解就是,对列进行分组,比如说多个商品可能都属于一个分类,如果我想要只要某个分类有多少个商品,就可以用group by了,这个子句一般跟聚集函数连用。值得注意的是,对查询结果进行分组是为了细化聚集函数的作用对象,怎么理解这句话呢?我在前面使用count(*)时,这个函数是作用于所有数据的,但是使用了分组之后,只对每一个组负责,像下面这个例子,count函数只对每一种商品分类负责。

SELECT  category_id,COUNT(pid) FROM product GROUP BY category_id;
/*
这个语句对查询结果按照category_id分组,将所有category_id值相同的分为一组,然后对每个组用聚集函数
count进行计算,求得每个分类下有多少个商品。
*/

result:

 

having短语:如果相对分组后的结果进行筛选,可以用这个短语

选出商品数量大于1的商品分类

 SELECT  category_id,COUNT(pid) FROM product GROUP BY category_id  HAVING COUNT(pid)>1;

只要在上面的基础上加上 HAVING COUNT(pid)>1;就可以了。

result:

 

group by与having的区别:作用的对象是不同的,where作用于基本表或者视图,而having作用与组,选择满足条件的组,意思就是说选出组之后再对组进行筛选,所以说having得用在group by之后。

注意,where语句是不能用聚集函数作为条件表达式的

如果我们这么写:

 SELECT  category_id,COUNT(pid) FROM product  WHERE COUNT(pid)>1 GROUP BY category_id ; 

就会报一个错~

就是聚集函数用法无效的意思。那为什么不能一起用呢?聚集函数是基于整列数据进行计算的,也就是用聚集函数之前,结果集是已经确定好的,而where子句是对数据进行筛选的,结果集还没有确定。两者用在一起给人的感觉就是,还没有父亲就已经有儿子的悖论

 

别名:给pid,pname,market_price分别取别名

SELECT pid PID,pname PNAME,market_price MARKETPRICE FROM product;

其实就是在列名后面加一个别名,很简单的~

result:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值