SQL语法基础知识

1. 语法

  • SQL语句不区分大小写
  • 以;分隔
  • 忽略空格
  • 支持三种注释
    ## 注释1
    -- 注释2
    /* 注释3 */
    

2.SQL语句分类

类型功能核心指令

数据定义语言(DDL)

定义数据库对象CREATEALTERDROP、USE

数据操纵语言(DML)

访问数据INSERTUPDATEDELETESELECT

事务控制语言(TCL)

管理数据库中的事务COMMITROLLBACK

数据控制语言(DCL)

控制用户的访问权限GRANTREVOKE

 3.插入insert into

 insert into语句用于向表中插入新记录,可以插入查询出来的结果

INSERT INTO user(username)
SELECT name
FROM account;

 4.分组 group by

  •  group by 为每一组返回一条记录
  • 通常伴随聚合函数的使用,如countmaxsumavg等。
  • 可以对一列或者多列进行分组
  • having用于对group by 汇总结果进行过滤

4.1 having 和 where的区别

  • where是用于过滤行的,后面不能使用聚合函数,需要在group by之前出现
  • having过滤分组,不能单独使用,在group by之后出现

5.子查询

功能位置返回数据
作为数据来源,实现多表联合查询from子句之后一般返回多行多列数据,通常为该临时表起别名
作为判断条件where子句之后单行单列、多行单列、单行多列

5.1 规则

  • 内部查询首先在其父查询之前执行
  • 子查询需要放在括号( )内。

6.连接join

  •  连接表将不同表的记录合并起来形成一张新表。这张新表只是临时的,仅存在于本次查询期间。
  • 使用on运算符将两个或更多查询的结果组合起来作为连接条件

6.1 连接中 on 和where

        on后面是连接条件,决定临时表的生成,而where在临时表生成以后,对临时表中的数据进行过滤,生成最终的结果集。

7.组合union

  • 运算符将两个或更多查询的结果组合起来
  • 所有查询的列数和列顺序必须相同
  • 数据类型必须相同或兼容
  • 返回的列名通常取自第一个查询
  • union会去重数据,如果允许重复的值,需要使用 union all

7.1 union vs join

要求结果
union列数和列顺序必须相同,数据类型必须相同或兼容垂直放置
join满足on后面的连接条件水平放置,构成一个笛卡尔积

8.函数

  • soundex() 函数用于查找在发音上相似的字符串
    SELECT *
    FROM mytable
    WHERE SOUNDEX(col1) = SOUNDEX('apple')
    
  • avg(column name)会忽略null行

  • count(column name)会忽略null行,但count(*)不会

9.视图

  • 视图是基于sql语句结果集可视化的表
  • 是虚拟的表,不能进行索引操作
  • 可以只使用实际表中的一部分数据
  • 通过只给用户访问视图的权限,可以保证数据的安全性
  • 可以更改数据格式和表示

10.索引

        索引是一种用于快速查询和检索数据的数据结构,可以大大加快 数据的检索速度。但创建索引和维护索引也需要耗费许多时间和空间。

10.1索引一定能提高查询性能吗?

        大多数情况下,索引查询能提高查询性能,但如果数据库的数据量不大,使用索引也不一定能够带来很大提升。

11.事务处理

  • 通过 set autocommit=0 可以取消自动提交,直到 set autocommit=1 才会提交;autocommit 标记是针对每个连接而不是针对服务器
  • savepoint指令用于创建保留点
  • rollback to 用于回滚到指定的保留点,若没有设置保留点,则回退到事务的起始点。
    -- 开始事务
    start transaction;
    
    -- 插入操作 A
    insert into `user`
    values (1, 'root1', 'root1', 'xxxx@163.com');
    
    -- 创建保留点 insertA
    savepoint insertA;
    
    -- 插入操作 B
    insert into `user`
    values (1, 'root2', 'root2', 'xxxx@163.com');
    
    -- 回滚到保留点 insertA
    rollback to insertA;
    
    -- 提交事务,只有操作 A 生效
    commit;
    

12.存储过程 

        存储过程可以是对一系列 SQL 操作的批处理。但阿里巴巴《Java 开发手册》强制禁止使用存储过程。因为存储过程难以调试和扩展,更没有移植性。

12.1 规则

  • 创建存储过程需要自定义分隔符,因为命令行是以;为结束符,而存储过程中也包含了分号,因此会错误把这部分分号当成是结束符
  • 包含 inout 和 inout 三种参数
  • 每次只能给一个变量赋值,不支持集合的操作
  • 给变量赋值使用 select/set语句
    drop procedure if exists `proc_adder`;
    delimiter ;;
    create definer=`root`@`localhost` procedure `proc_adder`(in a int, in b int, out sum int)
    begin
        declare c int;
        if a is null then set a = 0;
        end if;
    
        if b is null then set b = 0;
        end if;
    
        set sum  = a + b;
    end
    ;;
    delimiter ;
    
    --使用存储过程
    set @b=5;
    call proc_adder(2,@b,@s);
    select @s as sum;
    
  • 在存储过程中使用游标(相当于指针)可以对一个结果集进行移动遍历

  • 触发器是一种特殊类型的存储过程,在特定的数据库事件发生时自动执行

  • 29
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值