MySQL----实操篇

 表内容操作: 

1、增

insert into 表 (列名,列名...) values (值,值,值...)
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)
insert into 表 (列名,列名...) select (列名,列名...) from 表
INSERT INTO 表 VALUES (DEFAULT,"xsss",DEFAULT) //如果不填写字段,values后面的所有的字段都需要填写,不需要写的,可以填default

SELECT LAST_INSERT_ID(); //返回主键

2、删

删除数据一般不使用下面的sql语句,我们使用假性删除,给每一行数据加上一个是否删除字段,删除的时候把这个字段变成0,查询的时候判断条件为1

delete from 表      #删除表中的所有的数据
delete from 表 where id=1 and name='alex'
DELETE FROM tbuser WHERE id IN (12,13)
DELETE FROM tbuser WHERE id BETWEEN 16 AND 20

3、改

UPDATE 表 set name = 'alex' where id>1
UPDATE employee SET dept = dept+1 WHERE id = 1;  //对数据库中的dept字段自增1

4、查

select * from 表              
select * from 表 where id > 1
select nid,name,gender as gg from 表 where id > 1

SELECT COUNT(*) FROM t_user WHERE username="yy";  //返回查询的数目
SELECT * FROM logininfo LIMIT 4,10;               //第5行数据开始一个10条数据 limit 4,-1(最后一行),如果数据不够10条,直接返回实际的数目

4.1子查询

SELECT 
  *,
  (SELECT 
    ordername 
  FROM
    u_order 
  WHERE t_user.`order_id` = u_order.`id`) AS ordername    //根据t_user.order_id 来关联查询的
FROM
  t_user ;

5、其他

a、条件
    select * from 表 where id > 1 and name != 'alex' and num = 12;
 
    select * from 表 where id between 5 and 16;
 
    select * from 表 where id in (11,22,33)
    select * from 表 where id not in (11,22,33)
    select * from 表 where id in (select nid from 表)
 
b、通配符
    select * from 表 where name like 'ale%'  - ale开头的所有(多个字符串)
    select * from 表 where name like 'ale_'  - ale开头的所有(一个字符)
 
c、限制
    select * from 表 limit 5;            - 前5行
    select * from 表 limit 0,5           - 钱5行(从第0行开始),和limit 5 一样
    select * from 表 limit 4,5;          - 从第4行开始的5行
    select * from 表 limit 5 offset 4    - 从第4行开始的5行
 
d、排序
    select * from 表 order by 列 asc              - 根据 “列” 从小到大排列
    select * from 表 order by 列 desc             - 根据 “列” 从大到小排列
    select * from 表 order by 列1 desc,列2 asc    - 根据 “列1” 从大到小排列,如果相同则按列2从小到大排序
    ORDER BY colum asc IF(ISNULL(colum),0,1) //null被强制放在最前,不为null的按声明顺序[asc|desc]进行排序
   ORDER BY colum asc IF(ISNULL(colum),1,0) //null被强制放在最后,不为null的按声明顺序[asc|desc]进行排序
 
e、分组
    select num from 表 group by num
    select num,nid from 表 group by num,nid
    select num,nid from 表  where nid > 10 group by num,nid order nid desc
    select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid
 
    select num from 表 group by num having max(id) > 10
 
    特别的:group by 必须在where之后,order by之前
 
f、连表
    无对应关系则不显示
    select A.num, A.name, B.name
    from A,B
    Where A.nid = B.nid
 
    无对应关系则不显示
    select A.num, A.name, B.name
    from A inner join B
    on A.nid = B.nid
 
    A表所有显示,如果B中无对应关系,则值为null
    select A.num, A.name, B.name
    from A left join B
    on A.nid = B.nid
 
    B表所有显示,如果B中无对应关系,则值为null
    select A.num, A.name, B.name
    from A right join B
    on A.nid = B.nid
 
