SQL的一些用法

时间:2022-12-03 11:56:45

创建表

  • 自增ID:AUTO_INCREMENT;
  • 设置主键:PRIMARY KEY;
  • 唯一性约束:UNIQUE
  • 非空约束:NOT NULL
  • 设置默认值:DEFAULT 0
  • 当前时间戳:CURRENT_TIMESTAMP
  • 评论/注释:COMMENT
  • 如果该表已创建过,正常返回:IF NOT EXISTS

查询语法

select (distinct 去重)列表名 from 表名
where ...... 条件
group by ... 分组字段
order by ... 排序(ASC 升序 , DESC 降序)
having ... 条件(可以写多个)
limit index,pageSize 分页条件(index:起始参数 , pageSize: 要展示的条数)

1.截取函数:substring()

用法:​​SUBSTRING​​(str ,n ,m):返回字符串str从第n个字符截取到第m个字符;

2.拼接函数:concat()

用法:select concat(A,B) 或者select A || B

3.大写函数UPPER()
  • where---过滤过滤指定的行
  • having--过滤分组,与group by连用
4.连接

内联结:inner join。取两列的交集。

外联结:

  • left join。左连接,以左边表的列为主,取两列的交集,对于不在右边列存在的名称取null。
  • right join。右连接,以右边表的列为主,取两列的交集,对于不在左边列存在的名称取null。
    union--连接表,对行操作。
  • union--将两个表做行拼接,同时自动删除重复的行。
  • union all---将两个表做行拼接,保留重复的行
5.元素偏移量

数列 offset 数列

6.在mysql中,round函数用于数据的四舍五入,它有两种形式:
  • round(x,d) ,x指要处理的数,d是指保留几位小数

这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为0;

  • round(x) ,其实就是round(x,0),也就是默认d为0;
7.SUBSTRING_INDEX(str,delim,count),是一个通过特定标识符"delim"来截取子串的函数,我们日常使用频率是很高的;

delim:通过该标识符来进行截取的,delim可以为任意字符,不要为空; count:代表第几次出现;count为正数,代表从左边取标识符出现第count次之前的子串;负数则相反,从右边取标识符出现第count次之后的子串。 【'左边’代表‘前’, '右边’代表‘后’】

SQL片段(动态sql)

foreach: 动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)
<select  resultType="domain.blog.Post">
SELECT *
FROM POST P
<where>
<foreach item="item" index="index" collection="list"
open="ID in (" separator="," close=")" nullable="true">
#{item}
</foreach>
</where>
</select>
复制代码

foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符,看它多智能!

利用sql标签进行一些简单的公共抽取

<!-- 定义一个SQL片段 -->
<sql >
`user_id`, `name`, `sex`, `age`
</sql>
复制代码

在需要的时候使用​​<include​​标签

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hxstrive.mybatis.sql.demo1.UserMapper">
<!-- 映射结果 -->
<resultMap type="com.hxstrive.mybatis.sql.demo1.UserBean">
<id column="user_id" jdbcType="INTEGER" property="userId" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="sex" jdbcType="VARCHAR" property="sex" />
<result column="age" jdbcType="INTEGER" property="age" />
</resultMap>


<!-- 查询所有用户信息 -->
<select resultMap="RESULT_MAP">
select <include ref /> from `user`
</select>

</mapper>
复制代码

插入语句

插入记录的方式汇总:

  • 普通插入(全字段):INSERT INTO table_name VALUES (value1, value2, ...)
  • 普通插入(限定字段):INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...)
  • 多条一次性插入:INSERT INTO table_name (column1, column2, ...) VALUES (value1_1, value1_2, ...), (value2_1, value2_2, ...), ...
  • 从另一个表导入:INSERT INTO table_name SELECT * FROM table_name2 [WHERE key=value]
  • 带更新的插入:REPLACE INTO table_name VALUES (value1, value2, ...) (注意这种原理是检测到主键或唯一性索引键重复就删除原记录后重新插入)

删除语句

  • 根据条件删除:DELETE FROM tb_name [WHERE options] [ [ ORDER BY fields ] LIMIT n ]
  • 全部删除(表清空,包含自增计数器重置):TRUNCATE tb_name

时间差:

  • TIMESTAMPDIFF(interval, time_start, time_end)可计算time_start-time_end的时间差,单位以指定的interval为准,常用可选:
  • SECOND 秒
  • MINUTE 分钟(返回秒数差除以60的整数部分)
  • HOUR 小时(返回秒数差除以3600的整数部分)
  • DAY 天数(返回秒数差除以3600*24的整数部分)
  • MONTH 月数
  • YEAR 年数
delete pk TRUNCATE

1.DELETE 可以加where 条件,truncate 不能加

2.truncate删除,效率高一些

3.假如要删除的表中有自增长列,如果用delete 删除后,再插入数据,自增长列的值从断点开始,而truncate删除后,再插入数据,自增长列的值从1开始

4.truncate删除后没有返回值,delete 删除有返回值

5.truncate 删除后不能回滚,delete 删除可以回滚

更新语句

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值