精华内容
下载资源
问答
  • MYSQL语法

    千次阅读 2018-08-02 21:11:52
    1. 概述 本文对常用SQL语法进行总结,包括以下部分: 数据库创建、删除、查看语法 表创建、删除、查看...mysql -u root -p password 登入数据库,没有切换到任何数据库,才可以执行操作数据库的操作 // 显示...

    1. 概述

    本文对常用SQL语法进行总结,包括以下部分:

    1. 数据库创建、删除、查看语法
    2. 表创建、删除、查看语法
    3. 视图创建、删除、查看语法
    4. 触发器创建、删除、查看语法
    5. 各种查询操作语法
    6. 索引创建、删除、查看语法
    7. 权限创建、删除、查看语法

    2. 数据库语法

    mysql -u root -p password 登入数据库,没有切换到任何数据库,才可以执行操作数据库的操作

    // 显示所有数据库
        show databases;
    
    // 创建数据库
        -- create database 数据库名 charset=utf8;
        create database python04new charset=utf8;
        CREATE DATABASE `ihbs` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
    
    // 查看创建数据库的语句
        -- show create database `数据库名`;
        show create database python04;
    
    // 删除数据库
        -- drop database 数据库名;  drop database if exists `数据库名`;
        DROP DATABASE IF EXISTS `ihbs`;
    
    //使用数据库
        --use 数据库的名字
        use python02new;
    
    // 查看当前使用的数据库
        select database();  # function

    3. 表语法

    3.1. 创建表

    create table 表名(
      列名12类型 [完整性约束条件],
      列名22类型 [完整性约束条件],
      ……
    )ENGINE = myisam|innodb default charset = utf8|gbk|latin1;
    
        -- auto_increment表示自动增长
        -- not null 表示不能为空
        -- primary key 表示主键
        -- default 默认值
        -- enum 枚举
    
        -- create table 数据表名字 (字段 类型 约束[, 字段 类型 约束]);
    
    
    
    eg:
    
    create table zzzz(
        id int primary key not null auto_increment,
        name varchar(30)   # 最后一个末尾不能加 ',' 逗号, 否则会报错
    );
    
    create table students(
            id int unsigned not null auto_increment primary key,
            name varchar(30),
            age tinyint unsigned default 0,
            high decimal(5,2),
            gender enum("男", "女", "中性", "保密") default "保密",
            cls_id int unsigned
        );ENGINE=InnoDB default charset=utf8
    
    

    3.2. 查看表结构

    //查看该表的结构
    desc 表名  --> describe 表名
    show create table 表名;
    
    //查看表的创建信息
    show create table students;

    3.3. 设置表的主键

    单字段主键

    create table table2(
      stu int PRIMARY key,
      name VARCHAR(30)
    );

    多字段主键

    create table  table2(
      stu int ,
      name VARCHAR(30),
      primary key (stu,name)
    );

    3.4. 完整性约束条件

    • 主键:primary key
    • 外键:foreign key
      • 语法:constraint 外键别名 foreign key(属性1,属性2,…) references 表名(属性1,属性2) 依赖数据库中已存在表的主键,可以为空
      • // 删除表的外键约束
      • 语法:alter table 表名 foreign key 外键别名
    • 非空:not null
      • 语法:属性名 数据类型 not null
    • 唯一性:unique
      • 语法:属性名 数据类型 unique
    • 自增:Auto_increment
      • 语法:属性名 数据类型 auto_increment 一个表只能有一个字段使用auto_increment,且为主键一部分任何整数(默认从1开始自增)
    • 默认值:default
      • 语法:属性名 default 默认值
    • 提示: comment
      • 语法: comment ‘提示语’

    完整demo

    create table if not exists test(
        id int PRIMARY key auto_increment COMMENT '主键,自增',
        name VARCHAR(30) UNIQUE COMMENT '唯一性约束',
        sex int DEFAULT 1 COMMENT '设置默认值',
        dsc VARCHAR(256) not null  COMMENT '非空',
        forid int COMMENT '和table2表的stu进行外键约束',
        constraint forkey FOREIGN KEY(forid) references  table2(stu) 
       );

    3.5. 修改表

    // 修改表名:
      alter table 旧表名 RENAME [to] 新表名
    
    // 添加列
    alter table 表名 add 属性名 属性类型 [完整性约束条件] [First | After 属性名]
        alter table 表名 add 属性名 属性类型 after 某列名(指定添加到某列后)
        alter table 表名 add 属性名 属性类型 first;(把新列加到最前面)
    
    // 删除列
    alter table 表名 drop 属性名
    
    // 修改列
    alter table 表名 modify  属性名  属性类型;
    
    // 修改列名及列类型:
    alter table 表名 change 旧属性名 新属性名 新类型;
    
    // 修改字段的排列顺序
    alter table 表名 modify 属性1 数据类型 first | after 属性2
    
    // 修改表的存储引擎
    alter table 表名 engine = 存储引擎名
    
    

    注意
    字段改名后,完整性约束条件丢失

    // 以下修改后,约束条件还在
    alter table teacher change num t_id not null unique 
    // 以下修改后,t_id约束条件丢失
    alter table teacher change num t_id
    结论:属性改名时,必须在语句中加上原来的完整性约束条件12345

    3.6 删除表

    // 删除没有被关联的表
    drop table 表名
    // 删除被其他表关联的表
    先删除外键约束: alter table 表名2 drop foreign key 外键别名
    再删除表:drop table 表名12345

    4. 数据–增删改查(curd)

    • curd的解释:

      • 创建(Create)
      • 更新(Update)
      • 读取(Retrieve)
      • 删除(Delete)
      增加 
      -- 全列插入: 值的顺序与表中字段的顺序对应
      //insert [into] 表名 values(...)
      //主键字段 主键列是自动增长,但是在全列插入时需要占位,通常使用0或者 default 或者 null 来占位,插入成功后以实际数据为准
      
      insert into students values(0,’郭靖‘,1,'蒙古','2016-1-2');
      
      
      -- 部分列插入:值的顺序与给出的列顺序对应
      // 如果有默认值,系统自动填默认值; 没有填 null
      
      insert into students(name,hometown,birthday) values('黄蓉','桃花岛','2016-3-2');
      insert into student(name,age) values("you",18);
      
      
      -- 多行插入: 一次性插入多行数据
      // 各个记录之间用 逗号隔开 (), ()
      //全列多行插入:值的顺序与给出的列顺序对应
      insert into classes values(0,'python1'),(0,'python2');
      insert into students(name) values('杨康'),('杨过'),('小龙女');
      删除 delete from  ... where ... 
        -- 物理删除
        -- delete from 表名 where 条件
      
        delete from students; -- 整个数据表中的所有数据全部删除
        delete from students where name="小李飞刀";
      
      uadate CLASS set FIELD CONSTRAIT  where 哪些行
        -- 逻辑删除
        -- 用一个字段来表示 这条信息是否已经不能再使用了
        -- 给students表添加一个is_delete字段 bit 类型
      
        alter table students add is_delete bit default 0;
        update students set is_delete=1 where id=6;
      修改
      --update 表名 set 列1=值1,列2=值2... where 条件;
            update students set gender=1; -- 全部都改
            update students set gender=1 where name="小李飞刀"; -- 只要name是小李飞刀的 全部的修改
      
            update students set gender=1 where id=3; -- 只要id为3的 进行修改
            update students set age=22, gender=1 where id=3; -- 只要id为3的 进行修改
      
      查询基本使用   
          select 字段 from 表名  --> 查看 哪些字段  从 哪个表
            -- 查询所有列
            -- select * from 表名;
            select * from students;
      
            ---定条件查询
            select * from students where name="小李飞刀"; -- 查询 name为小李飞刀的所有信息
            select * from students where id>3; -- 查询 name为小李飞刀的所有信息
      
      
            -- 查询指定列
            -- select 列1,列2,... from 表名;
            select name,gender from students;
      
      
            -- 可以使用as为列或表指定别名
            -- select 字段[as 别名] , 字段[as 别名] from 数据表 where ....;
            select name as 姓名,gender as 性别 from students;
      
      
            -- 字段的顺序
            select id as 序号, gender as 性别, name as 姓名 from students;
    // 插入数据
    insert into 表名(属性名1,属性名2,...) values(值1,值2,...),[(值1,值2,...)...]
    // 将查询结果插入到表中
    insert into 表名1(属性列表1) select 属性列表2 from 表名 where 条件表达式
    //  更新数据
    update 表名  set 属性1=值1, 属性2=值2,.... where 表达式
    //  删除数据
    delete from 表名[ where 表达式]

    5. 视图语法

    5.1. 概述

    视图简介:

    1. 虚拟表
    2. 数据库只存放定义,并没有存放视图中数据,存放在原来表中;使用视图查询数据时,数据库系统会从原来表中取出对应数据

    视图作用

    • 操作简便
    • 增加数据安全性
    • 提高表的逻辑独立性

    5.2. 视图和表区别和联系

    区别

    • 视图时按照sql语句生成的一个虚拟的表
    • 视图不占用实际的物理空间,而表中的记录需要占用物理空间
    • 建立和删除视图只影响视图本身,不影响实际记录,而建立 和删除表会影响实际记录

    联系

    • 视图是在基本表上建立的表,其字段和记录都来自基本表,其依赖基本表而存在
    • 一个视图可以对应一个基本表,也可以对应多个基本表
    • 视图是基本表的抽象,也可以对应多个基本表

    5.3. 创建视图

    必须拥有创建视图权限(Create View权限)

    // 语法
    create [Algorithm={Undefined|Merge|Temptable}] 
    View 视图名[(属性列表)]
    As select 语句
    [With [Cascaded | Local]] check option];
    Algorithm:
        Undefined:mysql默认算法
        Merge:将使用视图的语句与视图定义合并起来,使得视图定义某一部分取代语句对应部分
        TempTable:将视图结果存入临时表,然后临时表执行语句
    Withcascaded:更新视图时要满足所有相关视图和表条件(默认)
        Local:更新视图时需要满足视图本身的定义条件即可
    
    // 在单表上创建视图
    create view v_appuser As SELECT * from qappuser
    
    // 在多表上创建视图
    create ALGORITHM=MERGE view v_appuser2
    As SELECT a.* from qappuser as a, qappfunction as b
    WITH LOCAL check option;
    
    // 查看视图
    DESC v_appuser;
    describe v_appuser2;
    show table status like 'v_appuser';
    show create view  v_appuser;
    SELECT * from information_schema.VIEWS;
    12345678910111213141516171819202122232425262728

    5.4 修改视图

    // 修改视图:Create or Replace语法
    Create or Replace  [Algorithm={Undefined|Merge|Temptable}] 
    View 视图名[(属性列表)]
    As select 语句
    [With [Cascaded | Local]] check option];
    说明:不存在时创建视图,存在时,则修改视图
    
    // 修改视图:Alter语法
    Alter  [Algorithm={Undefined|Merge|Temptable}] 
    View 视图名[(属性列表)]
    As select 语句
    [With [Cascaded | Local]] check option];
    说明:使用alter时,视图名必须存在12345678910111213

    5.5. 更新视图数据

    // 创建测试视图
    CREATE  
    View  v_appuser
    As  SELECT * from qappuser where iAppuserId = 1430224175105
    
    // 更新视图记录
    // 通过视图更新时,只能更新权限范围内数据
    update v_appuser set sUsername="11"
    说明:以上语句只更新iAppUserId=1430224175105的记录,而其他记录不更新
    
    // 不能更新的视图
        ○ 视图中包含sumcountmaxmin
        ○ 视图中包含unionunion alldistinctgroup byhaving
        ○ 常量视图:create view t_view as select 'name' as name
        ○ 视图中select中包含子查询:create view t_view7(name) as select (select name from qwork)
        ○ 由不可更新视图导出的视图
        ○ 创建视图时,Algorithm为Temptable类型
    视图对应表上存在没有设置默认值的列,而且改列没有包含在视图中123456789101112131415161718

    5.6. 删除视图

    drop view if exists 视图名列表 [Restrict | cascade]

    6. 触发器语法

    // 触发事件
      Insertupdatedelete
    // 创建一个只有一个执行语句的触发器
    create trigger 触发器名  before | after
    触发事件
    on 表名 for each row  执行语句
    
    // 创建多个执行语句触发器
    create trigger 触发器 before | after
    触发事件
    on 表名 for each row
    before
      执行语句列表
    end
    // 查看触发器
    show triggers \G;
    
    // information_schema 下的triggers表
    SELECT * from information_schema.TRIGGERS;
    // 触发器使用顺序
    Before触发器  操作(insert,update,delete) After触发器
    // 删除触发器
    Drop trigger 触发器名1234567891011121314151617181920212223

    创建触发器demo:

    create trigger updatename after update on user for each row   //建立触发器,  
    begin  
            //old,new都是代表当前操作的记录行,你把它当成表名,也行;  
            if new.name!=old.name then   //当表中用户名称发生变化时,执行  
            update comment set comment.name=new.name where comment.u_id=old.id;  
    end if;  

    7. 查询数据

    7.1. 基本查询语句

    select 属性列表
        from 表名和视图列表
          [where 条件表达式]
          [Group by 属性1 [having 条件表达式2] ]
          [Order by 属性2 [ASC|DESC]]
    带like查询
          [Not] like"%"通配符,多个字符
          带"_"通配符,一个字符
    带in关键字查询
          [Not] in (元素1,元素2,...)
    带between and 查询
          [Not] between 值1 and2
    空值查询
          is [not] nullandor查询条件
    带distinct查询
    带比较条件:
          =、<、<=、>、>=、!=、<>、!>、!<
    使用limit限制查询结果数目(从0开始)
          不指定初始位置,只指定显示N个
          select * from employ limit 2;
          指定初始位置
          select * from employ limit 0,2;
    12345678910111213141516171819202122232425

    7.2. 连接查询

    内连接:两边都有才被查询

    • 表名1 inner join 表名2 on 表名1.属性 = 表名2.属性
    • 或者
    • from 表名1,表名2 where表名1.属性 = 表名2.属性

    外连接:

    • 表名1 left|right join 表名2 on 表名1.属性 = 表名2.属性
    • 左连接查询:左边表显示所有记录,右边表只有匹配的才显
    • 右连接查询:右边表显示所有记录,左边表只有匹配的才显示

    7.3. 子查询

    将一个查询语句嵌套在另一个查询语句中。内层查询语句的查询结果可以为外层查询语句提供查询条件

    • 带[Not] in关键字的子查询
      • select * from employ where id in (select d_id from department)
    • 带比较运算符子查询

      • =、<、<=、>、>=、!=、<>、!>、!<
      • select * from employ where id >= (select d_id from department)
    • 带[Not] exists关键字查询

      • 使用exists关键字,内层查询语句不返回查询的记录,而是返回一个真假值。如果内层查询语查询到满足条件的记录,就返回一个真值,否则返回一个假值。只有当返回的值为真时,外层查询语句才进行查询并获取记录
      • select * from employ where exists (select d_name from department where d_id=1001)
    • SQL中EXISTS的用法

      • EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:
      • IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
    • 带any关键字子查询

      • 满足其中任一条件。只要满足内层查询语句返回结果中的任何一个,就可以通过该条件执行外层查询语句
      • select * from employ where id >= any(select d_id from department)
    • 带all关键字子查询

      • 满足所有条件。只有满足内层查询语句返回所有结果,才可以执行外层查询语句
        select * from employ where id >= all(select d_id from department)
    • 合并查询结果

      • 将多个select语句查询结果合并到一起
      • union:将所有查询结果合并到一起,然后去除掉相同记录
      • union all:简单合并到一起
    • 表和字段取别名
      • 表名或者字段名 [AS] 别名

    7.4. 分组查询group by

    分组查询:带有GROUP BY的查询,也叫组合查询

    特征

    • GROUP BY是SELECT语句的从句,用来指定查询分组条件,主要用来对查询的结果进行分组,相同组合的分组条件在结果集中只显示一行记录。
    • 和其配合的聚合函数有:COUNT()、SUM、MAX()、MIN()等
      count():统计记录条数
      sum():计算字段值总和
      avg():计算字段值平均值
      max(): 最大值
      min(): 最小值
    • GROUP BY在做组合查询的时候,会对NULL的分组单独形成一行
    • 可以在SELECT … GROUP BY 分组后筛选数据。筛选的关键字是HAVING。HAVING的作用和WHERE类似。都是用来过滤查询的中间记录。但是,HAVING从句指定的每个列规范必须出现在一个聚合函数内,或者出现在GROUP BY从句命名的列中。与WHERE不同的是:WHERE是在分组前(查询后)筛选数据;HAVING是在分组后筛选数据。

    例如:

    SELECT
      SUBSTR(A.HYLB_DM,1,2),
      COUNT(*),
      SUM(A.ZCZB)
    FROM DJ_ZT A
      GROUP BY SUBSTR(A.HYLB_DM,1,2)
      HAVING MAX(YEAR(A.CJRQ))<>2007;1234567
    带有WHERE和HAVING的SELECT语句执行过程:
        § 执行WHERE筛选数据
        § 执行GROUP BY分组形成中间分组表
        § 执行WITH ROLLUP/CUBE生成统计分析数据记录并加入中间分组表
        § 执行HAVING筛选中间分组表
        § 执行ORDER BY排序

    8. 索引

    8.1. 索引共6种

        // 查看某个表的索引
        show index from 表名;
    123

    8.2. 普通索引

    可以创建在任何数据类型上,不附件任何限制条件

    // 创建表时创建索引
    drop table if EXISTS test;
    CREATE table test(
    id int,
    name VARCHAR(20),
    sex TINYINT,
    INDEX(id)
    );
    // 在已存在的表上创建索引
    语法:Create [Unique | Fulltext | spatial] index 索引名 on 表名(属性名[(长度)][ASC|DESC], ...);
    create INDEX index_id on test(id);
    // 用Alter table创建索引,其他也是类似,不在一一举例
    // Alter table 表名 add [Unique | Fulltext | spatial] Index 索引名 (属性名[(长度)][ASC|DESC],...)
    ALTER TABLE test add UNIQUE INDEX index_id4(id);
    // 删除索引,所有类型的索引的删除语句都是一样的
    drop index index_id2 on test;
    1234567891011121314151617

    8.3. 唯一性索引

    只能在唯一值数据上创建索引,用Unique参数设置

    // 创建表时创建索引,Mysql中不用加unique index(id),只要某个字段是unique就自动建立唯一索引。
    drop table if EXISTS test;
    CREATE table test(
    id int unique,
    name VARCHAR(20),
    sex TINYINT,
            // id_index表示索引名称,(id asc)表示索引升序排列
    unique INDEX id_index(id asc)
            // unique INDEX (id )
    );
    // 在已存在的表上创建索引,其他在已有的表建立索引,语法相似就不一一举例
    create UNIQUE INDEX index_id2 on test(id);
    // 用Alter table创建索引12345678910111213

    8.4. 全文索引

    只能在char、varchar和text上建立索引,用fulltext设置,只限于MyIsam存储引擎

    // 创建表时创建索引
    drop table if EXISTS test;
    CREATE table test(
        id int unique,
        name VARCHAR(20),
        sex TINYINT,
        FULLTEXT INDEX name_index(name )
    )ENGINE=myisam;12345678

    8.5. 单列索引

    在表的单个字段上建立索引

    // 创建表时创建索引
    drop table if EXISTS test;
    CREATE table test(
        id int unique,
        name VARCHAR(20),
        sex TINYINT,
                // 只取前10个前缀建立索引
        INDEX name_index(name(10) )
    );123456789

    8.6. 多列索引

    在表的多个字段上建立索引。只有查询条件中使用了这些字段中的第一个字段时,索引才被使用。
    例子:如在id,name和sex上建立了多列索引,只有在查询条件中使用了id字段,该索引才被使用

    // 创建表时创建索引
    drop table if EXISTS test;
    CREATE table test(
        id int unique,
        name VARCHAR(20),
        sex TINYINT,
        INDEX name_index(name(10),sex )
    );12345678

    8.7. 空间索引

    只能在空间数据类型上建立索引

    9. 账号管理

    9.1. 新建用户

    // 为Entry数据库创建一个remote_entry账号,密码为password,拥有selectinsertdeletecreatedrop权限
    grant select,insert,update,delete,create,drop on entry.* to 'remote_entry'@'%' identified by 'password';
    // 不用刷新权限,就可以登录;如果通过insertupdate对mysql.user进行操作,则需要进行刷新操作
    // flush privileges;1234

    9.2. 删除用户

    DROP USER 'remote_entry'@'%';1

    9.3. 查询数据库的用户

    SELECT * from mysql.user1

    9.4. 修改密码

    // 登录后,修改自己密码
    set Password = Password("new_password");
    // 账号拥有Super_priv的权限,才可以执行以下操作,如root用户
    mysqladmin -umysql -ppassword password "password2"
    // 拥有修改mysql表权限的用户(如root用户)修改自己或者别人密码,并刷新权限
    update mysql.user set password=Password("password") where user='remote_entry' and host='localhost';
    flush privileges;
    // 修改别人密码
    set Password for 'remote_entry'@'%' = Password("password") ;123456789

    9.5. 修改用户host:是否可以远程访问

    //  修改用户只能本地访问,如果要任何IP都可以访问,则设置host为%;需要刷新权限
    update mysql.user set host = 'localhost' where user='mysql';
    flush privileges;
    1234

    9.6. 忘记root密码,找回root密码(mysql忘记密码)

    // 1 打开命令行界面,使用 --skip-grant-tables方式启动服务,在命令行中执行,程序会停留在界面上
    mysqld  --skip-grant-tables
    // 2 打开新命令行界面,使用root无密码登陆,并执行密码修改语句,并刷新权限
    mysql -uroot
    update mysql.user set password=Password("password2") where user = "root";
    flush privileges;123456

    10. 权限管理

    10.1. 授权

    // with grant option(未测试,是否可以给其他用户授权)表示对A用户进行的授权,A可以授予给其他用户,当收回对A的授权时,A授予给其他用户的权限不会被级联收回
    grant select,update on *.* to 'entry'@'localhost' identified by 'entry' with grant option;
    // 为一个用户赋予全部的权限
    grant all privileges on ab.* to hwalk1@'%' identified by 'hwalk1';1234

    10.2. 收回权限

    // 收回所有用户或者某个特定数据库的权限 
    Revoke all privileges on *.* from 'entry'@'localhost';
    123

    10.3. 查看权限

    // 获取用户在所有数据库上的权限
    select * from mysql.user \G;
    // 查看用户所有权限,在所有数据库和特定数据库上的权限
    show grants for 'root'@'localhost';
    展开全文
  • MySQL默认使用大小写敏感的数据库名、表名和列名(可以通过lower_case_table_names参数控制是否大小写敏感),DB2数据库对大小写不敏感。虽然MySQL与DB2都遵循并符合SQL92标准且...下面就来具体看看db2和mysql语法上...

    b61d9712f1e8be3b896c41722d7ba85e.png

    MySQL默认使用大小写敏感的数据库名、表名和列名(可以通过lower_case_table_names参数控制是否大小写敏感),DB2数据库对大小写不敏感。

    虽然MySQL与DB2都遵循并符合SQL92标准且大多数SQL相互兼容,但是在一些细节的实现上有一些不同的地方。比如:MySQL取符合条件的前几行数据上使用limit语法,DB2则使用fetch语法等。

    下面就来具体看看db2和mysql语法上的一些区别:

    1、删除列:

    mysql:alter table 表名 set unuesed column 字段名

    db2 :不提供删除列功能(解决办法是删除表,重建)

    2、更改列名

    mysql :alter table 表名 change 旧字段名 新字段名 新数据类型

    db2 : 不提供更改列名功能(解决办法同删除,或者通过建立一个新视图解决)

    3、更改列类型

    mysql :alter table 表名 modify column 字段名 新数据类型 [新类型长度 新默认值 新注释];

    db2 :alter table 表名 alter 字段名 新数据类型

    db2只可以加宽,不能更改数据类型

    例:将字段mail的类型长度改为256alter table test alter mail varchar(256)

    4、更改列的限制(非空、主键)

    mysql :alter table test modify mail varchar(29) not null;

    db2 :alter table test alter mail null/not null;

    展开全文
  • Mysql 语法执行顺序

    千次阅读 2020-07-08 10:30:24
    熟悉Mysql 语法的小伙伴们都知道sql的语法顺序,如下: select[distinct] from join(如left join) on where group by having union order by limit 如果有去查阅一些文档或书籍,应该就知道sql在...

    熟悉Mysql 语法的小伙伴们都知道sql的语法顺序,如下:

    select[distinct]  
    from  
    join(如left join)  
    on  
    where  
    group by  
    having  
    union  
    order by  
    limit  
    

    如果有去查阅一些文档或书籍,应该就知道sql在执行的过程过其实并没有按照上诉的语法顺序执行的,它内部机制中会对语法进行解析,处理,优化 后生成查询计划,然后交给查询执行引擎 调用相应的存储引擎处理,如下:

    这里主要是对最终的语法执行顺序进行一个分析,其他部分以后进行分析或者感兴趣的可以查找一些相关资料

    🤔思考:那么语法的最终执行顺序应该是如何?什么关键字先被处理呢?为什么要知道执行顺序?知道了执行顺序对我们写sql有什么帮助呢?

    不多说,先直接看下顺序,以下是语法的执行顺序: 

    from  
    on  
    join  
    where  
    group by  
    having  
    select  
    distinct  
    union  
    order by  
    

    下面我们来具体分析一下查询处理的每一个阶段:

    • FROM: 首先会执行from语句,把数据库的表文件加载到内存中。若有多张表,则多表计算笛卡尔积。产生虚表VT1(virtual table)
    • ON: 对虚表VT1进行ON筛选,筛选出那些符合的行并且在内存中生成一张临时虚表VT2中。
    • JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。
    • WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。
    • GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
    • CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6. (注CUBE|ROLLUP 是对数据的聚合操作)
    • HAVING: 对虚拟表 VT6 应用having过滤,只有符合的记录才会被 插入到虚拟表 VT7 中。
    • SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
    • DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
    • ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.
    • LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。

    看完之后,相信都对sql语句有了新的认识,我们在编写sql的时候能更少的出错,并能编写更加优雅的代码。除此之外我们还可以知道哪些信息呢?对索引的使用相信大家也应该有更多的想法了,剩下的就是在实践中一步步摸索。

     

     

    展开全文
  • 讲解sql的语法入门,sql基础语法,php连接mysql实战操作
  • Navicat基础mysql语法

    千次阅读 2018-03-31 13:56:19
    今天告诉大家一些关于Navicat的一些基础mysql语法,这个也是我的老师教的,整合到了一起,希望对大家有所帮助。-- 增,删,改 insert delete update -- 增 必须向所有列填充数据,除了(自增列,有默认值列,允许为...

    今天告诉大家一些关于Navicat的一些基础mysql语法,这个也是我的老师教的,整合到了一起,希望对大家有所帮助。


    -- 增,删,改 insert  delete  update 

    -- 增  必须向所有列填充数据,除了(自增列,有默认值列,允许为空)可以不填充
    INSERT [INTO] 表(列列表) values (值列表)

    -- 删 
     DELETE from 表[where 条件]
    DELETE from student

    -- 改
    UPDATE 表 set 列 = 值,列 = 值 [where 条件]
    update student set name = '张亮',set  sex = '女' where studentno = '4'

    -- 查询 模糊查询  分页  
    like between in is null 


    -- 查询  排序  分组  连接
    -- 排序 order by 默认是升序:asc  降序:desc
    -- 按多个列来排序,先按第一个字段排序,在此基础上再按第二个字段进行排序.
    select * from student order by age,studentno
    -- 分组 聚合函数 sum avg max min count
    select sum(age),avg(age),max(age),min(age) from student;
    -- count 是统计有多少数据行,如果是统计某个列,则会忽略列中的NULL值。
    select count(email) from student
    -- 统计有多少学生没有录入邮箱信息??
    select count(*) from student where email is null


    -- 分组,group by  是把数据进行分类再汇总,必须要配合聚合函数使用,
    -- 关键点:按什么进行分组,用什么聚合函数进行统计。
    -- 如果某个列出现在from关键字前,且没有包含在聚合函数中,则此列必须出现在group by 子句中
    -- 统计每个年级有多少学生? 
    select gradeId,count(*) from student group by gradeId
    -- 统计每个年级男女学生各有多少?  按年级和性别进行分组,用count函数
    select gradeid,sex,count(*) from student group by sex,gradeId; 
    -- 统计每个年级有多少课时?
    select gradeid,sum(classHours) from subject group by gradeid
    -- 统计每个年级有多少课程?
    select gradeid,count(*) from subject group by gradeid
    -- 统计每个学生的总成绩和平均成绩?
    select studentno,sum(result),avg(result) from score group by studentno


    -- 连接查询 内连接 外连接 交叉连接
    -- 当数据来自两个或两个以上的表时,则才用连接查询来实现。
    -- where 条件是两个表的主键列相等。
    select * from student s,grade g where s.gradeid=g.gradeid
    -- 建议使用下面的写法,性能好一些。
    select * from student s inner join grade g on s.gradeid=g.gradeid
    -- 查询姓名,学号、课程名、分数  数据来自于3个表?
    select name,s.studentno,subjectname,result from student s 
      inner join score c on s.studentno = c.studentno
      inner join subject j on c.subjectno= j.subjectno  


    -- 外连接  左外连接  右外连接
    /* 左外连接,在前面的表是主表,后面的表是子表,主表的数据全部显示,
      再用子表的数据进行填充,如果子表中没有对应的数据,则用NULL来填充 */
    select * from student s
      left join score c on s.studentno = c.studentno


    -- 查询有哪些学生没有参加过考试,用左外连接实现??
    select * from student s
      left join score c on s.studentno = c.studentno 
      where c.studentno is null
    -- 查询哪些学生没有参加考试,用子查询实现??
    -- 子查询的结果只能是返回一列值,返回的值如果有多个,就只能用in 不能用 = 
    select * from student where studentno 
     not in( select studentno from score)

    展开全文
  • Mysql系列二 mysql语法总结

    千次阅读 多人点赞 2017-07-30 18:37:38
    本文对常用SQL语法进行总结,包括以下部分: 1. 数据库创建、删除、查看语法 2. 表创建、删除、查看语法 3. 视图创建、删除、查看语法 4. 触发器创建、删除、查看语法 5. 各种查询操作语法 6. 索引创建、删除...
  • mySQL语法检查,只检查不执行。 SELECT STATEMENT_DIGEST_TEXT("sql");
  • Oracle和MySQL语法区别

    万次阅读 多人点赞 2019-07-30 11:45:07
    由于两者的语法有部分不一样,所以需要把Oracle中能用但MySQL中不能用的函数/类型等改为MySQL中能用的,以下是总结出的部分语法区别:一、数据类型 1. Number类型 MySQL中是没有Number类型的,但有int/decimal ...
  • Mysql语法大全

    千次阅读 2018-04-27 09:58:39
    记录一下语法,便于以后查询 用户管理 新建用户及密码:foo为名,123为密码,locahost为固定地址登录 以下为两种创建方式 CREATE USER foo@localhost IDENTIFIED BY ‘123’ insert into mysql.user(Host,...
  • 另外一个Mysql语法大全的版本:点这里 两个Mysql语法大全以及命令行代码!!!基本上学习Mysql没有问题 嘿嘿!学习是一个长期的过程!!!还会继续更新!!! 基本的Mysql命令行语法大全都在这里面可以找到,比较...
  • MYSQL语法大全

    千次阅读 2019-01-29 18:46:44
    用户管理 ... # 以下为两种创建方式 ... insert into mysql.user(Host,User,Password) values(&quot;localhost&quot;,&quot;test&quot;,password(&quot;1234&quot;)); #只要更改了用户..
  • oracle语法转mysql语法

    2019-08-20 16:34:29
     mysql不插入id,设置主键自增 (mysql主键自增,插入的时候不需要写ID.)   test="_databaseId != 'mysql'">  SEQ_I_ORDER_CUSTAPPEND_i.nextval,   mysql设置主键自增 ALTER TABLE 表名 ...
  • 编程人员对都了解数据库,作为...而mysql语法中,今天就介绍一下mysql语法中比较重要的一个语法Grant,用户权限分配。   本文实例,运行于 MySQL 5.0 及以上版本。 MySQL 赋予用户权限命令的简单格式
  • SELECT last_name AS 姓氏, first_name AS 名字, email AS 邮件地址, job_id AS 工作编号 FROM employees;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,188
精华内容 22,075
关键字:

mysql语法

mysql 订阅