21.Java与数据库(五)【Java学习笔记Hatter】Java开发工程师

/ 厦门大学环境科学与工程学院Java开发工程师 / 2017-03-23

Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句

1.having子句

进行条件判断


(1)where:是针对磁盘数据进行判断:进入到内存后,会进行分组操作,而分组结果就需要having来处理(having能做where能做的大部分事情,但where却不能做having能做的许多事情)

①分组统计的结果或者统计函数都只有having能做。


例:求出所有班级人数大于等于2的学生人数

select c_id,count(*)from student group by c_id having count(*)>=2;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句



②having能使用字段别名:where不能,where是从磁盘取数据,而名字只能是字段名:别名是在字段进入到内存后才产生的

select c_id,count(*) as total from student group by c_id having total>=2;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句



2.order by

排序:根据某字段进行升序/ 降序:依赖校对集

基本语法:order by 字段名[asc/desc];      asc是升序(默认的),desc是降序


例:group by 与order by

select * from student group by c_id; 



Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句


select * from student order by c_id;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句



排序可以进行多字段排序:先根据某字段进行排序,然后排序好的内部,再按照某数据进行再次排序


例:多字段排序:先班级再性别排序

select * from student order by c_id,sex asc;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句


3.limit子句

是一种限制结果的语句:限制数量。

①用来限制长度(数据量):limit 数据量。


例:

查询学生:前两个

select * from student limit 2;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句


②限制起始位置,限制数量:limit起始位置,长度;


例:

查询学生:从第二条记录开始找前俩学生

select * from student limit 2,2;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句


主要用来实现数据的分页:为用户节省时间,提交服务器的响应效率,减少资源的浪费。


对于用户来说:可以点击的分页按钮:1,2,3,4

对于服务器来说:根据用户选择的页码来获取不同的数据:limit offset,length;


length:每页显示的数据量:基本不变

offset:offset=(页码-1)*每页显示量


4.连接查询

(1)将多张表进行记录的连接(按照某指定的条件进行数据拼接)

最终结果是:记录数有可能变化,字段数一定会增加(至少俩张表的合并)


意义:在用户查看数据的时候,需要显示的数据来自多张表

连接查询:join

使用方式:左表 join 右表


(2)连接查询分类

四类:内连接,外连接,自然连接与交叉连接


①交叉连接

cross join:从一张表中循环取出每一条记录,每条记录都去另外一张表进行匹配:

匹配一定保留(无条件匹配),而连接本身字段就会增加(保留),最终形成的结果叫做:笛卡尔积

基本语法:

左表 cross join 右表;==from 左表 ,右表;


例:交叉连接

--student cross join my_class;是数据源,是先连接两张表后再查询

select * from student cross join my_class;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句



笛卡尔积没有意义:尽量避免(交叉连接没用)

交叉连接存在意义:保证连接这种结构的完整性


②内连接(常用)

[inner] join,从左表中取出每一条记录,去右表中与所有的记录进行匹配:匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留。


基本语法:

左表 join 右表 on 左表.字段=右表.字段;  on表示连接条件:条件字段就是代表相同的业务含义(如student.c_id与my_class.c_id)。


例:

select * from student join my_class on student.c_id=my_class.id;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句



字段别名以及表别名的使用:在查询数据的时候,不同表有同名字段,这时候需要加上表名才能区分,而表名太长,通常使用别名。

例:

select * from student s join my_class mc on s.c_id=mc.id;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句



内连接可以没有连接条件:没有on之后的内容,系统保留所有结果(笛卡尔积)

内连接还可以使用where代替on关键字(但一般不这样做,where没有on效率高:where需要与所有数据进行匹配,而on只需要与自己对应的数据进行匹配)


③外连接(常用)

[outer] join以某张表为主,取出里面的所有记录,每条记录与另外一张表进行连接,无论能不能匹配上条件,最终都保留:能匹配,正确保留;不能匹配,其他表的字段都置空null

外连接分俩种:


left join:左外连接(左连接),以左表为主表

right join:右外连接(右连接),以右表为主表


基本语法:左表 left/right join 右表 on 左表.字段=右表.字段;


例:左连接(左表为主表:最终记录数至少不少于左表的已有数据)

select * ,mc.name as mc_name from student s left join my_class mc on s.c_id=mc.id;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句



在副表中没有可以匹配的记录,所以置空。


例:右连接

select * ,mc.name as mc_name from student s right join my_class mc on s.c_id=mc.id;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句



虽然左连接与右连接有主表差异,但是显示的结果:左表的数据在左边,右表的数据在右边。


左连接与右连接可以互转

select * ,mc.name as mc_name from my_class s right join student mc on s.c_id=mc.id;


④自然连接

natural join:自动匹配连接条件:系统以字段名在作为匹配模式(同名字段就作为条件,多个同名字段都作为条件)

自然连接可以分为自然内连接与自然外连接。


自然内连接 :左表 natural join 右表;

例:

select * from student natural join my_class;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句



自然连接字段使用同名字段作为连接条件:连接之后会合并同名字段。

自然外连接: 左表 natural left/right join 右表;


自然左外连接

select * from student natural left join my_class;


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句



内连接与外连接都可以模拟自然连接:使用同名字段,合并字段

左表 left /right/inner join 右表 using(字段名);

外连接模拟自然外连接

例:

select * from student left join my_class using(c_id);


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句



5.PHP操作mysql

(1)PHP本身操作不了mysql,但它有扩展可实现操作mysql


①Mysql扩展:纯面向过程,里面都是函数,加载扩展后可以调用函数

②Mysqli扩展:面向过程+面向对象,里面有函数也有类,加载扩展后可以选择调用函数或者调用类操作。

③POD:纯面向对象,只有类,加载后只能调用类


(2)当PHP来对mysql进行操作之后PHP的角色是mysql的一个客户端。

客户端操作服务端有必要的流程:


连接认证:mysql_connect;

发送sql获取结果:mysql_query;

解析结果集:mysql_fetch系列;

释放资源:mysql_free_result与mysql_close;

错误处理:mysql_ermo与mysql_error;


①连接认证:连接与认证

数据库链接资源mysql_connect(服务器地址包含端口,用户名,用户密码);

<?php

//PHP操作mysql基本步骤

//连接认证

$link =mysql_connect('localhost:3306','root','root');

var_dump($link);

?>


②PHP发送sql指令(等待执行结果)

③mysql服务端接收指令,执行指令,返回结果

④PHP接收结果


Mixed Mysql_query(sql指令)


Boolean结果:sql指令没有返回值,布尔结果只能代表sql语句没有语法错误,false就代表是sql语句有语法错误。主增删改查

Resource结果:结果集资源,sql指令有结果返回(show,select),结果集永远为true。主查询


Java开发初学者,Java学习经验分享,数据库,MySQL,数据库中的连接查询,PHP对mysql的操作,limit,order by语句,having语句


公众号,微信

汇鱼网海峡创乐汇
汇鱼网海峡创乐汇