g、组合
    组合,自动处理重合
    select nickname
    from A
    union
    select name
    from B
 
    组合,不处理重合
    select nickname
    from A
    union all
    select name
    from B

 

示例

       

  计算每一个同学的总成绩从大到小排名(显示字段有name,总成绩)

    不加DESC,默认从小到大排序(ASC)

SELECT NAME,SUM(score) AS t FROM u GROUP BY NAME ORDER BY t DESC

  计算每一个同学的最高成绩(显示字段有name,总成绩)

SELECT NAME,MAX(score) AS t FROM u GROUP BY NAME

 

 

示例

  需求,A表关联了B表,如果给A表插入数据

  就按照正常的逻辑插入数据,但是如果插入的id在B表中找不到,就会报错

INSERT INTO employee(NAME,dept) VALUE("小明",1); //1是B表的id

 

示例

  关联表的问题,如果from表的时候取了别名,后面只能使用 别名.id

SELECT * FROM realauth AS r  LEFT JOIN logininfo ON r.`applier_id` = logininfo.`id`

 

示例

  一张表关联多张表

SELECT r.id,ap.id AS ap_id,ap.username,au.id AS au_id,au.username FROM realauth AS r LEFT JOIN logininfo AS ap ON r.`applier_id` = ap.`id` LEFT JOIN logininfo AS au ON r.`auditor_id` = au.`id`

 

示例

  查出字段不为空和为空的数据

SELECT * FROM userfile WHERE fileType_id IS NOT NULL;
SELECT * FROM userfile WHERE fileType_id IS NULL;

 

