SQL

2023-05-16

数据库

基本概念

1.数据

定义:描述事物的符号序列, 数据(Data)是数据库中存储的基本对象。

数据的种类:数字、文字、图形、图像声音及其他特殊符号。

数据举例:学生记录(李明,男,1994,湖南,计算机学院)

值:给出了符合给定型的

2.数据库

  • 数据库——Database,简称DB。

    保存有组织的数据的容器(一个或者一组文件)。

    表的集合,具有统一的结构形式并存放于统一的存储介质内,是多种应用数据的集成,并可被各个应用程序所共享。按数据所提供的数据模式存放的。

  • 模式
    (schema),关于数据库和表的布局及特征的信息

  • 数据库的发展:层次数据库 网络式数据 关系型数据库 非关系型数据库(Redis)

  • 关系型数据库

    以由多张能互相联接的二维行列表格组成的数据库。在数据准备时,我们通常要建立表关联来分析。

    • 常用的关系型数据库有 SQL Server、MySQL、Oracle、 DB2 等,这个视企业使用为准
      • Oracle: 是目前市场占有率最大的数据库, Oracle, 安装起来很繁琐, 而且居然程序文件有 3G 之多… 用起来非常方便, 对于我这样的初学者, 有很简单的配置, 对于要求 很高的企业级应用, 也有很复杂的配置和管理方法, 有很强大的数据字典, 可以说是最实用的数据库 了, 但是查了一下, 价格不菲…
      • MySQL: MySQL 是一个很好的关系型数据库, 免费, 而且功能很全, 程序又小, 安装简单, 现在很多 网站都用 MYSQL, 在字段约束上做的差了点儿, 其他的都不错
  1. 数据库系统DBS

    • 定义

      替你访问数据库。实现有组织地、动态地存储大量相关数据,提供数据处理和资源共享服务。

    • 构成:

      • 数据库(数据)
      • 数据库管理系统(软件)
      • 数据库管理员(人员)
      • 硬件平台:计算机和网络
      • 软件平台:操作系统、数据库系统开发工具、接口软件
  2. 应用系统构成:

    Database Application System,简称DBAS

    组成:DBS+应用软件+应用界面

  3. 关系数据库管理系统

    RDBMS(Relational Database Management System)关系数据库管理系统,是一种基于E.F.Codd提出的关系模型的数据库管理系统。RDBMS是SQL的基础,也是所有现代数据库系统(如MS SQL Server、IBMDB2、Oracle、MySQL和MicrosoftAccess)的基础。

  4. SQL

    专门用来和数据库通信的语言 。结构化查询语言(Structured Query Language)简称

    一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。至于 ORACLE、DB2、Sybase、SQLServer、MySQL、MS Access 等都是数据库,虽然语法上有 差异,但是基本上都是大同小异。

  5. RDBMS中的数据存储在表中,表是最常见和最简单的数据存储形式。这个表基本上是一个相关数据条目的集合,它由许多列和行组成。

    • 字段

      每个表都被分解成更小的实体,称为字段。所谓的列

    • 记录

      记录也称为数据行,即表中存在的每个单独的条目

  6. 表间关系

    注意:虽然建立的表与表之间的关系,但是这个关系并不会被数据库维护.需要通过外键约束来通知数据库帮助我们维护表间关系

    1. 1 对1
    2. 1对多
    3. 多对多
  7. 可移植性
    portable,能运行在多个系统上的代码成为可移植的

  8. mysq和 redis区别

    redis:内存型非关系数据库,数据保存在内存中,速度快
    mysql:关系型数据库,数据保存在磁盘中,检索的话,会有一定的lo操作,访问速度相
    对慢

语言分类

1. DML

数据操作语言(DML:Data Manipulation Language):其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。

  1. 插入 INSERT

    INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)

    有自增时不可以用

  2. 修改 UPDATE

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

  3. 查看 SELECT

    SELECT 列名称 FROM 表名称

    SELECT *FROM ‘wu’

    Select now() 时间

    Select Version() 版本

    Select user() 用户

  4. 删除 DELETE

    DELETE FROM 表名称 WHERE 列名称

2. DDL

数据库定义语言(DDL):(data definition language)其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。

  1. 创建 CREAT

    Create database database1

    CREATE TABLE 表名称

    (列名称1 数据类型,

    列名称2 数据类型,

    … )顺序:列名、数据类型、长度、默认、主键、非空、unsigned、自增、zerofil

  2. 删除 DROP

    DROP TABLE 表名称

    DROP DATABASE 数据库名称

  3. 修改字段 ALTER

    ALTER TABLE table_name COMMAND_NAME field_name

    1. 表重命名 RENAME

      ALTER TABLE 【表名字】 RENAME 【表新名字】

    2. 添加字段 ADD

      alter table MyClass add passtest int(4) default '0’;

    3. 删除字段 DROP

      ALTER TABLE yanDROP sex2 ;

    4. 修改原字段名称及类型 CHANGE

      ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;

    5. 添加注释 modify column

      ALTER TABLE yan MODIFY COLUMN sex2INT COMMENT ‘boy=1,girl=0’;

    6. 修改约束 add constraint

      1. 添加主键约 primary key

        alter table 表名 add constraint 主键 (形如:PK_表名) primary key 表名(主键字段);

      2. 添加外键约束 foreign key

        alter table 从表 add constraint 外键(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);

    7. 删除

      1. 主键约束

        alter table 表名 drop primary key;

      2. 删除外键约束

        alter table 表名 drop foreign key 外键(区分大小写);

    8. 视图 VIEW

3. DCL

数据控制语言(DCL):用来授予或回收访问数据库的某种特权,并控制 数据库操纵事务发生的时间及。它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。

  • GRANT

  • REVOKE

  • COMMIT

编程规范

语法规则

  • SQL语句总是以关键字开始,如SELECT、INSERT、UPDATE、DELETE、DROP、CREATE。

  • SQL语句以分号结尾。

    分号是分离数据库系统中每个SQL语句的标准方法,这样您就可以在对服务器的同一请求中执行多个SQL语句。

  • SQL在文本值周围使用单引号(大多数数据库系统也接受双引号)

  • 由于数据库类型以及数据储存方式的不同,对应的SQL语法会有区别,但结构基本相同。

  1. 大小写

    不区分;建议 关键字使用大小写,表名列名使用小写,如下

    SELECT col_1, col_2, col_3,
        COUNT(*)
      FROM tbl_A
     WHERE col_1 = 'a'
       AND col_2 = ( SELECT MAX(col_2)
                       FROM tbl_B
                      WHERE col_3 = 100 )
     GROUP BY col_1, col_2, col_3
    
  2. 命名

    • 数据库名称、表名称、字段名,不要用保留字,不能以数字开头必须使用小写字母,并采用下划线分割

      如果大小写混合使用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱。建立两个名字一样但大小写不一样的字段。

    • 引用表、列名用英文单引号

    • 多个列用逗号隔开:

    • 标准 SQL 中规定表名的第一个字符应该是字母

      • 库名以 d 开头,表名以 t 开头,字段名以 f_ 开头

        比如表 t_crm_relation,中间的 crm 代表业务模块名

      • 视图以view_开头,事件以event_开头,触发器以trig_开头,存储过程以proc_开头,函数以func_开头_

      • 普通索引以idx_col1_col2命名,唯一索引以uk_col1_col2命名(可去掉f_公共部分)。如 idx_companyid_corpid_contacttime(f_company_id,f_corp_id,f_contact_time)

    • 表名要有意义,且名、表名、字段名禁止超过32个字符

      库名、表名、字段名支持最多64个字符,但为了统一规范、易于辨识以及减少传输量,禁止超过32个字符

    • 临时库、表名须以tmp加日期为后缀

      如 t_crm_relation_tmp0425。备份表也类似,形如 _bak20160425 。

  3. 注释,有单行注释和多行注释,如下

    -- 单行注释
    -- 从SomeTable中查询col_1 
    # 从SomeTable中查询col_1 
    SELECT col_1
      FROM SomeTable;
    
    /*
    多行注释
    从 SomeTable 中查询 col_1 
    */
    SELECT col_1
      FROM SomeTable;
    

    多行注释很多人不知道,这种写法不仅可以用来添加真正的注释,也可以用来注释代码,非常方便

  4. 缩进

    增强可读性:灵活使用空格和缩进来增强可读性——两大法宝空白隔道与垂直间距

    1. 利用空格保持关键字对齐
    2. 在等号前后(=)在逗号后(,)单引号前后(’)加上空格
    3. 子查询缩进并对齐
    select name,id,sex
    from (select *
    from school_score
    where class_cd=110)
    where sex = 'man'
    and exam_dt = '2016-06-01';
    
    --空白隔道+垂直间距+大小写+缩进
    SELECT name, id, sex
      FROM (SELECT *
              FROM school_score
             WHERE class_cd = 110)
     WHERE sex = 'man'
       AND exam_dt = '2016-06-01';
    
  5. 空格

    代码中应该适当留有一些空格,如果一点不留,代码都凑到一起, 逻辑单元不明确,阅读的人也会产生额外的压力,以下分别是是好的与坏的示例

    -- 好的示例
    SELECT col_1
      FROM tbl_A A, tbl_B B
     WHERE ( A.col_1 >= 100 OR A.col_2 IN ( 'a', 'b' ) )
       AND A.col_3 = B.col_3;
    
    -- 坏的示例
    SELECT col_1
      FROM tbl_A A,tbl_B B
     WHERE (A.col_1>=100 OR A.col_2 IN ('a','b'))
       AND A.col_3=B.col_3;
    

hive计算效率

  1. Hive SQL 执行过程

    1. image-20210830220046861
  2. 性能优化

    1. 使用分区剪裁、列剪裁,分区一定要加
    2. 少用 COUNT DISTINCT,可用group by 代替 distinct
    3. 是否存在多对多的关联(避免笛卡尔积)
    4. 连接表时使用相同的关键词,这样只会产生一个 job
    5. 减少每个阶段的数据量,只选出需要的,在 join 表前就进 行过滤
    6. 大表放后面(大表关联小表)
    7. 谓词下推:where 谓词逻辑都尽可能提前执行,减少下游 处理的数据量
    8. sort by 代替 order by(局部排序代替全局排序)

    什么是数据倾斜

    1. 大量相同的key被分配到了同一个任务上,造成“一个人累死、 其他人闲死”的状况

常用表操作归纳

sql执行顺序

from - join - on - where - group by - avg/sum- having - select - distinct - order by - limit

常见错误

  • 笛卡尔积问题

    关联条件字段为非唯一标识字段时,产生笛卡尔积现象

    1. 子表的笛卡尔积问题
    2. 一表a通过相同添加风别与多表连接 :a*B*C
  • 多个disitinct并行使用

    多个disitinct并行使用,相当于group by 两个字段,会造成第一个之后的字段重复

    错误写法,正确应该是分开求数量和uv
    --屏蔽网址数量	总uv	总pv
    		SELECT  
    			DAY
    			,a.is_police 
    			,COUNT( DISTINCT a.url) as `屏蔽网址数量`
    			,COUNT( DISTINCT imei )  as `总uv`
    			,sum (pv) as `总pv`
    
    

