本文主要总结了那些我认为需要(没记住)再好好复习一遍的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: