21.Java与数据库(五)【Java学习笔记Hatter】Java开发工程师
1.having子句
进行条件判断
(1)where:是针对磁盘数据进行判断:进入到内存后,会进行分组操作,而分组结果就需要having来处理(having能做where能做的大部分事情,但where却不能做having能做的许多事情)
①分组统计的结果或者统计函数都只有having能做。
例:求出所有班级人数大于等于2的学生人数
select c_id,count(*)from student group by c_id having count(*)>=2;
②having能使用字段别名:where不能,where是从磁盘取数据,而名字只能是字段名:别名是在字段进入到内存后才产生的
select c_id,count(*) as total from student group by c_id having total>=2;
2.order by
排序:根据某字段进行升序/ 降序:依赖校对集
基本语法:order by 字段名[asc/desc]; asc是升序(默认的),desc是降序
例:group by 与order by
select * from student group by c_id;
select * from student order by c_id;
排序可以进行多字段排序:先根据某字段进行排序,然后排序好的内部,再按照某数据进行再次排序
例:多字段排序:先班级再性别排序
select * from student order by c_id,sex asc;
3.limit子句
是一种限制结果的语句:限制数量。
①用来限制长度(数据量):limit 数据量。
例:
查询学生:前两个
select * from student limit 2;
②限制起始位置,限制数量:limit起始位置,长度;
例:
查询学生:从第二条记录开始找前俩学生
select * from student limit 2,2;
主要用来实现数据的分页:为用户节省时间,提交服务器的响应效率,减少资源的浪费。
对于用户来说:可以点击的分页按钮: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;
笛卡尔积没有意义:尽量避免(交叉连接没用)
交叉连接存在意义:保证连接这种结构的完整性
②内连接(常用)
[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;
字段别名以及表别名的使用:在查询数据的时候,不同表有同名字段,这时候需要加上表名才能区分,而表名太长,通常使用别名。
例:
select * from student s join my_class mc on s.c_id=mc.id;
内连接可以没有连接条件:没有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;
在副表中没有可以匹配的记录,所以置空。
例:右连接
select * ,mc.name as mc_name from student s right join my_class mc on s.c_id=mc.id;
虽然左连接与右连接有主表差异,但是显示的结果:左表的数据在左边,右表的数据在右边。
左连接与右连接可以互转
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;
自然连接字段使用同名字段作为连接条件:连接之后会合并同名字段。
自然外连接: 左表 natural left/right join 右表;
自然左外连接
select * from student natural left join my_class;
内连接与外连接都可以模拟自然连接:使用同名字段,合并字段
左表 left /right/inner join 右表 using(字段名);
外连接模拟自然外连接
例:
select * from student left join my_class using(c_id);
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。主查询


1914篇文章