数据类型

通用类

数据类型描述
CHARACTER(n)字符/字符串。固定长度 n。
VARCHAR(n) 或 CHARACTER VARYING(n)字符/字符串。可变长度。最大长度 n。
BINARY(n)二进制串。固定长度 n。
BOOLEAN存储 TRUE 或 FALSE 值
VARBINARY(n) 或 BINARY VARYING(n)二进制串。可变长度。最大长度 n。
INTEGER§整数值(没有小数点)。精度 p。
SMALLINT整数值(没有小数点)。精度 5。
INTEGER整数值(没有小数点)。精度 10。
BIGINT整数值(没有小数点)。精度 19。
DECIMAL(p,s)精确数值,精度 p,小数点后位数 s。例如:decimal(5,2) 是一个小数点前有 3 位数小数点后有 2 位数的数字。
NUMERIC(p,s)精确数值,精度 p,小数点后位数 s。(与 DECIMAL 相同)
FLOAT§近似数值,尾数精度 p。一个采用以 10 为基数的指数计数法的浮点数。该类型的 size 参数由一个指定最小精度的单一数字组成。
REAL近似数值,尾数精度 7。
FLOAT近似数值,尾数精度 16。
DOUBLE近似数值,尾数精度 16。
DATE存储年、月、日的值。
TIME存储小时、分、秒的值。
TIMESTAMP存储年、月、日、小时、分、秒的值。 自动存储记录修改时间
INTERVAL由一些整数字段组成,代表一段时间,取决于区间的类型。
ARRAY元素的固定长度的有序集合
MULTISET元素的可变长度的无序集合
XML存储 XML 数据

类型转化

  • int

  • cast : cast(params[‘duration’] as bigint) < 86400000

运算

运算符

运算符是保留字或主要用于SQL语句的WHERE子句中的字符,用于执行操作

  1. 算术运算符

    运算符描述例子 a 的值是:10,变量 b 的值是:20
    +加法,执行加法运算。a + b 得到 30
    -减法,执行减法运算。a - b 得到 -10
    *乘法,执行乘法运算。a * b 得到 200
    /用左操作数除右操作数。b / a 得到 2
    %用左操作数除右操作数并返回余数。b % a 得到 0
  2. &

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l3XZ8uWM-1644060427824)(D:\Users\72141686\Desktop\资料\自我笔记_wjP.assets\1121855c-48d9-49b7-9bad-708e0a47101c.png)]

  3. 比较运算符

    运算符描述
    =检查两个操作数的值是否相等,如果是,则条件为真(true)。
    !=检查两个操作数的值是否相等,如果值不相等则条件为真(true)。
    <>检查两个操作数的值是否相等,如果值不相等则条件为真(true)。
    >检查左操作数的值是否大于右操作数的值,如果是,则条件为真(true)。
    <检查左操作数的值是否小于右操作数的值,如果是,则条件为真(true)。
    >=检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真(true)。
    <=检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真(true)。
    !<检查左操作数的值是否不小于右操作数的值,如果是,则条件变为真(true)。
    !>检查左操作数的值是否不大于右操作数的值,如果是,则条件变为真(true)。

逻辑运算符

运算符描述
ALLALL运算符用于将值与另一个值集中的所有值进行比较。
ANDAND运算符允许在SQL语句的WHERE子句中指定多个条件。
ANYANY运算符用于根据条件将值与列表中的任何适用值进行比较。
BETWEENBETWEEN运算符用于搜索在给定最小值和最大值内的值。8u7
EXISTSEXISTS运算符用于搜索指定表中是否存在满足特定条件的行。
ININ运算符用于将值与已指定的文字值列表进行比较。
LIKELIKE运算符用于使用通配符运算符将值与类似值进行比较。
NOTNOT运算符反转使用它的逻辑运算符的含义。 例如:NOT EXISTS, NOT BETWEEN, NOT IN等等,这是一个否定运算符。
OROR运算符用于组合SQL语句的WHERE子句中的多个条件。
IS NULLIS NULL运算符用于将值与NULL值进行比较。
UNIQUE集合并运算 UNIQUE运算符搜索指定表的每一行的唯一性(无重复项)。
EXPECT集合差运算
INTERSECT集合交运算

IN

  1. 说明

    IN运算符允许在WHERE子句中指定多个值。

    IN运算符是多个OR条件的简写。

  2. 语法

    SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, …)/ IN (SELECT STATEMENT);

    • 不在范围内则 写not in
  3. 参数是子查询时,使用 EXISTS 代替 IN

    如果 IN 的参数是(1,2,3)是值列表时,没啥问题,但如果IN的参数是子查询时回的结果是一样,但是用 EXISTS 的 SQL 会更快:

    -- 慢
    SELECT * 
      FROM Class_A
    WHERE id IN (SELECT id 
                   FROM  CLASS_B);
    
    -- 快
    SELECT *
      FROM Class_A A 
     WHERE EXISTS
    (SELECT * 
       FROM Class_B  B
      WHERE A.id = B.id);
    

    为啥使用 EXISTS 的 SQL 运行更快呢,有两个原因

    1. 可以用到索引,如果连接列 (id) 上建立了索引,那么查询 Class_B 时不用查实际的表,只需查索引就可以了。
    2. 如果使用 EXISTS,那么只要查到一行数据满足条件就会终止查询, 不用像使用 IN 时一样扫描全表。在这一点上 NOT EXISTS 也一样

    另外如果 IN 后面如果跟着的是子查询,由于 SQL 会先执行 IN 后面的子查询,会将子查询的结果保存在一张临时的工作表里(内联视图),然后扫描整个视图,显然扫描整个视图这个工作很多时候是非常耗时的,而用 EXISTS 不会生成临时表。

    当然了,如果 IN 的参数是子查询时,也可以用连接来代替,如下:

    -- 使用连接代替 IN SELECT A.id, A.name
    FROM Class_A A INNER JOIN Class_B B ON A.id = B.id;
    

    用到了 「id」列上的索引,而且由于没有子查询,也不会生成临时表

BETWEEN

  1. 用于

    选取介于两个值之间的数据范围内的值。

    选择给定范围内的值。值可以是数字,文本或日期。

    包含性的:包括开始和结束值,且开始值需小于结束值。

  2. 语法

    SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;要否定BETWEEN运算符的结果,可以添加NOT运算符: NOT BETWEEN

  3. 实例

    • 带有日期值的 BETWEEN

      SELECT * FROM Orders WHERE OrderDate BETWEEN #07/04/1996# AND #07/09/1996#;

DISTINCT

  1. 去重

    1. select 后直接使用,对所有记录去重
      1. select distinct name1 from chengji
    2. 在聚合函数中使用
  2. 案例:

聚合函数

GROUP BY

  1. 说明:

    1. GROUP BY语句通常与Aggregate集合函数(COUNT,MAX,MIN,SUM,AVG)一起使用,根据一个或多个列对结果集进行分组。没有聚合函数 默认为出现的第一项
    2. GROUP BY X意思是将所有具有相同X字段值的记录放到一个分组里。
    3. GROUP BY X, Y: 意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里*。*
  2. 语法

    SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) ORDER BY column_name(s);

  3. 对于distinct与group by的使用:

    1、当对系统的性能高并数据量大时使用group by 2、当对系统的性能不高时使用数据量少时两者皆可 3、尽量使用group by

  4. groupby 在连列表中 选择相同字段 不同表时结果可能会不同 题目 33

group_concat

  1. 分 组 合 并 , 同 时 排 序

    SELECT 
    	a.s_id
    	,GROUP_CONCAT(a.c_id ORDER BY a.c_id SEPARATOR '%' )
    FROM Score a
    GROUP BY a.s_id
    
    
    image-20210121125409339

    需要进行排序的原因是防止出现这种情况:01 修的课程顺序是:01,02,03;如果有同学修课的顺序是 02,03, 01,虽然顺序不同,但是本质上他们修的课程是相同的 使用排序后都会变成:01,02,03,保证结果相同

  2. group_concat([DISTINCT] 字 段 [Order BY ASC/DESC 排 序 字 段 ] [Separator ’ 分 隔 符 '])

HAVING

  1. 一般 HAVING 是与 GROUP BY 结合使用的,having 是对 group by后的数据进行筛选过滤,必须要有group by才能用having。

  2. 但其实它是可以独立使用的,假设有如下表,第一列 seq 叫连续编号,但其实有些编号是缺失的,怎么知道编号是否缺失呢,

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kNurpgiD-1614984588388)(/Users/wu/Library/Application Support/typora-user-images/image-20210119145338396.png)]

    SELECT '存在缺失的编号' AS gap
      FROM SeqTbl
    HAVING COUNT(*) <> MAX(seq);
    