示例

    <select id="getClientSchedules" resultMap="CourseScheduleMap">
        SELECT cs.id as scheduleId,ci.courseName,tch.userName teacherName,sv.venueName,sc.campusName,
        cs.weekTimes,cs.beginTimes,cs.endTimes,cs.rebuildLim,cs.genderLim,cs.totalLim,cs.lastLim,
        cs.totalCount,cs.maleScale,cs.maleCount,cs.femaleScale,cs.femaleCount,stime.`shortName` beginTimesShortName,etime.`shortName` endTimesShortName
        FROM (select * from course_schedule where status = 1 and schoolId = #{schoolId}
        <if test="courseId != null">
            and courseId = #{courseId}
        </if>
        <if test="teacherId != null">
            and teacherId = #{teacherId}
        </if>
        <if test="beginTimes != null">
            and beginTimes = #{beginTimes}
        </if>
        <if test="endTimes != null">
            and endTimes = #{endTimes}
        </if>
        <if test="weekTimes != null">
            and weekTimes = #{weekTimes}
        </if>
        <if test="rebuildLim != null and rebuildLim==2">
            and (rebuildLim = 0 or rebuildLim = 2)
        </if>
        <if test="rebuildLim != null and rebuildLim==1">
            and (rebuildLim =0 or rebuildLim = 1)
        </if>
        ) cs
        LEFT JOIN user_info tch ON cs.teacherId= tch.id
        LEFT JOIN course_info ci ON cs.courseId=ci.id
        LEFT JOIN school_venue sv ON cs.venueId = sv.id
        LEFT JOIN school_campus sc ON sv.campusId = sc.id
        LEFT JOIN school_year sy ON cs.yearId = sy.id
        LEFT JOIN school_times_info stime ON stime.`times` = cs.`beginTimes` and stime.status=1 and cs.schoolId= stime.schoolId
        LEFT JOIN school_times_info etime ON etime.`times` = cs.`endTimes` and etime.status=1 and cs.schoolId= etime.schoolId
        LEFT JOIN course_schedule_depart dep ON cs.id= dep.scheduleId
        LEFT JOIN course_schedule_major maj ON cs.id= maj.scheduleId
        LEFT JOIN (select * from user_info where id = #{stuId}) stu ON cs.schoolId= stu.schoolId
        LEFT JOIN school_class scl ON stu.classId= scl.id and scl.status=1
        LEFT JOIN course_class_selection ccs ON ccs.classId = stu.classId

        where sy.isThisYear=1 and (dep.departId is null or dep.departId=stu.departmentId)
        and (maj.majorId is null or maj.majorId=stu.majorId)
        and (ccs.id is null or (cs.weekTimes=ccs.weekTimes and cs.beginTimes>=ccs.beginTimes and ccs.endTimes>=cs.endTimes))
        and ((stu.userSex=0 and  genderLim!=1) or (stu.userSex=1 and  genderLim!=2))
    </select>

 

获取数据库中时间的后几天

语法结构

DATE_SUB(date,INTERVAL expr type)
DATE_ADD(date,INTERVAL expr type)
select * from table where date_sub('2019-04-03',INTERVAL  1 year);
SELECT DATE_ADD(weekBegin,INTERVAL 1 DAY) FROM school_week WHERE WEEK>=1 AND WEEK<=4 AND yearId=22
SELECT DATE_SUB(weekBegin,INTERVAL -1 DAY) FROM school_week WHERE WEEK>=1 AND WEEK<=4 AND yearId=22

比较时间(更多参考:https://www.cnblogs.com/Darkqueen/p/9264087.html)

https://blog.csdn.net/qq_23375733/article/details/88533006

    select
    *
    from attend_record
    where status = 1 and schoolId=#{schoolId} and stuId = #{stuId}  and unix_timestamp(#{signInTime})> unix_timestamp(signInTime)

 

 

查询重复数据

1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。

select Email from Person group by Email having count(Email) > 1

 

查询id最大的一条数据

select * from table where id=(select MAX(id) from table where xx)

SELECT * FROM 表名 ORDER BY id DESC LIMIT 0,1

  

 

分数排名

  题目:letcode算法(https://leetcode-cn.com/problems/rank-scores/

  下面这个应该只能支持mysql8.x

SELECT Score,
dense_rank() over(order by Score desc) as 'Rank'
FROM Scores

  方式2

select

a.score as Score,

count(DISTINCT b.score) AS Rank # 统计b表符合条件的不重复的分数的数量作为排名

FROM scores a join scores b

where b.score >= a.score # 条件是这个分数不小于我,因为a、b表数据相同,所以排名值最小是1

group by a.id # a表中每个数据都进行排名

order by a.score DESC # 最后按分数(跟排名一样)降序排列

 

获取薪水表中第二高的薪水

  题目:letcode算法(https://leetcode-cn.com/problems/second-highest-salary/comments/)

  思路1:从大到小排序,取第二

#方式1
select distinct salary from Employee order by salary desc limit 1,1
#优化[如果不存在结果,返回null]
select (select distinct salary from Employee order by salary desc limit 1,1) as SecondHighestSalary

  思路2:不是最大数的最大数

SELECT max(Salary) SecondHighestSalary
 FROM Employee  
where Salary != (select max(Salary) from Employee ); 

 

换座位

  题目:https://leetcode-cn.com/problems/exchange-seats/

  思路:直接调换id,然后再进行排序【直接对查询出来的ID进行加减操作,变换ID的顺序】

SELECT (CASE 
            WHEN MOD(id,2) = 1 AND id = (SELECT COUNT(*) FROM seat) THEN id
            WHEN MOD(id,2) = 1 THEN id+1
            ElSE id-1
        END) AS id, student
FROM seat
ORDER BY id;

 

查询一张表中状态0的数量和状态1的数量

select DJZT,count(1) as num from  XM_ZLWT_JCJLMX group by DJZT;

  

树形结构表的查询

使用sql语句,构建树

  缺点,无法构建不确定层级的树

<mapper namespace="com.aepcmis.ht.jc.mapper.BkdyMapper">
    <resultMap id="BaseResultMap" type="com.aepcmis.common.entity.Tree">
        <id column="BKDY_PKID" jdbcType="VARCHAR" property="id"/>
        <result column="BKDY_PPKID" jdbcType="VARCHAR" property="pid"/>
        <result column="BKMC" jdbcType="VARCHAR" property="text"/>
        <collection property="children" ofType="com.aepcmis.common.entity.Tree">
            <id column="BKDY_PKID2" jdbcType="VARCHAR" property="id"/>
            <result column="BKDY_PPKID2" jdbcType="VARCHAR" property="pid"/>
            <result column="BKMC2" jdbcType="VARCHAR" property="text"/>
        </collection>
    </resultMap>
    <select id="queryTree" resultMap="BaseResultMap">
SELECT
   b1.BKDY_PKID,
   b1.BKDY_PPKID,
   b1.BKMC,

   b2.BKDY_PKID as BKDY_PKID2,
   b2.BKDY_PPKID as BKDY_PPKID2,
   b2.BKMC as BKMC2
FROM
   HT_JC_BKDY b1 left join  HT_JC_BKDY b2 on b1.BKDY_PKID = b2.BKDY_PPKID
WHERE B1.BKDY_PPKID is null
</select> 
</mapper>

将list查询出来递归构建树

public List<TreeNode> transDepartment(List<Qydy> rootList){
        List<TreeNode> nodeList = new ArrayList<>();
        for (Qydy qydy : rootList) {
            TreeNode treeNode = new TreeNode();
            treeNode.setId(qydy.getQYDY_PKID());
            treeNode.setText(qydy.getQYMC());
            treeNode.setAttributes(qydy);
            //表明是一级父类
            if (1==qydy.getCJ()){
//                treeNode.setState("open");
                nodeList.add(treeNode);
            }
            treeNode.setChildren(setChild(treeNode.getId(),rootList));
        }
        return nodeList;
    }
    public List<TreeNode> setChild(String id, List<Qydy> list ){
        List<TreeNode> childList = new ArrayList<>();
        for (Qydy qydy : list) {
            TreeNode treeNode = new TreeNode();
            if (id!=null && id.equals(qydy.getQYDY_PPKID())){
                treeNode.setId(qydy.getQYDY_PKID());
                treeNode.setText(qydy.getQYMC());
                treeNode.setParentId(id);
                treeNode.setState("close");
                treeNode.setAttributes(qydy);
                childList.add(treeNode);
            }
        }
        for (TreeNode department : childList) {
            List<TreeNode> treeNodes = setChild(department.getId(), list);
            if (treeNodes.size()>=1){
                department.setState("close");
            }
            department.setChildren(treeNodes);
        }
        return childList;
    }

  

删除树

@Override
    public void DelByPid(List<String> objects) {

        //1 创建list集合,用于封装所有删除菜单id值
        List<String> idList = new ArrayList<>();
        //2 向idList集合设置删除菜单id
        for (String id:objects){
            //把当前id封装到list里面
            idList.add(id);
            this.selectPermissionChildById(id,idList);
        }
        qydyMapper.deleteBatchIds(idList);
    }

    private void selectPermissionChildById(String id, List<String> idList) {
        //查询菜单里面子菜单id
        QueryWrapper<Qydy>  wrapper = new QueryWrapper<>();
        wrapper.eq("QYDY_PPKID",id);
        wrapper.select("QYDY_PKID");
        List<Qydy> childIdList = qydyMapper.selectList(wrapper);
        //把childIdList里面菜单id值获取出来,封装idList里面,做递归查询
        childIdList.stream().forEach(item -> {
            //封装idList里面
            idList.add(item.getQYDY_PKID());
            //递归查询
            this.selectPermissionChildById(item.getQYDY_PKID(),idList);
        });
    }

  

统计各班级男女生人数

select banji,count(1) 班级人数,sum(case when xingbie='1' then 1 else 0 end ) 男生人数,sum(case when xingbie='2'  then 1 else 0 end ) 女生人数
from biyelunwen_xuesheng
group by banji

  

posted @ 2019-03-13 09:00  小名的同学  阅读(341)  评论(0编辑  收藏  举报