mysql内置函数
https://www.runoob.com/mysql/mysql-functions.html
表内容操作:
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
IFNULL
SELECT a.`id`, a.`name`, b.`id`, IFNULL(b.`name`,'/') //如果查询为null,可以设置一个默认值 FROM tb_content_category AS a LEFT JOIN tb_content_category AS b ON a.`parent_id` = b.`id`
EXISTS和Insert配合使用
有问题?参考:https://www.cnblogs.com/chucklu/p/10482311.html
IF NOT EXISTS (SELECT * FROM logininfo WHERE username="stdf") BEGIN INSERT INTO logininfo(username,PASSWORD) VALUES("xx","xx") END
(执行student.length次)对于下面的sql语句首先执行的语句是select * from student s,在根据表的每一条记录,执行以下语句(EXISTS(select stuid from score ss where ss.stuid = s.stuid)),依次去判断where后面的条件是否成立:如果成立则返回true不成立则返回false。如果返回的是true的话,则该行结果保留,如果返回的是false的话,则删除该行,最后将得到的结果返回
select * from student s where EXISTS(select stuid from score ss where ss.stuid = s.stuid)
<insert id="insertSelection" parameterType="net.microcarystal.sport.pojo.master.CourseStudentSelection"> <selectKey keyProperty="id" order="AFTER" resultType="long"> select LAST_INSERT_ID(); </selectKey> insert into course_student_selection <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null"> id, </if> <if test="status != null"> status, </if> <if test="schoolId != null"> schoolId, </if> <if test="stuId != null"> stuId, </if> <if test="yearId != null"> yearId, </if> <if test="courseId != null"> courseId, </if> <if test="scheduleId != null"> scheduleId, </if> <if test="sportStageId != null"> sportStageId, </if> <if test="sportItemId != null"> sportItemId, </if> <if test="updateTime != null"> updateTime, </if> <if test="createTime != null"> createTime, </if> <if test="createUser != null"> createUser, </if> <if test="updateUser != null"> updateUser, </if> </trim> select <trim suffixOverrides=","> <if test="id != null"> #{id,jdbcType=BIGINT}, </if> <if test="status != null"> #{status,jdbcType=INTEGER}, </if> <if test="schoolId != null"> #{schoolId,jdbcType=BIGINT}, </if> <if test="stuId != null"> #{stuId,jdbcType=BIGINT}, </if> <if test="yearId != null"> #{yearId,jdbcType=BIGINT}, </if> <if test="courseId != null"> #{courseId,jdbcType=BIGINT}, </if> <if test="scheduleId != null"> #{scheduleId,jdbcType=BIGINT}, </if> <if test="sportStageId != null"> #{sportStageId,jdbcType=BIGINT}, </if> <if test="sportItemId != null"> #{sportItemId,jdbcType=BIGINT}, </if> <if test="updateTime != null"> #{updateTime,jdbcType=TIMESTAMP}, </if> <if test="createTime != null"> #{createTime,jdbcType=TIMESTAMP}, </if> <if test="createUser != null"> #{createUser,jdbcType=BIGINT}, </if> <if test="updateUser != null"> #{updateUser,jdbcType=BIGINT}, </if> </trim> from DUAL where 1=(SELECT count(1) FROM course_schedule a left join user_info b on b.id=#{stuId} left join course_student_selection c on c.stuId=b.id and c.scheduleId = a.id and c.`status`=1 WHERE c.id is null and a.id = #{scheduleId} and a.lastLim>0 and (a.genderLim!=3 or (a.genderLim=3 and b.userSex=0 AND (femaleScale-femaleCount)>0) or (genderLim=3 AND b.userSex=1 AND (maleScale-maleCount)>0))) </insert>
mysql> ->INSERT INTO test_book1 -> SELECT 1, 'TEST', 'ABC' FROM dual -> WHERE NOT EXISTS( SELECT 1 FROM test_book1 WHERE id = 1);
IN
(只执行一次),in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。
首先会执行from语句找出student表,然后执行 in 里面的子查询,再然后将查询到的结果和原有的user表做一个笛卡尔积,再根据我们的student.stuid IN score.stuid的条件,将结果进行筛选(既比较stuid列的值是否相等,将不相等的删除)。最后,得到符合条件的数据。
select * from student s where s.stuid in(select stuid from score ss where ss.stuid <1005)
in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
Unique
首先建表的时候给name设置为unique
不存在则插入,存在则更新(on duplicate key update)
如果数据库中有一条数据name = “jack”(因为name设置了unique,插入数据会造成冲突),那么我们继续update操作,更新年龄是19,否则就正常插入操作
INSERT INTO `student`(`name`, `age`) VALUES('Jack', 19) ON DUPLICATE KEY UPDATE `age`=19;
先删除旧数据再插入最新的数据(replace into)
REPLACE INTO `student`(`name`, `age`) VALUES('Jack', 18);
避免重复插入(insert ignore into)
INSERT IGNORE INTO `student`(`name`, `age`) VALUES('Jack', 18);
Group By
group By 和聚合函数:https://blog.csdn.net/u014717572/article/details/80687042
当使用group By的时候,sql首先执行Group 在进行条件判断,如果希望group By的时候对某些字段不进行group By可以在条件中进行判断
比如:这种startYear=2019的数据就不会查出来
SELECT * FROM school_year WHERE STATUS = 1 AND schoolId = 1 AND (startYear != 2019) GROUP BY startYear ORDER BY startYear DESC
我们就可以使用or方法并添加条件来将startYear的数据查询出来
SELECT * FROM school_year WHERE STATUS = 1 AND schoolId = 1 AND (startYear != 2019 OR isThisYear=1) GROUP BY startYear ORDER BY startYear DESC
Case
如果字段中没有#{},比如genderLim,就会从数据库中的字段来查
And (CASE genderLim WHEN 1 THEN #{userSex} = 1 WHEN 2 THEN #{userSex} = 0 ELSE 1=1 END)
select a.id as id, d.courseName as courseName, (case b.weekTimes when 1 then '星期一' when 2 then '星期二' when 3 then '星期三' when 4 then '星期四' when 5 then '星期五' when 6 then '星期六' when 7 then '星期日' else null end) as weekTimes, b.beginTimes as beginTimes, from attend_calendar
IF
IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false
and if((`v`.`rangeTYPE`= '2'),(`v`.`rangeID`= `s`.`SCHOOL_ID`),(`v`.`parentId`= `s`.`SCHOOL_ID`))
concat
可以将返回的字段进行拼接
SELECT CONCAT(user_info.`userCode`,'-',user_info.`userName`) AS userCodeAndUserName FROM user_info WHERE user_info.`status`=1 AND user_info.`userType`=2 AND schoolId=1 LIMIT 0,20
update关联
update course_schedule set totalCount = totalCount+1, lastLim = lastLim-1, maleCount = maleCount + (select ifnull(count(*),0) as maleCount from user_info where id=#{stuId} and userSex=1), femaleCount = femaleCount + (select ifnull(count(*),0) as maleCount from user_info where id=#{stuId} and userSex=0) where id = #{scheduleId,jdbcType=BIGINT}
正则
select * from tb where name regexp ’z’;
on和where的用法
无论LEFT JOIN ON后面什么条件,都不影响主表数据被查询数来(只是关联表没有数据而已)
参考:https://www.cnblogs.com/FENGXUUEILIN/p/10040025.html
SELECT stu.* FROM student stu LEFT JOIN grade gra on stu.id = gra.c_stuId WHERE gra.c_fs is NOT null
执行顺序
Where, Group By, Having, Order by
Insert into
https://www.w3school.com.cn/sql/sql_select_into.asp
- 把某些字段插入新表
SELECT colum1,colum2 INTO new_table FROM SYS_BUSINESS_SEQNUM
- 如果在函数里面,可以查询的数据赋值到另一个数据
iseqnum :=1; SELECT SEQNUM INTO iseqnum FROM SYS_BUSINESS_SEQNUM