最新消息:这里是最新消息

mysql的常用操作笔记(关联多个表的检索)

总结笔记 benty 64浏览 0评论

mysql的常用操作笔记(关联多个表的检索)

 

之前虽然会点sql语句,大多数懵懵懂懂能看懂却又自己上不了手的,最近在工作中经常要批量添加修改用户,也算稍微有了一些心得,特此记录下来作为自己的笔记.

在数据库中插入数据

insert into 表名 [(字段1,字段2 )] values (字段1,字段2 ..), (字段1,字段2 ..), (字段1,字段2 ..)

从数据库中获取数据

select * from 表名 [可选where userid =3333];

重要的要来了,自己写这个文章就是要总结这里的知识点

从多个表中获取数据,也叫关联表

1,简单的两个表的关联

select orders.orderid, orders.amount,orders.date from customers,orderswhere customers.name= laowai and customers.customerid=orders.customerid;

这样就检索除了两个表中id一样,且customers.name为laowai的用户的order表的数据了,其实原理很简单,这里的from后面两个表中间的逗号就相当于inner into了,也叫完全关联或表的笛卡尔乘积,上面的条件等价于:

select orders.orderid, orders.amount,orders.date from customers inner join orders where customers.name= laowai and customers.customerid=orders.customerid;

其实上面也可以alias别名的,customers as a或是customers a就可以临时命名为a

同理,如果三个表关联的话也可以按照上面的方式进行写条件,到最后条件where注意写全就好了a.id=b.id and b.userid=c.userid and c.classid=d.classid这样最后就能得到自己想要的数据了.

2,左关联查找不匹配的数据

有时候我们要找没有班级的用户或是没有考试的同学,这里就用上了左关联了,格式是把inner join换成left join

注意在这里left join左匹配可以用using(userid)来替代where中的a.userid=b.userid,但是using(userid)是写在where前面的

注意left join会关联出来所有的用户,而我们现在要查找没有值的用户,所以要加一个b表的值是空的选项

select customers.customerid, customers.name from customers left join orders using(customerid) where orders.orderid is null;

这样就显示出来了匹配用户中没有订单的用户了


这里说一个以特定顺序进行排序的方法

select * from z_user order by username DESC;

上面是将user表以username字段进行倒序排序


这里是分组给id取平均值且大于50的值

select customerid ,avg(amount) from orders group by customerid having avg(amount) >50;

注意avg()平均值才可以使用group by子句(合计函数都可以count,min,max等函数)


limit限制返回条数

select name from user limit 2,3;//从第三条开始要3条数据


使用子查询,这个也比较重要

select customerid,amount from orders where

amount= (select max(amount) from orders);

//动态返回最大的数值

关联子查询

select isbn,title from books

where not exists (select * from order_items where order_items.isbn=books.isbn);

//查找所有不存在order的书


行子查询

目前介绍的所有子查询都返回单一的值,这里的查询会返回一行的

select c1,c2,c3 from t1 where (c1,c2,c3) in (select c1,c2,c3 from t2);

返回t1的三个数据(t2也有的)


使用子查询作为临时表

select * from (select customerid,name from customers where city= luoyang ) as aaa;//这个临时表名叫aaa


更新数据库记录

update 表名 set price =15元 where name= 打火机 ;


删除表中的数据

delete from 表名 where id=3;


 

 

 

下面是之前工作自己摸索的,做个记录,不一定对

 

 

//下面sql是查找在机构18中班级删除了,但是班级学生没有隐藏的,这样就不能解绑老师了
select ClassName,UserID,SubjectID,OrganID,IfDelete,IfHidden,zj_class_list.ClassID from zj_class_list,zj_class_user where zj_class_list.ClassID=zj_class_user.ClassID and OrganID=18 and IfDelete=1
//下面改善了
select IfDelete,IfHidden from zj_class_list,zj_class_user where zj_class_list.ClassID=zj_class_user.ClassID and OrganID=18 and IfDelete=1 and IfHidden=0
// 下面是操作办法(更新organid里18的数据,如果classlist的ifdelete=1删除了,那么classuser的ifhidden也隐藏设置为1)
update zj_class_user INNER JOIN (SELECT * from zj_class_list) a ON a.ClassID=zj_class_user.ClassID and a.OrganID=18 and a.IfDelete=1 and zj_class_user.IfHidden=0 SET zj_class_user.IfHidden=1

