• 1小时回顾MySQL语法(上)


    前言:由于工作中的原因,平时很少能写SQL. 导致现在SQL忘了差不多, 现准备写一些简单的语法,勾起自己的记忆,还有跟我一样的人,有基础,但是忘记了 (零基础不建议看哈!) 参考文献: 《SQL必知必会》

    一.简单查询

    假设有 student 表, 有 id(主键), name,age ,sex四列.

    1.查询单列

    select name from student

    2.查询多列

    列名之间使用 , 分割 最后一列后不需加 逗号

    select name,age from student

    3.查询所有列

    select * from student

    4.去重查询(去除某一列,,多次出现的结果)

    假设: student表中 两条记录的name 都为 张三 . 此时如果需要去重 则使用以下方式

    select distinct name from student

    5.限制查询的结果集 LIMIT 

    语法格式 : LIMIT start , number

    start 表示从第几行数据开始 ,(start = 0 表示从第一行开始,以此类推) 

    number 表示要显示结果条数 ,number = 3 表示显示 3 条记录

    start 非必需,如果 limit num 则表示 从第一条记录开始, 显示num行数据

    select * from student limit 1,3 # 从student表中 显示 从第二条记录开始,往后 3条的记录 , 即 显示 第 2,3,4 行记录

    6.对查询结果集排序 

    语法格式: order by 列名1,列名2 ,...  [ASC OR DESC] 

    默认排序规则是升序排列 即 ASC ,DESC 表示降序排列

    select * from student order by age # 按照年龄升序

    select * from student order by age  desc# 按照年龄降序

    select * from student order by id ,age desc# 优先按照id升序 ,再按照年龄降序

    二.条件(过滤)查询

    1.单条件查询

    Q:值何时 需要 使用 "" 引起 ? 

    A:如果值为字符串则需要使用 '' 或 "" 引起, 如果为数字类型 则不需 

    1.1 完全匹配  = 

    select * from student where name = "张三"

    1.2 不匹配  <>

    select * from student where age<> 18

    1.3 范围查询 between start and end  固定格式between  .. and ... 

    #betweent 不仅使用与数值类型 ,同样适用于 日期类型

    select * from student where age between 18 and 25

    1.4空值匹配 is null

    select * from student where age is null

    1.5非空匹配  is not null

    select * from student where age is not null

    2.多条件查询 

    多条件查询条件之间 使用  AND(表示并且)  OR (或者)进行连接

    select * from student where name = "张三"  and age = 18 # 查找 姓名为张三 并且 年龄为18的记录

    select * from student where name = "张三"  or age =  18  # 查找 姓名为张三 或者 年龄为18的记录

    *注意 : AND的优先级 大于 OR ,因此 如果存在多个条件,则需合理的使用( ) 

    3.满足范围的条件 

    ** 使用 IN 可以完成的需求,使用OR 也可以实现 ,但优先选择 IN   优点:语义清晰, 可以跟字句 ,速度更快

    select * from student where name IN ("张三","李四","王五")  # 查找姓名为 张三或李四或王五 的记录

    select * from student where name NOT IN ("张三","李四","王五")   # 查找姓名不为 张三或李四或王五 的记录

    三.通配符 与 正则查询

    1.like关键字

    %: 表示匹配任意个数的字符

    _:仅匹配一个字符

    实例:

    select * from student where name like '李%'  # 查找姓名是李开头的记录

    select * from student where name like '%阳'  # 查找姓名是阳结尾的记录

    select * from student where name like '%阳%'  # 查找姓名中包含阳的记录

    select * from student where name like '李_'  # 查找姓名为2个字,并且行李的记录

    #注意:

    1. like '%阳' 时 , 如果需要匹配以阳结尾的词,则结尾不能加 空格, 因为空格也被算进了匹配的一部分

    2.like '%' 可以匹配任意字符, 除了NULL (自带去NULL 功能,了解一下)

    3.如果其他方式可以满足的需求,尽量不使用 通配符 搜索

    4.like "%" 尽量不要以%开头,搜索会很慢

    2.regexp 关键字 

    #使用 regexp关键字后的 内容中,如果存在特殊字符,会被解释

    select * from student where name regexp  '李'  #查找name中包含 李的记录

    select * from student where name like  '李'  #查找name 为 李的记录

    #上述区别 : regexp 包含匹配, like 为完全匹配 此时 name like '李' 等价于 name = '李'

    #2.1特殊字符:

    .  : 表示任意一个字符

    $:  value$ 表示匹配以value结尾的字符

    ^ : ^value 表示匹配以value开头的字符

    | : 表示或的关系  val1 | val2 表示匹配 val1或者val2 

    [] : [123]val  []内的内容 ,任意1个都可以 即 : 1val 或 2val  或 3val   

     [123] 等价于 [1|2|3]

    [^]:查找非集中中的内容

    [0-9] : 范围匹配 ,匹配 0-9之间的任意数字

    [a-z]:匹配 a-z之间的任意字母

    [A-Z]:匹配 A-Z之间的任意字母

    #2.2 内置的规则字符集

    [:alnum:]  任意字母数字

    [:alpha:]  任意字母

    [:blank:] 空格或制表符

    [:cntrl:] ASCII 控制字符 (0-31 和 127)

    [:digit:] 任意数字

    [:print:] 任意可打印字符

    [:graph:] 任意可打印字符,不包含空格

    [:lower:] 任意小写字母

    [:upper:] 任意大写字母

    [:punct:]  非[:alnum:]  和 非 [:cntrl:] 

    [:space:]  包含空格在内的任意空白字符

    [:xdigit:] 任意十六进制数字

    使用内置规则集, 需要在规则集外再加上一层 [],否则会 按照 []的规则进行处理

    例如: select *  from student where age regexp '[[:digit:]]{2}'

    #2.3表示数量的元字符

    ? : 0 或 1次

    * :  0 或 多次

    + : 1 或 多次

    {n}:指定数目匹配

    {n,}:不少于指定数目匹配

    {n,m}:指定数目出现次数在 n - m 之间匹配 (m不超过 255)

    查找特殊字符 ,则需要取消特殊字符的含义,即转义

    使用\:  例如 \$ 取消了 $的特殊含义 ; 同理如果匹配   则需要 \

    #2.4 书写SQL完成正则简单测试

    select str regexp '规则'  # 如果匹配成功则返回1, 匹配失败返回0

    3.like 与 regexp 的区别

    like 是会匹配整个字符串 ,regexp是匹配子串

    四.计算字段 

    何时使用计算字段? 

    当存储在表中的单列字段不能满足查询的要求,需要进行额外的计算,转换,拼接才可以得到想要的效果  例如:

    如果想在查询结果中,1个字段就能显示某个公司的名字(公司地址) , 但是实际上,名字与地址 在表中是两个字段,此时就需要对字段进行拼接

    1.字段拼接 

    concat(column1,column2,str1,...)

    注意:在mysql中 字段拼接是 concat关键字 ,其他SQL语言 主要是 ||  或  + 

     select concat(name,'(',address,')') from company # 以最终查询出的字段是 name(address) 这种形式

    2.列中 空格的处理 

    rtrim(column) 忽略列右侧空格

    ltrim(column) 忽略列左侧空格

    3.对列使用别名(alias)

    关键字: as 别名 (有时也成为导出列,实质是一个东西)

    as 也可以省略,但不建议省,会影响阅读,不够直观

    select concat(name,'(',address,')')  as name_address from company

    4.字段间计算

    假设存在商品表 products ,包含 pid(产品id),pname(产品名称),price(表示单价),num(表示数量)

    需求:需要查询出所有信息的基础上, 再额外显示商品的总价格 ( 单价 * 数量)

    此时可以使用计算字段 (+ , - , * , /) 使用括号()可以改变优先级

    select *,price * num as totalCharge from products 

    5.SELECT 提供很好的测试

    如果省略 from 后面的内容,可以直接进行测试

    例如:

    select 3+5 ==> 8

    select rtrim('rye ') ==> rye

    五.函数

    函数是 mysql 内置的封装好的工具,为我们处理数据提供了遍历, 例如:rtrim()就是内置的函数

    不同DBMS的内容函数 实现差别过大,因此函数的可移植性就相对差了很多. 因此对于移植比较多的程序中,应当多写好注释;

    5.1 文本处理函数

    upper(str)  文本全部转为大写

    lower(str) 文本全部转为小写

    right(str,length) 从字符串右端开始,截取length长度个字符串 例如: select right('hello',3)  ==> llo

    left(str,length) 从字符串左端开始,截取length长度个字符串 例如: select left('hello',3)  ==> hel

    length(str) 返回字符串长度

    locate(substr,str) 返回substr 在 str 中第一次出现的 索引值 (此时索引从1开始),类似java中的indexof(sub)  例如 :SELECT locate("lo",'hello') ==> 4

    substring(str,start,lenth) 从str中返回一个子字符串 ,start表示开始位置的索引(从1开始), length表示 截取长度 ,如果length不填,则默认截到str最尾部

    5.2 日期处理函数

    5.2.0 NOW() ,CurDate() ,CurTime()

    NOW() :以 yyyy-MM-dd HH:mm:ss 格式返回当前时间

    CurDate() :yyyy-MM-dd 格式 返回当前日期

    CurTime():HH:mm:ss 格式返回当前时间

    5.2.1 AddDate

    AddDate(date,INTERVAL expr unit)  其中:date表示符合日期格式的数据 ,INTERVAL 固定写死 ,expr : 正值 或 负值   例如 :1 / -1 ,unit:时间单位,常用值有:year,month,day,hour,minute,second,非常用值需自行百度

    举个例子:

     select adddate(now(),interval 1 year)  #在当前日期的基础上 , 年+1

    select adddate(now(),interval -1 year)  #在当前日期的基础上 ,年-1

    AddDate(date,amount)   # 如果第二个参数不是上述形式, 默认是对 day 的增减    

    5.2.2 AddTime 

    AddDate(date,time) 对时间操作

    举个例子: 

    AddDate(now(),1)  #当前时间加1S

    AddDate(now(),'1:1:1')  #当前时间加 1 h ,1m,1s

    AddDate(now(),'-1:1:1')  #当前时间减 1 h ,1m,1s

    AddDate(now(),'-1:0:0')  #当前时间减 1 h ,0m,0s

    5.2.3 Date()

    返回1个时间的 日期部分 ,格式为 yyyy-MM-dd 

    select date(now())

    5.2.4 datediff(date1,date2)

    返回两个日期之间间隔的天数,天数的正负由 date1 - date2的正负号决定

    select DATEDIFF(NOW(),ADDDATE(NOW(),INTERVAL -1 YEAR))  # 365

    select DATEDIFF(NOW(),ADDDATE(NOW(),INTERVAL 1 YEAR))  # -365

    5.25 date_add(date,INTERVAL expr unit) 

     用法与addDate()第一种形式, 完全一致

    5.26 date_format(date,format)

    以自定义格式,格式化日期 date ,mysql自定的格式信息如下:

     例子:select DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')

    5.27 返回某个日期的 指定部分

    举例: 假设 now() = 2018-07-24 12:30:50

    dayofweek(date) :返回date 表示的是一周的第几天 , 返回值为: 1-7 , 对应星期值为; 周日 - 周六 ; 即如果返回 3 ,则表示那天是 周二

    year(date):返回date 的年部分  即2018

    month(date):返回date 的月份   即07

    day(date) :返回date 的天数部分  (1 -31) 即24

    hour(date) :返回date 的小时部分 即12

    minute(date):返回date 的分钟部分 即30

    second(date):返回date 的秒部分 即 50 

    date(date):返回date 的日期部分 即 2018-07-24

    time(date):返回date 的时间部分 . 即 12:30:50

    5.3 数值处理函数 

    5.3.1 abs(num) #返回一个数的绝对值

    5.3.2 mod(num1,num2) # 返回 : num1 / num2 的余数 如果 num1 < num2 则始终返回num1

    5.3.3 select PI() #返回圆周率

    5.3.4 select RAND() #返回一个随机数

    5.3.5 SELECT SQRT(num)#返回一个数的平方根

  • 相关阅读:
    由优化反射性能问题引发的思考
    Flash还能走多远?
    .net CLR 4.0垃圾回收机制的改进之3
    Silverlight 3引入了GPU加速的特性
    java 字符串
    JAVA 容器
    JAVA 反转链表
    JAVA 自定义比较器
    JAVA 类相关知识
    vscode 输出中文乱码
  • 原文地址:https://www.cnblogs.com/lzzRye/p/9342069.html
Copyright © 2020-2023  润新知