1,数据类型
char 字符(固定长度),varchar 也是字符(浮动长度),int 整型,float 单精度浮点型,double 双精度浮点型,date 日期(年月日),timestamp 年月日时分秒。
具体可以参考 http://www.runoob.com/mysql/mysql-data-types.html
2,结构
分为数据库,表,视图,索引。后三个都是数据库之下的。
3,语法
SQL语法又分为DML和DDL这两种,前者是增删改查的操作,如:insert update delete select。而后者是对数据库和表,视图的操作,如:use db create db 等。
这里是创建一个表的语句:
()为限制条件
create table ruoze(
id int (auto_increment//自增 primary key//主键),
name varchar(20),
age int,
......
createtime timestamp (default current_timestamp//默认增加时间戳),
creaateuser varchar(20),
updatetime timestamp (default current_timestamp on update//默认显示 更新时间 ),
updateuser varchar(20)
) ENGINE=Innodb //系统默认为Innodb可以更改成utf-8但并不建议,因为会出现兼容性等一系列问题
然后我们可以插入一条记录 insert into ruoze(id,name,age) values(1,'doudou',18)
我们在这里指定了要插入值的字段,你也可以不指定,但是就要将所有字段的值都明文写出来。
当我们要更新数据时:update ruoze set age=20 where id = 1;
这里需要指定要更新的表和更新的字段,以及我还添加了where语句作为过滤,后面我们将会学习到这些语法
最后是删除:delete from ruoze where id = 1;
这里的删除是删除记录,如果你没有使用where语句进行筛选的话将会删除整个表格中的所有记录
4,语法中的细节
-4.1 大于 小于 等于
select * from ruoze where age > 18
select * from ruoze where age < 18
select * from ruoze where age <> 18 或者 != 都是表示不等于
-4.2 模糊查询 like 根据模式进行匹配
select * from zuore where name like '%abc%'
这个句法表示的是查询name这个字段中带有abc三格英文字母的记录
select * from zuore where name like '%s'
匹配name这个字段中结尾为s的记录
select * from zuore where name like '_o%'
匹配那么这个字段中第二个字母是o的记录,_在这里是占位符的意思,代表一个字符
-4.3 排序 order by 根据某个指定的字段以某种顺序的方式进行排序,在没指定的时候为升序
select * from ruoze order by name asc;
如果你没有输入asc就默认是升序,asc也是升序,如果是降序的话就输入desc
select * from ruoze order by name asc,age desc;
这里指的是在按照name升序的同时,当name相同时对age进行降序排列
-4.4 限制多少行
select * from ruoze limit 2;
限制了输入为2行
-4.5 聚合和聚合函数 所谓的聚合就是对数据进行一些分组
我们一般使用group by依据某个字段进行分组,这个字段的值相同的被放到同一个租里面,因为使用了group by 我们就不在group by后面使用where进行条件过滤了,我们使用having,对那些满足条件的组就行保留。Ps:having是对组进行条件筛选,字段是group by的字段,而where需要你自己指定字段,是对记录进行筛选。
而聚合函数是对已经分好的组使用一个函数,将一组的数据以一条记录显示出来,如:max sum count min avg
select name,avg(age) from ruoze group by name having avg(age) > 18;
这里我们根据名字分组,显示该组内年龄的平均值,同时将平均年龄小于18的组过滤掉
-4.6 别名 我们在linux中也学习到别名,这里我们会对某些操作起一个别名,比如上面的avg(age) 这个操作在字段中是没有的,如果显示的话就是avg(age),这个名称不太好,我们可以给个别名他。
如:select name,avg(age) as age_mean from ruoze group by name having avg(age) > 18;
-4.7 上下合并两个表,这个时候表的字段类型最好相同,名称不一样的时候以第一个表为准
union和union all 第一个操作会将两个表当中相同的记录去重,而union all则保留
select name,age from a union select mingzi,nianling from b 这里的name和mingzi的数据类型最好一样,而age和nianling的数据类型也最好一样。两个合并表的字段总数也最好一样。
5,正常的格式
select depto,job,sum(sal) as sum_sal
from emp
where job is not ‘SALEMEN’
group by depto,job
having sum_sal > 3000
order by sum_sal asc
limit 100;
接下来我们用一个实例进行各种操作
假设,现在我们有一个部门表里面包含了薪水等字段,我们要求对各个部门求薪水和
select deptno,sum(sal) from emp group by deptno;
如果同时对两个字段进行分组,如:各个部门各个岗位的薪水和
select deptno,job,sum(sal) from emp group by deptno,job;
如果同时需要对薪水和小于50000的部门进行分组,这就意味着我们要过滤出大于50000的组并显示出来
select deptno,job having sum(sal) from emp group by deptno,job having sum(sal) > 50000;
当然了,有些人喜欢使用子表来做
select a.deptno,a.job,a.sum_sal from (select deptno,job,sum(sal) as sum_sal from emp group by deptno,job) as a where a.sum_sal > 50000;
这里我们将含有group by的语句的操作构建成一个临时的子表,应为是一个临时的子表所以你要给他一个别名,同样的sum(sal)这个套用了函数的字段也是一个临时的字段,我们也需要给予一个别名,然后再对这个子表进行查询操作。
6,join
join是用于将多个表通过某些字段进行链接的操作,而join由分为inner join(内链接或者等值链接),left join(左链接),right join(右链接),而一般在生产上我们都是使用做链接的,下面我们具体说明一下几个链接的不同。
我们先来看看我们的员工表是怎么样的:
然后是部门表:
这个我使用左链接,将员工表和部门表链接起来的结果,从图中我们可以看到,左表为员工表,而右表为部门表,在使用左链接的时候,左表的全部信息都被保留下来的,而右表能和左表配对的数据被保留下来的,未能配对的则不显示了。Ps:这里我们使用deptno这个字段来配对,当两个表的这个字段的值相同时就配对成功了。
这个我使用右链接,将员工表和部门表链接起来的结果,原理同上。
这个是我用内链接,将员工表和部门表链接起来的结果,就是内链接的时候没有以某一个表为准,当两个表的记录都可以相互配对的时候就被保留下来,否则都不显示。
这里我们总结一下join的语法结构:select [多个表中你想要显示的字段,要注意使用别名后各个表 . 字段的格式] from a表 as a(将a表别名为a) left join b表 as b(同理) on a.字段以某种匹配方式b.字段[这里不一定使用=的,后面我会给出一个例子]。这里还可以使用子表的形式来添加group by等语法,多表链接只需要不断地添加left join c表 as c就可以了。
下面我将员工表,部门表,工资等级表链接起来,这里我想给出工资等级表的样式:
select * from salgrade;
多表链接,以及on后面的匹配方式;
select
e.ename,e.job,e.sal,d.deptno,d.loc,s.grade
from emp as e
left join dept as d on e.deptno = d.deptno
left join salgrade as s on e.sal between s.losal and s.hisal;
显示的结果为:
这里我说明一下为什么grade都是null值,因为我们的工资都超出范围了,其中gaozong这个人还没匹配到相关的部门了。
私人提醒:在操作中我们不可避免的需要用到两个字段相加或者其他数学运算操作,如果某个字段中有null值,那么数学运算后的结果也是null,这时我们可以给这个可能有null值的字段套一层IFNULL(具体的字段,0)这个函数,函数内的两个参数是要操作的字段,和如果是null值给定的默认值。使用了这个函数在计算的时候这个字段的null将被当作0去计算。
注:图片于文字部分引用的豆总的
源地址:https://blog.csdn.net/weixin_39702831/article/details/82781614