集合函数

  • TRUNCATE 除法

    SELECT TRUNCATE(t/100,2) as g from test

  • Abs() 绝对值

  • Cos() Mod() Exp() Pi() Rand() Sin() Squrt() Tan()

  • COUNT()

  1. 函数返回符合指定条件的行数

  2. 语法:

    1. 函数返回指定列的值的数目

      SELECT COUNT(column_name) FROM table_name WHERE condition;

    2. 表中的记录数

      SELECT COUNT(*) FROM table_name;

    3. COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:

      SELECT COUNT(DISTINCT column_name) FROM table_name;

  3. count(*),count(1),count(列名)

    1. count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
    2. count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL。
    3. count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空
  4. 分类统计

    COUNT( CASE WHEN a.s_score > 85 THEN 1 END

  • stddeev 方差

  • varance 标准差

  • percentile 百分位数

  • sum 总和统计函数

  • avg 平均值统计函数

  • min 最小值统计函数

  • max 最大值统计函数

  • 近似

  1. 取上:ceil(23.33) --24
  2. 取下:floor(23.33) --23
  3. 四舍五入:round(23.33) --23
  4. 截断:trunc(23.33) --23

时间函数

时间戳

  1. 13/10位时间戳比较

    1. 13位时间戳单位为毫秒,10位字符串单位为秒
    2. a.min_time_brp>=b.min_time_br+5601000
  2. from_unixtime UNIX时间戳转日期函数,10位bigint

    1. from_unixtime(cast(substring(params[‘behavior_id’],1,10) as bigint),‘HH’) as hours
    2. SELECT from_unixtime(cast(substring(‘1633851115455’,1,10) as bigint),‘yyyy-MM-dd’) as
  3. unix_timestamp 获取当前UNIX时间戳函数

  4. unix_timestamp 日期转UNIX时间戳函数

  5. unix_timestamp 指定格式日期转UNIX时间戳函数

内置日期函数

  • 某天是本年第几周 _week

    SELECT WEEK(date_add(‘2012-12-31’,interval 6 day),2

  • 当前的日期 _ CURDATE()

  • 当前的时间 _ CURDATE()

  • 提取日期或日期/时间表达式的日期部分 _DATE() YYYY-MM-DD

  • 日期相减得“天数” _ datediff(date1,date2)

    • 日期比较函数: datediff语法: datediff(string enddate,string startdate)
      返回值: int
      说明: 返回结束日期减去开始日期的天数。

      举例:hive> select datediff(‘2016-12-30’,‘2016-12-29’); 1

  • 日期添加指定的时间间隔 _ DATE_ADD()

    • 日期增加函数: date_add语法: date_add(string startdate, intdays)
      返回值: string
      说明: 返回开始日期startdate增加days天后的日期。

      举例:hive>select date_add(‘2016-12-29’,10);2017-01-08

  • 从日期减去指定的时间间隔 _ DATE_SUB()

    • 日期减少函数: date_sub语法: date_sub (string startdate,int days)
      返回值: string 说明: 返回开始日期startdate减少days天后的日期。

      举例:hive>select date_sub(‘2016-12-29’,10); 2016-12-19

  • 用不同的格式显示日期/时间 _ DATE_FORMAT

  • 提取月 _ month ()

  • 提取年 _ YEAR()

  • day 日期转天函数

  • day 日期转天函数

  • hour 日期转小时函数

  • minute 日期转分钟函数

  • second 日期转秒函数

  • weekofyear 日期转周函数

  • 返回当前的日期和时间 _ now()

时间格式

datepart缩写
yy, yyyy
季度qq, q
mm, m
年中的日dy, y
dd, d
wk, ww
星期dw, w
小时hh
分钟mi, n
ss, s
毫秒ms
微妙mcs
纳秒ns

排序

  1. row_number
  2. rank
  3. dense_rank
  4. ntile
  5. order by 全局排序
  6. sort by 局部排序(按reducer)
  7. distribute by 根据字段值分配数据(到不同reducer)
  8. cluster by distribute by+sort by

表关联

说明:

  1. 用于把来自两个或多个表的行结合起来。基于这些表之间的共同字段。

  2. 简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。

  3. 联结的过程
    联结两个表,过程是第一个表的每一行和第二个表的每一行逐条匹配

JOIN 字段拼接

  1. 最常见的 JOIN 类型:
    1. INNER JOIN:如果表中有至少一个匹配,则返回行
    2. LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
    3. RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
    4. FULL JOIN:只要其中一个表中存在匹配,则返回行
    5. SELF JOIN:用于将表连接到自己,就好像该表是两个表一样,临时重命名了SQL语句中的至少一个表
    6. CARTESIAN JOIN:从两个或多个连接表返回记录集的笛卡儿积
    7. left semi join : LEFT SEMI JOIN (左半连接)是 IN/EXISTS 子查询的一种更高效的实现

INNER JOIN、join

  1. 内连接inner join或join 等值联

    说明:内连接可以理解为,两个表中同时满足某条件的数据记录组合。也就是表A和表B中满足条件a.id = b.a_id的所有记录。

    当表A中的一条记录对应表B中的多条记录时,会以重复的方式对应多条表B记录出现在结果集中。

    当表B中的一条记录对应表A中的多条记录时,会以重复的方式对应多条表A记录出现在结果集中。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WHx854go-1614984588390)(/Users/wu/Library/Application Support/typora-user-images/image-20210118101547041.png)]

LEFT JOIN

  1. 语法

    SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name=table2.column_name;

  2. 案例:

    左外连接,会以左边的表A为主表,返回所有行,即使右表B中没有匹配的行。

    如果左边的表A在右表B中找不到一条记录,则返回表A所有记录并且表B相应的字段设为null。

    如果左边的表A在右表B中找到多条记录,则以相同表A记录和不同表B记录多条显示在结果集中。

RIGHT JOIN

  1. 语法:

    SELECT column_name(s) FROM table RIGHT JOIN table2 ON table1.column_name = table2.column_name;

FULL JOIN

  1. 全连接full join ;mysql并不支持全连接,不过有相应的替代方案,就是left join union right join 来代替。
  2. 全连接会从表A和表B中返回所有的行,如果表A中的行在表B中没有匹配,或是表B中的行在表A中没有匹配,这些行都会显示,不存在的字段以null补充。

CARTESIAN JOIN

笛卡尔积查询结果数据量=左边表的数量*右边表的数量

select * from a cross join b;
select * from a, b;

自连接

  1. 自联接是一种常规联接,但表本身是连接的
  2. 语法SELECT column_name(s) FROM table1 T1, table1 T2 WHERE condition;
  3. 作用:查找重复行、排序

UNION、UNION all 不去重

  1. 说明:

    1. UNION运算符用于组合两个或更多SELECT语句的结果集,而不返回任何重复的行
    2. UNION中的每个SELECT语句必须具有相同的列数
    3. 这些列也必须具有相似的数据类型
    4. 每个SELECT语句中的列也必须以相同的顺序排列
    5. 但是每个SELECT语句的长度不必相同
    6. 在最小情况下,UNION运算符选择一个不同的值。如果允许重复值,请使用UNION ALL。
  2. 语法

    1. SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2;

    2. +where : SELECT column_name(s) FROM table1 [WHERE condition] UNION SELECT column_name(s) FROM table2 [WHERE condition];

    3. union all:SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2;

字符串处理

拼接字段concat()函数

多数数据库管理系统用+或者||,mysql用concat()函数
select concat(vend_name,’(’,vend_country,’)’) from vendors order by vend_name;

Left /right

left(str,index) 从左边第index开始截取

right(str,index)从右边第index开始截取

字符串截取函数 substr,substring

substring(str,index)当index>0从左边开始截取直到结束 当index<0从右边开始截取直到结束 当index=0返回空

substring(str,index,len) 截取str,从index开始,截取len长度

SUBSTRING_INDEX(x,y,z)

分列x,根据y,并返回第z个字段

SUBSTRING_INDEX(data_1,’ ',1) ;可以根据空格分列data列,提取第一字段substring_index(str,delim,count),str是要截取的字符串,delim是截取的字段 count是从哪里开始截取(为0则是左边第0个开始,1位左边开始第一个选取左边的,-1从右边第一个开始选取右边的

subdate

6、subdate(date,day)截取时间,时间减去后面的day

subtime

7、subtime(expr1,expr2) 时分秒expr1-expr2

soundex()

根据近似的读音去匹配
select cust_name,cust_contact from customers where cust_contact ='Y.Lie'; 返回 empty
select cust_name,cust_contact from customers where soundex(cust_contact) =soundex('Y.Lie'); 返回Y Lee 

URL解析函3数 parse_url

  1. 对应参数 参考:URL 语法
  2. 常用 参数 ‘HOST’ 、‘PATH’

位置查找 _ instr

  1. select instr(‘helloworld’,‘lo’) – 4 即:在“lo”中,“l”开始出现的位置

分割字符串函数 split

语法: split(string str, string pat)
返回值: array
说明: 按照pat字符串分割str,会返回分割后的字符串数组

  1. 关于转义 有些特殊字符转义只需 \ ,而有些需 \ ,比如 . ?
  2. hive> select split(‘abcdef’, ‘c’) from test;
    [“ab”, “def”]
    – 截取字符串中的某个值
    hive> select split(‘abcdef’, ‘c’)[0] from test;
    ab
    3.特殊字符
    – 如正则表达式中的特殊符号作为分隔符时,需做转义 (前缀加上)
    hive> select split(‘ab_cd_ef’, ‘_’)[0] from test;
    ab
    hive> select split(‘ab?cd_ef’, ‘\?’)[0] from test;
    ab
  3. 在mysql中并没有split函数,需要自己写:https://blog.csdn.net/pestd/article/details/6973772?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=3d725bc6-9b16-466d-80ba-b6a89228ba7d&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

length 字符串长度函数

reverse 字符串反转函数

concat_ws 带分隔符字符串连接函数

upper,ucase 字符串转大写函数

lower,lcase 字符串转小写函数

trim 去空格函数

ltrim 左边去空格函数

rtrim 右边去空格函数

get_json_object json解析函数

space 空格字符串函数

repeat 重复字符串函数

ascii 首字符ascii函数

lpad 左补足函数

rpad 右补足函数

find_in_set 集合查找函

正则表达式类

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。数据分析中,可用于数据筛选、信息提取、替换处理等。

like

  1. 作用:A like B使用描述: 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合表达式B 的正则语法,则为TRUE;否则为FALSE。LIKE主要进行简单正则匹配。

  2. 通配符

    % :百分号表示零个,一个或多个字符

    _ :下划线表示单个字符

  3. 注意:

    • MS Access使用问号(?)而不是下划线(_)
    • 百分号和下划线也可以组合使用!
    • 还可以使用AND或OR运算符组合任意数量的条件。
    • 否定比较时候用NOT A LIKE B(使用A NOT LIIKE B也可以),结果与like的结果时相对的
  4. 语法:

    SELECT column1, column2, … FROM table_nameWHERE columnN LIKE pattern;

    • 使用’%‘和’_'通配符显示不同LIKE运算符的例子:

      LIKE 运算符**描述 **
      WHERE CustomerName LIKE ‘a%’查找以“a”开头的任何值
      WHERE CustomerName LIKE ‘%a’查找以“a”结尾的任何值
      WHERE CustomerName LIKE ‘%or%’在任何位置查找任何具有“or”的值
      WHERE CustomerName LIKE ‘_r%’在第二个位置查找任何具有“r”的值
      WHERE CustomerName LIKE ‘a_%_%’查找以“a”开头且长度至少为3个字符的值
      WHERE ContactName LIKE ‘a%o’找到以"a"开头,以"o"结尾的值
      WHERE City LIKE ‘[a-c]%’;以“a”、“b”或“c”开头的所有客户
      WHERE City LIKE ‘[bsp]%’;以"b"、"s"或"p"开头
      WHERE City LIKE ‘[!bsp]%’;
      WHERE City NOT LIKE ‘[bsp]%’;
      不以“b”,“s”或“p”开头:

RLIKE

A RLIKE B ,B中的表达式可以使用JAVA中全部正则表达式,具体正则规则参考java,或者其他标准正则语法

Regexp regexp / 2链接

语法: A REGEXP B 描述: 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合正则表达式B的 正则语法,则为TRUE;否则为FALSE。

  • eg :an regexp '1{1,2}\.'and an regexp ‘[0-9]{1,2} f i l e : / / . [ 0 − 9 ] 1 , 2 file://.[0-9]{1,2} file://.[09]1,2
  • 语法 : ^ 开头, $ 结尾 , [0-9]数字开头,{1,2} 重复1~2次,

regexp_replace 正则表达式替换函数

  1. 语法: regexp_replace(string A, string B, string C) 说明:将字符串A中,符合正则表达式B的部分,替换为C。

regexp_extract 正则表达式解析函数

  1. 语法: regexp_extract(string subject, string pattern, int index) 说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

筛选列 ‘^p.*?e$’ 注:set hive.support.quoted.identifiers = none;

  1. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iuQpa3YF-1644060427825)(D:\Users\72141686\Desktop\资料\自我笔记_wjP.assets\image-20210830215307693.png)]

空值处理

