我认知的MySQL

1.0关于mysql的学习笔记

查询语句,select关键字,select后面可以是字段列表,表达式和函数,列如select distinct name (字段名)  from 表名;查询该表中有哪些名字,去重复的效果。
条件查询,select关键字加上where就可以筛选出我们想要的结果了,如:select * from 表名 where name='张三' and salary>1000 and dep=10;where后面还可以跟or筛选出符合条件的信息,select * from name='张三' or name='李四' or name='王五',如果条件太多的话,这样写代码就比较累了,可以用in关键字像这样,select * from 表名 where name in(张三,李四,王五),可以选出名字和in中相同的所有人。当然相反的还有not in 用法和类似。
别名:可以给表,字段,函数,表达式取别名。加空格就可以取名字。格式要求类似Java,别名的关键字是as一般省略,能少些就少写。能不写绝不多写一个字母。
总结:where后面经常跟的关键字
	1.or 表示或
	2.and表示且
	3.四则运算符号,都行,大于等于>=,小于等于<=,不等于<>
	还可以用between and来代替where salary between 3000 and 5000;包含3000和5000
	4.is是对空置null做判断的比如 null=null返回的永远是false。
	5.is not表示除了这个的其他。
	比如说  select * from emp where name is not null;

2.0 MySQL的函数

2.1.1数学函数

1.pi()    π的值
2.floor(x)返回小于x的最大整数,也就是说把小数位去掉。 
3.count(字段名)会把这一列不为空的信息做个统计。
4.sum(字段)会把这一列数据求和。
5.ceiling(x)返回大于的最小整数
6.round(x,y)返回x的小数点y位四舍五入的值。负数的话会往相反方向走。
7. truncate(x,y)返回x的小数点y位的截取。如果是-1的话,会以小数点相反向四		舍五入 。

2.1.2聚合函数也叫分组函数

1.avg(x)求x这一列的平均数
2.sum(x)求x这一列的总和
3.min(x),max(x),最大最小值
4.count(x)返回x列不为空的行个数
5.max(x)求累加和
重点:分组函数在使用的时候,如果字段没有在分组函数中,则会报错,因为分组查询出来的结果和你的字段对应不上,一个表几行几列,你不能用分组求出来的三行,去对应一个十行的数据。比如select max(salary),name from emp group by job_id;这里的name就有问题,没有在分组函数中。这样是查不出来,匹配不上的。通过分组函数是查询不出来部门里面工资最大的那个人是谁。要用到子查询!!!
还有一个细节就是如果要把查询到的字段当为筛选条件的话,要用到having关键字,用了之后就可以筛选了 直接跟在group by 后面 连where 都不需要。如果没有这个关键字的话,他会去从你from的表中找,你原来的表中没有这个字段所有会报错

2.1.3字符串函数

1.concat(str1,str2)将字符串字段连接起来,比如concat(name,address);
2.ltrim,rtrim,trim去掉字符窜字段下的空格比如:ltrim(name)去掉name的空格
3.substring(str,x,y)截取字符串,x表示开始的位置(第一位是1),y表示截取的个数,y不写表示到结尾。
4.length返回字符串的长度

2.1.4 日期函数

1.year(date),month(date),day(date),分别取出年月日,参数类型date
2.hour(time),minutes(time),second(time),参数类型time
2.date(datetime),time(datetime).
日期格式:
date表示YYYY-MM-DD精确到天
time表示HH:mm:ss精确到秒,当只需要一天的时间时候用。
datetime表示YYYY-MM-DD HH:mm:ss 精确到秒,
timestamp当业务需要精确到毫秒时,或者该系统用于不同的分区。

3.0 子查询

有时候分组不能满足需求的时候要用到子查询,子查询一般分为两种情况。
第一种:把查询结果当做筛选条件。
比如说:要在emp表中查询出来最大工资的人是谁,分组查询显然已经不能解决这个问题了,我们可以先求出求出来最大工资,然后把最大工资当成条件,再去查询这个人是谁,应当这样写select name,salaryfrom emp where salary=(select max(salary) from emp);

这样就ok了。
这里仅仅展示了等值的,还有不等值,大于小于比较也类似,in等等。
第二种:把查询结果当做数据源
有一个需求,求平均工资最大的部门是哪个?
先要求出每个部门的平均工资,和这个部门编号,这个用分组就OK了,但是最大的呢?是不是就要在这个表里面把最大的查出来,直接加个max()不就好了吗?但是组函数不能嵌套组函数啊,所以就把这个表当做数据源,再去查最大的。代码怎么写呢!!!
像这样,select job_id,avg(salary) avg_sal(取个别名) from emp group by job_id;这个job_id分组,求出每个gob_id的平均工资,
然后在这个表里找出平均工资最高的和对应的job_id.
先找最大平均工资,select max(avg_sal) from(select job_id,avg(salary) avg_sal(取个别名) from emp group by job_id) a;
这里要注意一下,这个a是必须有的,在把零时表当做数据源的时候必须取别名,当然别名可以随便取。
在对应这个job_id要用avg_sal=这个最大工资,些在where 之后当做条件。
补充:有时候我们在建表的时候字段名字随便取的,后来发现跟其它表的名字重复了,这回引起多表联合查询的问题,这就要回去修改我们的字段名,等等一系列操作。
增加一列:alter table 表名 add 字段名 类型
删除一列:alter table 表名 drop 字段名
修改一列:alter table change 字段名 字段名 字段类型

4.0 多表查询

1.当一张表不能满足我们的需求的时候,我们需要在多张表中查询我们要找的数据,
先看两张表:
要查出来一个人是干什么工作的,因为emp表里面只有job_id,所以要到job表中去查询工作名称,所以要用到join关键字,代码如下
新写法:select name,job_name from emp join job on emp.job_id=job.id;
较早的写法:select name,job_name from emp,job where emp.job_id=job.id;
三表联合查询呢?如下
select name,job_name,dep_name from emp join job join dep on job.id=emp.job_id and dep.id=job.id
ddl表定义 data definition language
dml表操作  data manipulation language
发布了4 篇原创文章 · 获赞 2 · 访问量 596

猜你喜欢

转载自blog.csdn.net/NullPiontExcepution/article/details/83657998