//第二部,找出删除班级了,但是organuser的status还是为1的用户

//查找删除班级了,但是organuser的status状态还是为1的用户
SELECT DISTINCT a.UserID,a.OrganID,a.`Status`
FROM `zj_organ_user` a INNER JOIN ( select OrganID,IfDelete,UserID from zj_class_list INNER JOIN zj_class_user ON zj_class_list.ClassID=zj_class_user.ClassID and OrganID=18 and IfDelete=1 )b
WHERE STATUS =1 and a.organID=b.organid AND a.UserID= b.UserID

// 然后更新字段值
update zj_organ_user a INNER JOIN (select OrganID,IfDelete,UserID from zj_class_list INNER JOIN zj_class_user ON zj_class_list.ClassID=zj_class_user.ClassID and OrganID=18 and IfDelete=1 )b
ON STATUS =1 and a.organID=b.organid AND a.UserID= b.UserID SET a.`Status`=0
之后就可以正常把教师和学生移出到培训机构了

ok,这里就已经完美解决问题了!

//在organ_user表有重复数据
SELECT a.*,b.OUID,b.status FROM zj_organ_user a,zj_organ_user b where a.UserID=b.UserID AND a.OrganID=b.OrganID and a.OUID!=b.OUID
查看
//去除重复
SELECT DISTINCT b.UserID,b.OrganID,b.`Status` FROM zj_organ_user a INNER JOIN zj_organ_user b ON a.UserID=b.UserID AND a.OrganID=b.OrganID and a.OUID!=b.OUID AND b.UserID=37363

//看了一个链接,成功执行了http://www.cnblogs.com/nzbbody/p/4470638.html
select a.ouid,a.organid,min(a.userid),a.status from zj_organ_user a,zj_organ_user b where a.userid=b.userid and a.ouid!=b.ouid and a.organid=b.organid and a.userid=b.userid group by a.userid order by a.userid DESC
//上面是查询,这里是删除操作
delete from zj_organ_user where userid=(select min(a.userid) from zj_organ_user a,zj_organ_user b where a.userid=b.userid and a.ouid!=b.ouid and a.organid=b.organid and a.userid=b.userid group by a.userid order by a.userid DESC)
//先别急,因为status可能还不一样,先把status一样的先删除了,在解决不一样的问题
select min(a.userid) from zj_organ_user a,zj_organ_user b where a.userid=b.userid and a.ouid!=b.ouid and a.organid=b.organid and a.userid=b.userid and a.status=b.status group by a.userid order by a.userid DESC
//上面是查找status一样的id,然后执行删除操作
-错误语句不要执行
delete from zj_organ_user where userid in (select minuserid from (select min(a.userid) minuserid from zj_organ_user a,zj_organ_user b where a.userid=b.userid and a.ouid!=b.ouid and a.organid=b.organid and a.userid=b.userid and a.status=b.status group by a.userid order by a.userid DESC) k)
错误语句上面


上面的先不管,最近在研究怎么批量添加用户,发现zj_user表有个ordernum学号主键难倒了,因为批量添加的时候他会自己增加,所以在批量添加就会有问题了,最近复习了mysql准备再试试,写了这样一个语句来更新自己添加的nigud帐号的ordernum

update zj_user set ordernum=(select ordernum from zj_user order by userid desc limit 1,1)+1 order by userid desc limit 1

这个语句逻辑上就是把当前userid最后的ordernum取出来然后给现在最后添加的nigud帐号的ordernum值加1,结果系统提示

You can t specify target table zj_user for update in FROM clause

这明显是报错了,百度了一下原来还是mysql不能直接调用的问题,然后自己修改了一下sql语句:

update zj_user set ordernum=(select a.* from (select ordernum from zj_user order by userid desc limit 1,1)a)+1 order by userid desc limit 1

这样就好了,原来mysql不能直接调用数据库select的数据,还需要再外面包装成一个虚拟表才可以的

转载请注明:稻香的博客 » mysql的常用操作笔记(关联多个表的检索)

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址