NULL

  1. 说明:

    1. NULL 代表丢失的未知数据。它与字段包含0、空字符串或者仅仅包含空格不同,具有NULL值的字段是没有值的字段,数据表中的 NULL 值表示该值所处的字段为空。
    2. 默认情况下,表列可以保存 NULL 值。如果表中的列是可选的,那么我们可以插入一个新记录或更新一个现有记录,而无需向列添加一个值。这意味着该字段将存储为 NULL 。
    3. 不能使用比较操作符测试 NULL 值,所以含有 NULL 的记录不会包含在最终结果里面 例如=、<或<>。必须使用 IS NULL 和 IS NOT NULL 操作符。例如:SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NULL
  2. coalesce (expression_1, expression_2, …,expression_n)

    1. 依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。
    2. 举例:coalesce(sch_name, sub_name, date, ‘2020’) 判断sch_name,不为空则返回它的值;如果为空判断sub_name,不为空则返回它的值;如果为空判断date,不为空则返回它的值;如果为空返回2020
  3. nvl(app_version,’’)

    1. 如果exp1计算结果为null值,则NVL()返回exp2;

      如果exp1计算结果不为null值,则NVL()返回exp1;

窗口函数

语法:

<窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>)

  1. row_number() over(partition by t.day, t.imei order by t.dt desc) as rn
    1. desc 降序

常用窗口函数

  1. 排名:rank()、dense_rank()、row_number()等
    1. row_number()
      仅仅定义组内的 数据 进行编号 1 2 3 4 5 。。。
      rank()
      编号的时候排序字段会参与,数据相同的字段的编号也相同,总编号不变 1 2 2 4 5
      dense_rank()
      编号的时候排序字段会参与,数据相同的字段的编号也相同,总编号改变 1 2 2 3 4、
  2. 统计:count()、max()、min()、sum()、avg()等
  3. 取值:first_value()、last_value()等

topN筛选

select *
from (
  select *,row_number() over (partition by 要分组的列名 order by 要排序的列名 desc)
  as 列别名 from 原表名
) as 表别名 
where ranking <= N;


哈希

md5

hash

---注意 vivo_dsp_
--2位尾号 substr(hash(MD5(concat(imei,'com.vivo.browser',substr(imei,-2),'vivo_dsp_哈希 盐'))),-2) 
--1位尾号 substr(hash(MD5(concat(imei,'com.vivo.browser',substr(imei,-2),'vivo_dsp_哈希 盐'))),-1) 

map对象

  1. explode

    1. 作用是处理map结构的字段 例如:用json存储字段.将list格式转化为列. 通常配合split 将对象转化为list
    2. select explode(split(‘a:shandong,b:beijing,c:hebei’,’,’))
      /*
      a:shandong
      b:beijing
      c:hebei
      */
  2. *LATERAL VIEW的使用:*

    1. 侧视图的意义是配合explode(或者其他的UDTF),一个语句生成把单行数据拆解成多行后的数据结果集。其中LATERAL VIEW explode(split(goods_id,’,’))goods相当于一个虚拟表,与原表explode_lateral_view笛卡尔积关联。

    2. 	from 
      	(
      		select day, imei, event_id, params['hot_word_json'] as hot_word_json
      		from bi_browser_dev.ostsdk 
      		where day = '${etl_date}' 
      		and event_id = '00239|006' 
      	) a 
      	lateral view explode(split(regexp_replace(regexp_replace(a.hot_word_json, '\\[|]', ''),'},\\{','}#\\{'), '#')) b as hot_word_json_2 
      	where get_json_object(b.hot_word_json_2, '$.topword') is not null 
      

建表

  1. CREATE TABLE

    1. 用于创建数据库中的表,每个表都必须有一个表名

    2. 建表语法

      CREATE  TABLE `da_content_tmp`.`tmp_wjp_event_pstsdk_test_0918`
      (
          `day` string comment 'day',
          `imei` string comment 'imei',
          `params` map<string,string> comment '埋点参数',
          `event_id` string comment '埋点编号'
      )
      
  2. create table as select

    1. create table table1 as select * from table2 where 1=2;创建一个表结构与table2一模一样的表,只复制结构不复制数据;注意:不能将原表中的default value一同迁移过来
    2. create table table1 as select * from table2 创建一个表结构与table2一模一样的表,复制结构同时也复制数据;
    3. create table table1(columns1,columns2) as select columns1,columns2 from table2; 创建一个表结构与table2一模一样的表,复制结构同时也复制数据,但是指定新表的列名

写入

INSERT INTO

  1. 语法

    单行:INSERT INTO 表名称 VALUES (值1, 值2,…);也可以指定所要插入数据的列:INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)

    多行:不指定列时要确保值的顺序与表中的列顺序相同INSERT INTO table_name VALUES (1行, 2行,3行, …);

  2. insert ignore into

    当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉

  3. insert … select … where not exist
    根据select的条件判断是否插入,可以不光通过primary 和unique来判断,也可通过其它条件

  4. Insert into select 使用另一个表填充一个表

    1. 查询的字段与本表要插入数据的字段是一一对应的。
    2. INSERT INTO first_table_name [(column1, column2, … columnN)] SELECT column1, column2, …columnN FROM second_table_name [WHERE condition];

删除

  1. drop table

    drop table if EXISTS  da_content_tmp.tmp_wjp_test_novel_news_0832;
    create table da_content_tmp.tmp_flt_brp_new_model  as
    	select
    		day,
    		imei,
    		model
    	from
    		bi_browser_dev.dw_vivo_online_user
    	where
    		day = '${etl_date}'
    		and last = '${etl_date}'
    		and first_day='${etl_date}'
    	group by
    		day,
    		imei,
    		model---新在网用户
    

窗口函数

与聚类函数类似,对记录分组后进行聚合计算,但是不会为每一个组只返回一个值,而是可以返回多个值,为分组中的每条记录都返回特定值。只能用在select 语句中,使用后不能再使用 group by 。

  1. 基本结构 :

    <窗口函数> over
    (partition by <用于分组的列名>
    order by <用于排序的列名>)

  2. <窗口函数>一般有以下两种:

    1. 排序函数,包括rank,dense_rank,row_number等。
    2. 聚合函数,如sum,avg,count,max,min等。
  3. 常用函数

    1. row_number() over() 记录在同一分组内的排序
    2. percent_rank() over() 记录在同一分组内排序的分位数
    3. sum(col ) over() 记录同一分组内所有记录col 值的和 ,同一分组内记录的返回值 相同
    4. avg(col) over() 记录同一分组内所有记录col 值的平均值,同一分组内记录的返回值 相同
    5. max(col) /min(col) over() 记录同一分组内所有记录col 值的最大 、最小 ,同一分组内记录的返回值 相同

hive配置

set hive.exec.parallel=true;
– 参数控制在同一个sql中的不同的job是否可以同时运行,默认为false.子查询中的sql并无关系,可以并行的跑
set hive.exec.parallel.thread.number = 16;
– 数hive.exec.parallel.thread.number就是控制对于同一个sql来说同时可以运行的job的最大值,该参数默认为8.此时最大可以同时运行8个job.
set hive.auto.convert.join = true;
– Hive的MapJoin机制 适用 在二个要连接的表中,有一个很大,有一个很小

其他基本操作

CASE WHEN

可以用在 select 、group by (不可以重命名)、聚合函数(聚合函数+distinc + case when 基本可以完成所有的 sql 分组)、

  1. 统计:

    1. 仅仅 case when

    图片

    使用 CASE WHEN 如下

    SELECT CASE city
          WHEN '长沙' THEN '湖南' 
          WHEN '衡阳' THEN '湖南'
          WHEN '海口' THEN '海南' 
          WHEN '三亚' THEN '海南'
        ELSE '其他' END AS district,
        SUM(population) 
    FROM PopTbl
    GROUP BY district;
    
    1. 与 in 连用

      case  when  city in ( '长沙','衡阳') then ’湖南‘,
      	when  city in ('南京') then ’江苏‘
      
  2. SET 数据更新

    图片

    奇葩的规定

    1. 对当前工资为 1 万以上的员工,降薪 10%。
    2. 对当前工资低于 1 万的员工,加薪 20%。如果分开执行则会出现计算两次的现象
    UPDATE Salaries
    SET salary = CASE WHEN salary >= 10000 THEN salary * 0.9
    WHEN salary < 10000 THEN salary * 1.2
    ELSE salary END;
    

As重命名

  1. 简介:

    1. (Alias)可以为表名称或列名称指定别名。

    2. 别名用于为表或表中的列提供临时名称,数据库中的实际表名不会更改

    3. 别名通常用于使列名更具可读性。

      1. 在下列情况下使用别名是有用的:
        • 查询涉及多个表
        • 用于查询函数
        • 需要把两个或更多的列放在一起
        • 列名长或可读性差
    4. 一个别名只存在于查询期间。

    5. 由于执行顺序的原因 select 中的As 不可以在 where \ group by 中出现

      1. 用as别名 做where条件,报错未知的列 1054

      需求:SELECT a AS b WHRER b=1; //这样使用会报错,说b不存在。

      因为mysql底层跑SQL语句时:where 后的筛选条件在先, as B的别名在后。所以机器看到where 后的别名是不认的,所以会报说B不存在。

      这个b只是字段a查询结果的一个别名

    如果非要用B做筛选条件的话:解决方案:外边再嵌套一层。
    select * from(

     select A as B from table
    

    ) t

    where t.B = XXX – 任意的筛选条件

    如果不嵌套,只能用A做筛选条件了

    1. as 中文 不需要引号
  2. 语法

    1. SELECT column_name AS alias_name FROM table_name as WHERE [condition];
    2. 如果别名包含空格,则需要双引号或方括号:SELECT CustomerName AS Customer, ContactName AS [Contact Person]
      FROM Customers;

CREATE DATABASE

  1. 用于创建数据库,数据库名称始终应该是唯一的;在创建任何数据库之前,请确保拥有管理权限
  2. 语法 CREATE DATABASE dbname;

动态更新

  1. mysql 支持 update ,insert
  2. Hive SQL 建立动态分区

约束 CONSTRAINTS

  1. 说明

    SQL约束用于指定表中数据的规则。作用于数据表中列上的规则,用于限制表中数据的类型。约束的存在保证了数据库中数据的精确性和可靠性。

    • 约束有列级和表级之分,列级约束作用于单一的列,而表级约束作用于整张数据表。
    • 约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
  2. 完整性约束

    完整性约束用于保证关系型数据库中数据的精确性和一致性。对于关系型数据库来说,数据完整性由参照完整性(referential integrity,RI)来保证。

    有很多种约束可以起到参照完整性的作用,这些约束包括主键约束(Primary Key)、外键约束(Foreign Key)、唯一性约束(Unique Constraint)以及上面提到的其他约束。

    如果没有为约束提供一个名字,那么ORACLE会分配一个系统生成的唯一名字,以SYS_开头,你可以使用关键字CONSTRAINTS后面跟随相关的约束名字来为约束指定名字.

  3. 语法

    1.主键约束
    添加:alter table  table_name add primary key (字段)
    删除:alter table table_name drop primary key
    2.非空约束
    添加:ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <数据类型> NOT NULL;
    注意:添加非空约束的这一列的值不能已经存在空值
    删除:ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <数据类型> NULL;
    3.唯一约束
    添加:alter table table_name add unique 约束名(字段)
    删除:alter table table_name drop key 约束名
    4.自动增长
    添加:alter table table_name  modify 列名 int  auto_increment
    删除:alter table table_name modify 列名 int  
    5.外键约束
    添加:alter table table_name add constraint 约束名 foreign key(外键列) 
    references 主键表(主键列)
    删除:
    第一步:删除外键
    alter table table_name drop foreign key 约束名
    第二步:删除索引
    alter  table table_name drop  index 索引名
    [^1]: 
    约束名和索引名一样
    6.默认值
    添加:alter table table_name alter 列名  set default '值'
    删除:alter table table_name alter 列名  drop default
    
    
    

INDEX 索引

  1. 介绍

    索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时。索引能够轻易将查询性能提高好几个数量级。

    • 原理

      通过数据结构不断地缩小想要获取数据的范围。相当于字典:先定位到章,然后定位到该章下的一个小节,然后找到页数。

    • 索引的数据结构

      • hash类型的索引:查询单条快,范围查询慢
      • btree类型的索引:[b+树](https://onedrive.live.com/view.aspx?resid=36F967217A52BE25%21151&id=documents&wd=target%28SQL1.one%7CD7A9AF92-E95A-4822-B82D-020BC698D968%2F%29
        onenote:https://d.docs.live.net/36f967217a52be25/文档/数据分析/SQL1.one#24.索引&section-id={D7A9AF92-E95A-4822-B82D-020BC698D968}&page-id={AEB9F2E9-38DC-4D29-B5A3-CA60E5C03A2C}&object-id={37CD1929-746A-4A37-9395-F92D3B0F6F5F}&5A),层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)
    • 不同的存储引擎支持的索引类型也不一样

  2. 索引分类

    1. 普通索引index :加速查找
    2. 唯一索引
      主键索引:primary key :加速查找+约束(不为空且唯一)
      唯一索引:unique:加速查找+约束 (唯一)
    3. 联合索引
      -primary key(id,name):联合主键索引
      -unique(id,name):联合唯一索引
      -index(id,name):联合普通索引
    4. 全文索引fulltext :用于搜索很长一篇文章的时候,效果最好。
    5. 空间索引spatial :了解就好,几乎不
  3. 什么时候应当避免使用索引?

    • 小的数据表不应当使用索引;
    • 需要频繁进行大批量的更新或者插入操作的表;
    • 如果列中包含大数或者 NULL 值,不宜创建索引;
    • 频繁操作的列不宜创建索引。
  4. 注意

    1. 一定是为搜索条件的字段创建索引

      创建单列索引还是聚簇索引,要看每次查询中,哪些列在作为过滤条件的 WHERE 子句中最常出现。

      如果只需要一列,那么就应当创建单列索引。如果作为过滤条件的 WHERE 子句用到了两个或者更多的列,那么聚簇索引就是最好的选择。

    2. 在表中已经有大量数据的情况下,建索引会很慢,且占用硬盘空间,

    3. 索引能够提高 SELECT 查询和 WHERE 子句的速度,但是却降低了包含 UPDATE 语句或 INSERT 语句的数据输入过程的速度。插入删除更新都很慢,只有查询快

    4. 索引的创建与删除不会对表中的数据产生影响

    5. 同 UNIQUE 约束一样,索引可以是唯一的。这种情况下,索引会阻止列中(或者列的组合,其中某些列有索引)出现重复的条目

  5. 创建

    1. 使用  CREATE INDEX index_name ON table_name; 语句,该语句允许对索引命名,指定要创建索引的表以及对哪些列进行索引,还可以指定索引按照升序或者降序排列。

    2. 单列索引

      单列索引基于单一的字段创建,其基本语法如下所示:

      CREATE INDEX index_name ON table_name (column_name);

    3. 唯一索引

      唯一索引不止用于提升查询性能,还用于保证数据完整性。唯一索引不允许向表中插入任何重复值。其基本语法如下所示:

      CREATE UNIQUE INDEX index_name on table_name (column_name);

    4. 聚簇索引:

      聚簇索引在表中两个或更多的列的基础上建立。其基本语法如下所示:

      CREATE INDEX index_name on table_name (column1, column2);

    5. 隐式索引:

      隐式索引由数据库服务器在创建某些对象的时候自动生成。例如,对于主键约束和唯一约束,数据库服务器就会自动创建索引。

  6. 添加索引

    1. ALTER table tablename ADD INDEX indexname(columname)
  7. 删除

    1. DROP INDEX

      DROP INDEX table_name.index_name;

删除表DROP

  1. DROP DATABASE语句已用于删除数据库、表
  2. 语法:
    1. DROP DATABASE database_name

修改表ALTER

  1. 说明:用于在现有表中添加,删除或修改列。也可以修改数据库(一般不)

  2. 语法

    1. 修改表名: alter table旧表名 rename to 新表名

    2. 修改表类型: alter table表名 modify 列名 数据类型

      ALTER TABLE 表名 MODIFY [COLUMN] 字段名 新数据类型 新类型长度 新默认值 新注释;

      -- COLUMN关键字可以省略不写
      alter  table table1 modify  column column1  decimal(10,1) DEFAULT NULL COMMENT '注释';
      -- 能修改字段类型、类型长度、默认值、注释
      
    3. 增加字段: alter table表名 add[column] column definition[ first/ after某一列名]

    4. 删除字段: alter table表名 drop[column列名

    5. 字段改名: ALTER TABLE 表名 CHANGE [column] 旧字段名 新字段名 新数据类型;(first; after某一列名

      alter  table table1 change column1 column1 varchar(100) DEFAULT 1.2 COMMENT '注释'; -- 正常,此时字段名称没有改变,能修改字段类型、类型长度、默认值、注释
      alter  table table1 change column1 column2 decimal(10,1) DEFAULT NULL COMMENT '注释' -- 正常,能修改字段名、字段类型、类型长度、默认值、注释
      alter  table table1 change column2 column1 decimal(10,1) DEFAULT NULL COMMENT '注释' -- 正常,能修改字段名、字段类型、类型长度、默认值、注释
      alter  table table1 change column1 column2; -- 报错 
      
    6. 修改字段排序:[ first/ after某一列名

    7. 修改表的字符集为gbk

      alter table user character set gbk;

    8. 更改字段的数据类型,语法:

      1. SQL Server / MS Access:

        ALTER TABLE table_name ALTER COLUMN column_name datatype

      2. MYSQL / Oracle:

        ALTER TABLE table_name MODIFY COLUMN column_name datatype

    9. 修改数据库字符集:alter database database_name character set gbk;一般情况下不会

插入行INSERT INTO

在表中插入数据

  1. 语法

    单行:INSERT INTO 表名称 VALUES (值1, 值2,…);也可以指定所要插入数据的列:INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)

    多行:不指定列时要确保值的顺序与表中的列顺序相同INSERT INTO table_name VALUES (1行, 2行,3行, …);

  2. insert ignore into

    当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉

  3. insert … select … where not exist
    根据select的条件判断是否插入,可以不光通过primary 和unique来判断,也可通过其它条件

  4. Insert into select 使用另一个表填充一个表

    1. 查询的字段与本表要插入数据的字段是一一对应的。
    2. INSERT INTO first_table_name [(column1, column2, … columnN)] SELECT column1, column2, …columnN FROM second_table_name [WHERE condition];

删除行DELETE

  1. 作用:删除表中现有记录。

  2. 语法:

    DELETE FROM table_name WHERE condition;

    DELETE * FROM table_name;

  3. 注意

    1. SQL DELETE 语句中的 WHERE 子句! WHERE子句指定需要删除哪些记录。如果省略了WHERE子句,表中所有记录都将被删除!

    2. 处理效率:drop>trustcate>delete

    3. drop删除整个表;trustcate删除全部记录,但不删除表;delete删除部分记录

      删除表中的所有行,而不需要删除该表。这意味着表的结构、属性和索引将保持不变

    4. delete不影响所用extent,高水线保持原位置不动;trustcate会将高水线复位。

更新行UPDATE

  1. 作用:

    UPDATE 语句用于更新表中已存在的记录。还可以使用AND或OR运算符组合多个条件。

  2. 语法

    UPDATE table_name SET column1 = value1, column2 = value2, … WHERE condition;

  3. 注意

  4. WHERE子句指定哪些记录需要更新。如果省略WHERE子句,所有记录都将更新

  5. 实例

    UPDATE Customers SET ContactName = ‘Alfred Schmidt’, City= ‘Frankfurt’
    WHERE CustomerID = 1;

限制行TOP/LIMIT

  • SELECT TOP 子句用于指定要返回的记录数量。在包含数千条记录的大型表上很有用。返回大量记录会影响性能。

  • 注:并不是所有的数据库系统都支持SELECT TOP子句。MySQL支持LIMIT子句来选择有限数量的记录,而Oracle使用ROWNUM。

    • limit [offset], [rows]

    • LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)

    • 语法:

      用在 SELECT 语句 末尾

      • 一个参数

        select * from a,b where a.tid = b.id and a.tid>500000 limit 200;

      • 两个参数

        select tid from a limit 50000,200

插入into

  • 定义:从一个表中复制数据,然后将数据插入到另一个新表中。用IN子句来复制表到另一个数据库中:

  • 把所有的列都复制到新表中:

    SELECT * INTO newtable [IN externaldb] FROM table1;

  • 只复制希望的的列插入到新表中:

    SELECT column_name(s) INTO newtable [IN externaldb] FROM table1;

条件WHERE

  1. Where之后不能以函数作为条件,比如 count

  2. WHERE 子句 用于过滤记录提取满足指定标准的记录。WHERE子句不仅用于- -

    • SELECT语法

      句法:SELECT [*] FROM [TableName] WHERE [condition1] [AND [OR]] [condition2]…

    • UPDATE

      UPDATE “table_name” SET “column_1” = [new value] WHERE “condition”;

    • DELETE

      DELETE FROM “table_name” WHERE “condition”;

ORDER BY排序

  1. SELECT field1field2, …fieldN table_name1 table_name2,…ORDER BY field1, [field2… ASC|DESC

  2. 语法

    1. 用于对结果集按照一个列或者多个字段进行排序。

      oder by 多个不需要括号

    2. 默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。

      关键字ASC=Ascending 升序 ; 关键字DESC=Descending 降序

    3. Order By +Limit 找出一列中最高/ 最低值
      Select prod_price from products ORDER BY prod_price DESC LIMIT 1;

    4. **位置靠后:**可以使用 where like等 但不能放在 where 前,通常是所有关键字中最后一个执行的关键字。

    5. 慎用,因为任何查询使用这个关键字后,查询效率都会降低。

    6. 可以用字段的位置 来代替 字段名 ORDER BY 2 DESC 代替 ORDER BY avg_score DESC

  3. 语法

    SELECT column_name,column_nam FROM table_name ORDER BY column_name,column_name ASC|DESC;

TRUNCATE删除全部记录

  1. 作用:

    删除全部记录,但不删除表。实际是:将直接删除原来的表, 并重新创建一个表, 因此执行速度比delete快.

  2. 注意:

    1. 在使用truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。
    2. 如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;
    3. 如果想保留表而将所有数据删除,如果和事务无关,用truncate即可;
    4. 如果和事务有关,或者想触发trigger,还是用delete;
    5. 如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
  3. 语句

    TRUNCATE TABLE table_name

INTERSECT

  1. 说明:组合两个SELECT语句,但只能返回与第二个SELECT语句中的一个相同的第一个SELECT语句中的行。

EXCEPT

  1. 说明: 组合两个SELECT语句,并返回第一个SELECT语句中没有第二个SELECT语句返回的行

USE 选择数据库

当SQL Schema中有多个数据库时,在开始操作之前,需要选择一个执行所有操作的数据库。

  1. 句法

    USE DatabaseName;

  2. 注意

    USE语句的基本语法如下所示,数据库名称在RDBMS中必须是唯一的:

  3. 案例:

    • 查看可用的数据库:SHOW DATABASES;
      ±-------------------+
      | Database |
      ±-------------------+
      | information_schema |
      | AMROOD |
      | TUTORIALSPOINT |
      | mysql |
      | orig |
      | test |
      ±-------------------+
      6 rows in set (0.00 sec)
    • 选择数据库:USE AMROOD;

RENAME

  1. 语法:
    1. SQLserve:alter table table_name rename to tables_nem_name
    2. MySQL:rename table 表名 to 新表名;

DEFAULT 约束

  1. 提供该列数据未指定时所采用的默认值

  2. 语法:

    CREATE TABLE Persons ( City varchar(255) DEFAULT ‘Sandnes’ )

    1. 用类似 GETDATE() 这样的函数:CREATE TABLE Orders (OrderDate date DEFAULT GETDATE() )
    2. 当表已被创建时:
      1. **MySQL:**ALTER TABLE Persons ALTER City SET DEFAULT ‘SANDNES’
      2. **SQL Server / MS Access:**ALTER TABLE Persons ADD CONSTRAINT DF_Persons_City DEFAULT(‘SANDNES’) FOR City注:DF_Persons_City 为我们创建的默认约束的名称 约束名称一般为:约束类型简称_表名_列名
    3. 撤销
      1. **MySQL:**ALTER TABLE Persons ALTER City DROP DEFAULT
      2. **SQL Server / Oracle / MS Access:**ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT

UNIQUE 约束

  1. 保证列中的所有数据各不相同

  2. 语法:CREATE TABLE Persons ( P_Id int NOT NULL UNIQUE )

主键约束

  1. 唯一标识数据表中的行/记录
  2. PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
  3. CREATE
    • **MySQL:**CREATE TABLE Persons ( P_Id int NOT NULL,PRIMARY KEY (P_Id) )
    • SQL Server / Oracle / MS Access: CREAT TABLE Persons ( P_Id int NOT NULL PRIMARY KEY)
    • 定义多个列的 PRIMARY KEY 约束:
      • CREATE TABLE Persons (P_Id int NOT NULL,
        LastName varchar(255) NOT NULL, CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName) )
  4. ALTER (MySQL / SQL Server / Oracle / MS Access)
    1. ALTER TABLE Persons ADD PRIMARY KEY (P_Id)
    2. ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName) **注释:**如果使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时
  5. Drop
    • **MySQL:**ALTER TABLE Persons DROP PRIMARY KEY
    • SQL Server / Oracle / MS Access::ALTER TABLE Persons
      DROP CONSTRAINT pk_PersonID

外键约束

  1. 唯一标识其他表中的一条行/记录

  2. 作用:

    • 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
    • FOREIGN KEY 约束用于预防破坏表之间连接的行为。
    • FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一
  3. CREATE

    • create table audit( EMP_no INT NOT NULL, foreign key(EMP_no) references employees_test(ID));
  4. ALTER (MySQL / SQL Server / Oracle / MS Access:)

    • ALTER TABLE Orders ADD FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
    • ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
  5. Drop:

    • MySQL:

      ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders

    • SQL Server / Oracle / MS Access:

      ALTER TABLE Orders DROP CONSTRAINT fk_PerOrders

CHECK 约束:此约束保证列中的所有值满足某一条件

  1. 作用:

    • CHECK 约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
    • ?如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
  2. creat

    • **MySQL:**CREATE TABLE Persons ( P_Id int NOT NULL,CHECK (P_Id>0))
    • SQL Server / Oracle / MS Access::CREATE TABLE Persons (P_Id int NOT NULL CHECK (P_Id>0)
    • 定义多个列的 CHECK 约束(MySQL / SQL Server / Oracle / MS Access:):CREATE TABLE Persons (P_Id int NOT NULL,City varchar(255),CONSTRAINT chk_Person CHECK (P_Id>0 AND City=‘Sandnes’) )
  3. ALTER:MySQL / SQL Server / Oracle / MS Access:

    • ALTER TABLE Persons ADD CHECK (P_Id>0)
    • ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City=‘Sandnes’)
  4. DROP:

    • SQL Server / Oracle / MS Access:

      ALTER TABLE Persons DROP CONSTRAINT chk_Person

    • MySQL:

      ALTER TABLE Persons DROP CHECK chk_Person

索引约束:用于在数据库中快速创建或检索数据

  1. DROP INDEX语句 已用于删除表中的索引:

    1. Access:

      DROP INDEX index_name ON table_name

    2. SQL Server:

      DROP INDEX table_name.index_name

    3. DB2 / Oracle:

      DROP INDEX index_name

    4. MySQL的DROP INDEX语法:

      ALTER TABLE table_name DROP INDEX index_name

AUTO INCREMENT约束

  1. 说明:

    在每次插入新记录时自动创建主键字段的值。Auto-increment 会在新记录插入表中时生成一个唯一的数字。 默认情况下,AUTO_INREMENT的起始值为1,每个新记录增加1。新记录,我们不需要为"ID"栏指定值(自动添加唯一值)

  2. 语法:

    1. 若要以其他值开始AUTO_INREMENT序列,请使用以下SQL语法:

      ALTER TABLE Persons AUTO_INCREMENT=100

    2. Access

      CREATE TABLE Persons ( ID Integer PRIMARY KEY AUTOINCREMENT ) 默认情况下,AUTOINCREMEN的起始值为1,每个新记录递增 1。指定“ID”栏以10开头,并递增5( AUTOINCREMENT(10,5))。

    3. Oracle

      使用序列( sequence )对象(该对象生成数字序列)创建自动增量( auto-increment )字段。

      CREATE SEQUENCE seq_person MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10

      上面的代码创建了一个名为seq_pean的序列( sequence) 对象,它以1开头,以1递增。此对象缓存10个值以提高性能。缓存选项指定要存储多少序列值以提高访问速度。

      要在"Persons" 表中插入新记录,我们必须使用nextval函数,该函数从seq_hor序列检索下一个值:

      INSERT INTO Persons (ID,FirstName,LastName) VALUES (seq_person.nextval,‘Lars’,‘Monsen’)

      上面的SQL语句在 “Persons” 表中插入一个新记录。“ID” 列从 seq_person 序列中分配下一个数字。“FirstName"栏设置为"Lars”,“LastName"栏设置为"Monsen”

  3. 实例

    CREATE TABLE Persons ( ID int NOT NULL AUTO_INCREMENT)

Views视图

  1. 说明:

    1. 视图是可视化的虚拟表,它不包含数据,只包含使用时动态检索数据的查询;
      提供了一种MySQL的SELECT语句层次的封装,可用来简化数据处理及重新格式化基础数据或保护基础数据;。视图是基于 SQL 语句的结果集的可视化表。包含行和列,就像真正的表一样。视图中的字段是一个或多个数据库中真实表中的字段。
  2. 视图总是显示最新数据!每当用户查询视图时,数据库引擎就使用视图的 SQL 语句重新构建数据。

    1. 利用视图简化,复杂的联结,将格式转换的语句封装为视图,之后使用的时候可以简单调用视图即可
    2. 每次使用都会进行对应的计算,因此会影响到性能
  3. CREATE VIEW 语句

    CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition

  4. 更新视图CREATE OR REPLACE VIEW

    CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition

  5. 撤销视图:DROP VIEW

    DROP VIEW view_name

  6. 使用视图与计算字段
    select prod_id,quantity,item_price,quantity*item_price AS expanded_price
    from orderitems
    where order_num =20005;

  7. 实例

    “Current Product List”(当前产品列表)视图从"Products"表中列出了所有正在使用的产品(未停产的产品)。

    CREATE VIEW [Current Product List] AS SELECT ProductID,ProductName FROM Products WHERE Discontinued=No

    查询上面视图:

    SELECT * FROM [Category Sales For 1997] WHERE CategoryName=‘Beverages’

SHOW查看数据的创建

  1. 查看数据的创建,获取一条指定了原表的结构、索引等信息的

  2. 语法:

    1. 查数据库创建语句

      SHOW CREATE TABLE

    2. 显示数据库

      SHOW DATABASES

    3. 有哪些数据:

      show tables

    4. 表的创建信息

      show create table tabName;

    5. 这张数据表里都有哪些字段(列)
      show colums from customers;

    6. 描述一下这张数据表

      describe customers;

      show status;

    7. 数据库的创建信息

      show create database crashcourse;

    8. 安全权限;show grants;

    9. show errors;

    10. show warnings;

DESC 查看表结构

以student(sid,sname,birthday,sex)的查看为例。

【方式一】:desc student;

     语法:desc 表名;---------------------用于查看表整体结构

【方式二】:describe student;

      语法:describe 表名;---------------------用于查看表整体结构;

【方式三】:show columns from student;

     语法:show columns from 表名;--------------------------用于查看表整体结构;

【方式四】:show create table student;

     语法:show create table 表名;--------------------------用于查看表整体结构;

【方式五】:show full fields from student;

      语法:show full fields from 表名;--------------------------------- 用于查看表整体结构;

【方式六】:show fields from student;

     语法:show fields from 表名;----------------------------用于查看表整体结构;

【方式七】:desc student sname;

      语法:desc 表名 成员名;--------------------------------用于查询表中的一部分; 

【方式八】:show index from student;

   语法:show index from 表名;------------------------------------用于查看表局部结构;这种显示不是很直观,也不是可以完全显示所有信息。

PROCEDURE创建储存过程

  1. 案例:

    #1. 准备表
    create table s1(
    id int,
    name varchar(20),
    gender char(6),
    email varchar(50)
    );
    \#2. 创建存储过程,实现批量插入记录
     delimiter $$ #声明存储过程的结束符号为$$
     create procedure auto_insert1()
     BEGIN
       declare i int default 1;
       while(i<3000000)do
         insert into s1 values(i,concat('egon',i),'male',concat('egon',i,'@oldboy'));
         set i=i+1;
       end while;
     END$$ #$$结束
     delimiter ; #重新声明分号为结束符号
    
    \#3. 查看存储过程
     show create procedure auto_insert1\G 
    
    \#4. 调用存储过程
     call auto_insert1();
    

TRIGGER触发器

  1. 什么是触发器

    当我执行一个事件时,同时也去执行另外一个事件。触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。

  2. 触发器语法

    CREATE TRIGGER <触发器名称>–触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
    { BEFORE | AFTER }–触发器有执行的时间设置:可以设置为事件发生前或后。
    { INSERT | UPDATE | DELETE }–同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。
    ON <表名称>–触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。
    FOR EACH ROW–触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
    <触发器SQL语句>–触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。
    类型
    SQL Server 触发器
    SQLite 触发器(Trigger)BEGIN与END() 触发器执行的内容写出 BEGIN与END 之间,begin和end间的代码块的语句要写分号,否则不通过。

面试

基础

  1. 数据库事务的四个特性及含义

  2. Mysql的技术特点是什么?

    答:Mysql数据库软件是一个客户端或服务器系统,其中包括:支持各种客户端程序和库的多线程SQL服务器、不同的后端、广泛的应用程序编程接口和管理 工具。

  3. 无法登录MySQL会有哪写原因导致?答

    1. 服务未启用
    2. 远程连接权限被关或一直为开放。
    3. 登录mysql时的用户没有登录权限
    4. 客户端与服务端的端口不一致
    5. 网络原因导致的通信故障,或服务端防火墙未开放数据库端口。
  4. CHAR和VARCHAR的区别?

    答: CHAR和VARCHAR类型在存储和检索方面有所不同 。CHAR列长度固定为创建表时声明的长度,长度值范围是1到255当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。VARCHAR和CHAR的使用方面在于设计表之初的设计,两者各有千秋,VARCHAR比CHAR更省空间,但效率上略微的低于CHAR。

  5. drop,delete与truncate的区别

    答:

    • 方式

      drop直接删掉表 truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据,可以加where字句。**

    • 恢复

      DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作

      TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

    • 内存

      表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。

    • 效率

      一般而言,drop > truncate > delete

    • 应用范围。

      TRUNCATE 只能对TABLE;DELETE可以是table和view

      TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。

  6. 公司的数据库现不支持emoji表情,如何解决?

    如果是utf8字符集的话,需要升级至utf8_mb4即可。

  7. 描述下过往工作经验中mysql数据库的开发规范。

  8. 如何通过Unix shell 登录 MySQL

    1. 答:/bin/mysql -h hostname | host_ip -u {userName} -p port
  9. LIKE声明中的%和_是什么意思?

    答:%对应于0个或更多字符,_只是LIKE语句中的一个字符。

  10. 如何在Unix和Mysql时间戳之间进行转换?

    答: UNIX_TIMESTAMP是从Mysql时间戳转换为Unix时间戳的

    FROM_UNIXTIME是从Unix时间戳转换为Mysql时间戳的命令

  11. 列对比运算符是什么?

    答:在SELECT语句的列比较中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR或LIKE运算符。

  12. MySQL查询语句中是否区分大小写?

    答:要根据操作系统而定。windows中的MySQL查询语句无需区分大小写。但在Linux系统中需要区分大小写。

    在Linxu系统中的规则如下:

    1、数据库名与表名是严格区分大小写的;

    2、表的别名是严格区分大小写的;

    3、列名与列的别名在所有的情况下均是忽略大小写的;

    4、变量名也是严格区分大小写的;

  13. 什么样的对象可以使用CREATE语句创建?

    答:DATABASE、EVENT、FUNCTION、INDEX、PROCEDURE

    TABLE、TRIGGER、USER 、VIEW

  14. MYSQL支持事务吗?

    答:在缺省模式下,MYSQL是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql是不支持事务的。

    但是如果你的MYSQL表类型是使用InnoDB Tables 或 BDB tables的话,你的MYSQL就可以使用事务处理,使用SET AUTOCOMMIT=0就可以使MYSQL 允许在非autocommit模式,在非autocommit模式下,你必须使用COMMIT来提交你的更改,或者用ROLLBACK来回滚你的更改。

  15. MYSQL数据表在什么情况下容易损坏?

    答:服务器突然断电导致数据文件损坏。 强制关机,没有先关闭mysql 服务等。

  16. 超键、候选键、主键、外键

    超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选 键和主键。

    候选键:是最小超键,即没有冗余元素的超键。

    主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值 (Null)。

    外键:在一个表中存在的另一个表的主键称此表的外键。

  17. 什么是事务?什么是锁?

    事务:就是被绑定在一起作为一个逻辑工作单元的SQL 语句分组,如果任何一个语句作失败那么整个操作就被失败,以后操作就会回滚到操作前状态, 或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID 测试,即原子性,一致性,隔离 性和持久性。

    锁:在所以的 DBMS 中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不 能使用某些数据或数据结构。当然锁还分级别的。

  18. 出现Lock wait timeout exceeded; try restarting transaction是什么原因?

    是锁等待超时。是当前事务在等待其它事务释放锁资源造成的。通过select * from information_schema.innodb_trx;可以查看到有哪些事务未释放资源。通过kill+线程号可以解决。例如kill+79干掉对应的线程。

  19. Nonrepeatable Read是什么意思?与数据库、MySQL有什么关系?

    Nonrepeatable Read – 不可重复读,是一种事务线程安全的问题。在MySQL中仅是一种隔离级别,MySQL的默认隔离级别是 – 可重复读 – Repeatable read

语法

limit

  1. 一个6亿的表a,一个3亿的表b,通过外键tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。

    解析:此题可以的关键是一个limit。

    答:

    1、如果A表TID是自增长,并且是连续的,B表的ID为索引

    答:select * from a,b where a.tid = b.id and a.tid>500000 limit 200;

    2、如果A表的TID不是连续的,那么就需要使用覆盖索引.TID要么是主键,要么是辅助索引,B表ID也需要有索引。

    答:select * from b , (select tid from a limit 50000,200) a where b.id = a .tid;

Not in \Distinct

  1. 用一条SQL 语句 查询出每门课都大于80 分的学生姓名

    namekechengfenshu
    张三语文81
    张三数学75
    李四语文76
    李四数学90
    王五语文81
    王五数学100
    王五英语90

    建表语句:

    CREATE TABLE chengji(

    name varchar(20),

    kecheng varchar(20),

    fenshu int

    );

    INSERT INTO chengji VALUES(‘张三’,‘语文’,81),(‘张三’,‘数学’,75),(‘李四’,‘语文’,76),(‘李四’,‘数学’,90),(‘王五’,‘语文’,81),(‘王五’,‘数学’,100),(‘王五’,‘英语’,90);

    SELECT DISTINCT NAME FROM chengji WHERE NAME NOT IN (SELECT DISTINCT NAME FROM chengji WHERE fenshu <=80);

其他

1.事务

  1. 事务

    一个事情可以分为多个步骤,这些步骤要么全部成功,要么全部失败,这件事情就可以称之为一个事务。一个sql语句,就是一个事务。四个特性:(ACID:ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。)

    1. 原子性:要么全部完成,要么全部不完成
    2. 一致性:事务执行前后,数据在完整性上仍然保持一致
    3. 隔离性:避免脏数据,两个事务相互隔离。通过串行化或序列化请求,保证系统在同一时间仅有一个请求用于同一数据
    4. 持久性:不回滚,一旦提交,对数据库所作的更改便持久的保存在数据库之中,并不会被回滚

2. 使用存储过程

  1. 本质: 存储过程本质是函数;

  2. 调用CALL存储过程的执行称为调用
    CALL productpricing(@pricelow,@pricehigh,@priceaverage) #计算并返回产品最低、最高和平均价格

3.使用游标

暂时卡在open ordernumbers;P188

4.使用触发器

你想要某条语句在事件发生时自动自行
MySQL响应特定语句而自动执行的一条MySQL语句(或位于BEGIN和END之间的一组语句,

包括DELETE,INSERT,UPDATE,其他语句不支持触发器
只有表支持触发器(视图、临时表不支持),每个表最多支持6个触发器(每条INSERT、UPDATE、DELETE的之前和之后),单一触发器不能与多个事件、或多个表关联
创建
CREATE TRIGGER
CREATE TRIGGER newproduct
AFTER INSERT ON products
FOR EACH ROW
SELECT ‘product added’;
每插入一行都显示 ‘product added’
删除
DROP TRIGGER newproduct;

5.安全管理

  1. 访问控制
    不要使用root
    通常防止的是无意的错误
    不同的需求不同的账号权限
  2. 管理用户
    创建用户账号
    use mysql; --一个默认数据库
    select user from user;–user用来存放用户信息
    create user ben identified by ‘passwd123’;–使用grant或者insert grant也可以创建用户,但是create user是最简单清晰的
    rename user ben to max;–重命名一个用户账号
    删除用户账号
    drop user max;–删除用户账号即想干权限
    设置访问权限
    show grants for max; --显示账号max 的权限
    grant select on crashcourse.* to max; --为账号max赋予指定数据库的访问权限(只读)
    show grants for max;–确认这个更改
    revoke select on crashcourse.* from max;
  3. –grant 授予
  4. –revoke 废除,取消,撤回
    grant和revoke 在几个层次上控制访问权限
    权限列表
  5. 更改口令
    set password for max = password(“password”) --必须传递到函数中
    set password = password(‘newpasswd123’)–重设自己的密码

6. 数据库维护

  1. 备份数据
    刷新未写数据
    flush tables;–保证所有数据都被写到磁盘(包括索引数据)
    方案1
    mysqldump,转储所有数据库内容到某个外部文件
    方案2
    mysqlhotcopy从一个数据库复制所有数据
    方案3
    backup table或者select into outfile转储所有数据到某个外部文件
  2. 进行数据库维护
    analyze table --用来检查表键是否正确
    check table --用来针对许多问题对表进行检查
    repair table --修复有问题的表
    optimize table --删除大量数据后收回所用的空间
  3. 诊断启动问题
    mysql服务器自身通过在命令行上执行mysqld启动
    重要命令选项
    –help 显示帮助
    –safe-mode 装载减去某些最佳配置的服务器
    –verbose显示全文本消息
    –version显示版本信息
    查看日志文件
    错误日志
    包含启动和关闭问题以及任意关键错误的细节
    通常名为hostname.err位于data目录中
    查询日志
    记录所有mysql活动,在 诊断问题时非常有用,
    通常名为hostname.log位于data目录中
    二进制日志
    记录更新过数据的所有语句,通常名为hostname-bin位于data目录内
    缓慢查询日志
    记录执行缓慢的任何查询,往往用来协助优化数据库。通常名为hostname-slow.log,位于data目录中
    备注
    使用flush logs语句刷新和重新开始所有日志文件
    改善性能

7.变量

variable,内存中一个特定的位置,用来临时存储数据
所有mysql的变量都要以 @开始

Hive

Hadoop的一个数仓工具。提供SQL查询的语音:Hive SQL。Hadoop解决大数据储存和大数据分析,但系统启动慢,计算量小时响应速度相对于MySQL慢。目前通用的方式是:通过 Hive SQL对原数据集中处理,将处理好的数据导入MySQL中,这样前端能快速调用。

MYSQL

安装

环境:mac

  1. 安装教程

    1. 安装包:第一个

    2. 环境变量配置

  2. 错误处理

    1. 报错 ERROR 1064 (42000) 语法错误
    2. 报错 ERROR 1045 (28000) 解决:密码重置
    3. 报错: 1175错误–mysql无法执行update或者delete命令
  3. 数据库操作

    1. 连接 mysql -u root -p

      环境变量配置好了,在终端输入mysql -u root -p可以登录mysql,不然必须切换到/usr/local/mysql/bin目录下

    2. 创建 create database数据库名

    3. 删除 drop database数据库名

    4. 查看 show database

      1. 使用命令show global variables like ‘port’;查看端口号

      2. 查看mysql基本信息:status;

    5. 选择use数据库名- show tables

    6. 退出:quit或exit

  4. 学习网站:

    1. W3C
  5. mySQL技能体系

    1. 创建/连接
    2. 增删查改
    3. 排序分组
    4. 索引
    5. 函数运算

  1. 0-9 ↩︎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 的相关文章

  • SQL Server 标识列值从 0 而不是 1 开始

    我遇到了一个奇怪的情况 数据库中的某些表的 ID 从 0 开始 即使 TABLE CREATE 的 IDENTITY 1 1 也是如此 对于某些表来说是这样 但对于其他表则不然 它一直有效到今天 我尝试过重置身份列 DBCC CHECKID
  • SQL Server查询麻烦,多对多关系

    不知道如何用一行字来表达这个问题 对标题表示歉意 我的数据库中有3个表 例如 Shop Item 商店库存 Shop 和 Item 具有多对多关系 因此 ShopStock 表将它们链接起来 ShopStock 中的字段是 ID ShopI
  • 从两个表中搜索然后删除

    我有两个包含成员数据的表 与 member id 列链接 我需要搜索所有记录email列以 pl 结尾 然后 我需要为此删除两个表中的所有记录 基于 member id 是否可以通过一条 SQL 语句完成此操作 SELECT member
  • MySQL如何根据字段是否存在来插入新记录或更新字段?

    我正在尝试实现一个评级系统 在数据库表中保留以下两个字段 评级 当前评级 num rates 迄今为止提交的评分数量 UPDATE mytable SET rating rating num rates theRating num rate
  • 我不确定在 SQL 中声明这些变量时出了什么问题

    我有以下代码 USE pricingdb go CREATE TABLE dbo Events 060107 2012 Date Time varchar 20 COLLATE SQL Latin1 General CP1 CI AS NU
  • 在同一个表上组合两个 SQL SELECT 语句

    我想结合这两个 SQL 查询 SELECT FROM Contracts WHERE productType RINsell AND clearTime IS NULL AND holdTime IS NOT NULL ORDER BY g
  • MySQL 子查询返回多行

    我正在执行这个查询 SELECT voterfile county Name voterfile precienct PREC ID voterfile precienct Name COUNT SELECT voterfile voter
  • 是否可以使用“WHERE”子句来选择SQL语句中的所有记录?

    晚上好 我很好奇是否可以在 SQL 语句中创建一个 WHERE 子句来显示所有记录 下面一些解释 随机 SQL 语句 Java JSP示例 正常情况 String SqlStatement SELECT FROM table example
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • 获取查询的行号

    我有一个查询将返回一行 当表排序时 有什么方法可以找到我正在查询的行的行索引吗 我试过了rowid但当我期待第 7 行时却得到了 582 Eg CategoryID Name I9GDS720K4 CatA LPQTOR25XR CatB
  • 将列的值添加到 LIKE 语句中?

    我有 3 个标签表 标签类别和使用过的标签 我想要获取所有标签的列表以及已使用标签的计数 所使用标签的格式是每个具有标签的文档 ID 的逗号分隔值 我一直在尝试类似的方法 但无法将tags tag 字段的值插入到LIKE 语句中 SELEC
  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7
  • 如何将自定义类型数组传递给 Postgres 函数

    我有一个自定义类型 CREATE TYPE mytype as id uuid amount numeric 13 4 我想将它传递给具有以下签名的函数 CREATE FUNCTION myschema myfunction id uuid
  • 使用MySQL计算单个表中借方和贷方的余额

    下面的 MySQL 表包含带有关联金额的借方或贷方 操作 如何选择具有非零 余额 的所有 CLIENT ID 我尝试将表连接到自身以计算所有借方和贷方总额 但有些东西无法正常工作 CLIENT ID ACTION TYPE ACTION A
  • Postgres、更新和锁定顺序

    我正在研究 Postgres 9 2 有 2 个更新 每个更新都有自己的事务 一个看起来像 UPDATE foo SET a 1 WHERE b IN 1 2 3 4 另一个也类似 UPDATE foo SET a 2 WHERE b IN
  • SQL Server 转换选择一列并将其转换为字符串

    是否可以编写一条从表中选择列并将结果转换为字符串的语句 理想情况下 我希望有逗号分隔的值 例如 假设 SELECT 语句看起来像这样 SELECT column FROM table WHERE column lt 10 结果是一列包含值的
  • SQL Group BY,每个组的前 N ​​个项目

    我有一个 SQL 查询 可以获取给定商店中销量最高的 5 件商品 SELECT TOP 5 S UPCCode SUM TotalDollarSales FROM Sales S WHERE S StoreId 1 GROUP BY S U
  • 在存储过程结束时显式删除本地临时表有什么好处?

    考虑以下伪 T SQL 代码 由存储过程执行 CREATE TABLE localTable
  • 外键引用多个表

    我有4张桌子 A ida name B ida B specific stuff C ida C specific stuff D ida D specific stuff 我希望另一个表 E 可以仅引用 B 或 C 而不是 D 我可以在其
  • 如何在动态查询中将行值连接到列名

    我正在开发一个允许配置问题和答案的应用程序 目前最多可以有 20 个答案 但也可能更少 我的结构如下 问题 ID FormId QuestionText AnswerField 1 1 Name Answer01 2 1 Address A

随机推荐

  • win10环境下python3安装pdfminer

    一 安装 1 首先下载源文件包 http pypi python org pypi pdfminer xff0c 解压 xff0c 然后命令行安装 xff1a python setup py install 2 下载pdfminer six
  • 杨辉三角形—省赛java

    十二届蓝桥杯省赛真题H题 杨辉三角形 题比较简单 xff0c 野路子直接干他 span class token keyword import span span class token namespace java span class t
  • C# 界面开发-登陆窗体(包括欢迎界面)

    我们在开发一个需要身份验证系统软件的时候 xff0c 一个必不可少的界面便是登陆界面 xff0c 只有我们在登陆界面中输入正确的用户名和密码 xff0c 才能登陆到主界面 xff0c 有时候可能还会加载系统资源 xff0c 所以还会增加一个
  • ROS系统中编写多个C++文件时,主文件调用其它文件函数或类时出现:对“xxxxxx“未定义的引用问题记录

    问题描述 主文件对其它文件内容调用时 xff0c 明明已经正确引用相关头文件 xff0c 并确保类和函数已被定义 xff0c 仍然出现下面问题 CMakeFiles span class token operator span robot
  • 使用sklearn学习决策树(Decision Tree)

    决策树模型 决策树 xff08 decision tree xff09 是一种基本的分类与回归方法 分类决策树模型是一种描述对实例进行分类的树形结构 决策树由结点 xff08 node xff09 和有向边 xff08 directed e
  • CTeX安装及使用

    1 关于 LaTeX和CTeX quad LaTeX是一种基于 的排版系统 xff0c 由美国计算机学家莱斯利 兰伯特 xff08 Leslie Lamport xff09 在20世纪80年代初期开发 xff0c 利用这种格式 xff0c
  • 深度强化学习(7)深度确定性策略梯度(DDPG)

    深度确定性策略梯度 xff08 DDPG xff09 1 从随机策略到确定性策略 首先 xff0c 我们先了解一下随机策略和确定性策略 随机策略的公式为 xff1a a
  • 强化学习(1)马尔科夫决策过程(MDP)

    强化学习 开始强化学习之前先来了解强化学习 深度学习 深度强化学习 监督学习 无监督学习 机器学习和人工智能之间的关系 如下图 xff1a 强化学习是机器学习的一个重要分支 xff0c 它试图解决决策优化的问题 所谓决策优化 xff0c 是
  • 深度强化学习(3)Prioritized Replay DQN

    Prioritized Replay DQN 在深度强化学习 xff08 2 xff09 Double DQN 中 xff0c 我们讲到了DDQN使用两个Q网络 xff0c 用当前Q网络计算最大Q值对应的动作 xff0c 用目标Q网络计算这
  • 封装使用axios进行接口请求

    一 安装axios npm install axios在main js引入 import axios from 34 axios 34 Vue use axios vue3使用createApp App config globalPrope
  • VMware+Ubuntu20.04安装指南

    1 首先下载VMware Workstation Player 16 xff0c 下载链接为 https customerconnect vmware com en downloads all products 2 下载完成后 xff0c
  • Java8流式操作——中间操作

    文章目录 什么是中间操作 xff1f 方法实践说明一 前提条件Person类Data类 二 操作filter 过滤distinct 去重 xff08 去除集合中重复的元素 xff09 sorted 排序 sorted 无参构造 sorted
  • 数据挖掘(Data Mining)扫盲笔记

    知识框架来源 xff1a 人工智能之数据挖掘 其他补充来源 xff1a 拿下Offer 数据分析师求职面试指南 数据分析实战45讲 Data Mining 概述篇基础认知挖掘对象常见任务 xff1a 模型分类问题与挑战十大经典算法 C4 5
  • 信息论笔记(需要编辑格式)

    主要来源 xff1a 吴军 信息论40讲 信息论介绍 世界上任何一个探索者都需要清楚三件事 我们现在的位置 我们的目标 以及通向目标的道路 哲学是一门生活的艺术 它帮助我们认清自己 它回答了第一个问题 至于每一个人的目标 我相信大家比我更清
  • 阿里云短信服务使用

    说明 这是用go语言实现的 xff0c 但说实话 xff0c 其实没啥影响 xff0c 不管什么语言都是这个套路 xff0c 所以无论你是学什么语言或者是用什么语言的都好 xff0c 看看总不亏 22年7 14下午14 xff1a 38 x
  • 数据分析思维扫盲

    知识来源 xff1a 接地气学堂1 前言 行文之初衷 xff0c 建立知识树 xff0c 因而不易速读 xff0c 请君悉知 宜为工具书 xff0c 按索引取之 独学而无友 xff0c 必孤陋寡闻 xff0c 请君赐教 xff0c 不吝感激
  • 高阶用户运营体系搭建

    这里写目录标题 第1章 理解用户运营本质1 什么是 用户运营 xff1f 2 一个 用户运营 重点关注什么 xff1f 3 怎么做好用户运营 xff1f 4 高阶用户运营体系搭建5 大规模用户运营体系的3大子系统6 用户留存的归因 活跃差模
  • 商品管理-运营指挥室 看板

    商品管理可视化项目 项目目标 梳理商品管理的整体业务流程 xff0c 调研数据的使用情况 xff0c 建立影响业务的 xff1a 销量 留存 sku数 断码等维度指标 xff0c 建立智能数据监控体系 工作范围 销量看板留存看板在售SKC看
  • Excel 的进阶学习

    文章目录 Excel 的进阶学习1 常用的 Excel 函数及用途1 关联匹配类2 清洗处理类3 逻辑运算类4 计算统计类5 时间序列类 2 基础1 快捷键2 数据组错误信息基本认识计算操作符 3 数据图展示 3 实战分析注意 Excel
  • SQL

    数据库 基本概念 1 xff0e 数据 定义 xff1a 描述事物的符号序列 xff0c 数据 xff08 Data xff09 是数据库中存储的基本对象 数据的种类 xff1a 数字 文字 图形 图像声音及其他特殊符号 数据举例 xff1