zoukankan      html  css  js  c++  java
  • SQL基础笔记

    数据库

    表的列(垂直方向)称为字段,表的行(水平方向)称为记录

    DDL(Data definition language数据定义语言):create/drop/alter

    DML(data manipulation language 数据操作语言):select/insert/update/delete

    DCL(data control language 数据控制语言):commit/rollback/grant(赋予用户操作权限)/revoke(取消用户的操作权限)

    u  数据类型的指定

    定长字符串:向char(8)类型的列中输入‘abc’的时候,会以‘abc     ’(abc后面有5个半角空格)的形式保存起来。

    可变长字符串:Varchar(8),输入‘abc’的时候保存的就是abc

    主键(primary key)约束:Create table primary key(table_id);把table_id指定为主键

    u  表的创建

    Create table tableName

    ( id char(4)  not null,

    Name varchar(20)  ,

    Primary key(id));

    u  表的删除

    Drop  table  tableName

    u  表定义的更新

    添加列:Oracle和Sql Server: Alter table tableName add columnName;

    Mysql: Alter table tableName add column columnName;

    Oracle: Alter table tableName add (columnName, columnName1, columnName2);

    删除列:Alter table tableName drop column columnName;(Oracle,sql Server,同上column可不写)

    向表table插入数据:mysql:

    start transaction

    Insert into tableName values(‘hehe’,1,2,3,4,);

    Commit;

    变更表名:

    Rename table tableName to tableN;

    查询基础

    Select 列名,…

    From 表名;

    u  在select 语句中使用distinct可以删除重复行。

    Sql:单行注释:--单行注释  。 多行注释:/*多行注释*/

    u  字符串类型的数据原则上按照字典顺序进行排序。不能与数字的大小顺序混淆

    u  希望选取null记录时,需要在条件 null运算符。希望选取不是null的记录时,需要在条件表达式中使用is not null运算符

    聚合和排序

    u  And运算优先于or运算执行,想要先执行or运算时可以使用括号。

    u  Count:计算表中的记录数(行数)

    Sum:计算表中数值列的数据合计值

    Avg:计算表中任意列中数据的最大值

    Max:求出表中任意列中数据的最大值

    Min:求出表中任意列中数据的最小值

    u  Count函数的结果根据参数的不同而不同。Count(*)会得到包含null的数据行数,而count(<列名>)会得到null之外的数据行数。

    u  Max/min函数几乎适用于所有数据类型的列。Sum/avg函数只适用于数值类型的列

    u  想要计算值得种类时,可以在count函数的参数中使用distinct

    u  在聚合函数(将多行汇总为一行,输入多行输出一行)的参数中使用distinct,可以删除重复数据。

    u  聚合键(在group by子句中指定的列)中包含null时,在结果中会以“不确定”行(空行)的形式表现出来。

    使用group by子句时,select子句中不能出现聚合键之外的列名。

    在 group by 子句中不能使用select子句中定义的别名。

    Group by子句结果的显示是无序的。

    只有select子句和having子句(以及order by子句)中能使用聚合函数。

    u  Having子句要写在group by子句之后

    在order by句中可以使用select子句定义的别名,having和group by 不可以

    在order by子句中可以使用select子句未使用的列和聚合函数。

    数据更新

    Insert into 表名(列名,列名)values(值,值)

    u  数据备份(复制):Insert into表(列名,列名)select 列名,列名 from 表

    Delete语句删除的对象是记录(行),不是表或者列。(truncate舍弃)

    Update 表名 set 列名 = 表达式 where 条件

    Commit 提交处理

    Rollback  取消处理

    不是自动提交,使用delete语句,可以用rollback 取消事务处理,恢复表中的数据

    u  事务

    ACID:原子性,一致性,隔离性,持久性

    复杂查询

    Create view 视图名称(列名,列名)

    AS

    Select语句

    多重视图会降低sql的性能,要尽量避免在视图的基础上创建视图

    定义视图不能使用order by子句;视图和表一样,数据行都是没有顺序的

    l  视图可以被更新的条件:

    ①       Select 子句中未使用distinct

    ②       From子句中只有一张表

    ③       未使用group by 子句

    ④       未使用having 子句

    视图和表需要同时更新,通过聚合得到的视图无法进行更新

    l  删除视图

    Drop view 视图名(列名,列名)

    l  子查询

    子查询作为内查询会首先执行

      随着子查询嵌套层数的增加,sql语句会变得越来越难读懂,性能也会越来越差。应避免使用多层嵌套的子查询。

    标量子查询:必须且只能返回一行一列的结果(注意:不可以返回多行结果)

    Where子句中不能使用聚合函数

    l  在细分的组内进行比较时,需要使用关联子查询

    函数、谓词、case表达式

    u  函数种类

    l  算数函数(用来进行数值计算的函数)

    ①       ABS(数值):ABS计算绝对值的函数

    ②       MOD(被除数,除数):MOD是计算除法余数(剩余)的函数,是modulo的简称(SQLServer不支持)。

    ③       ROUND(对象数值,保留小数的位数):ROUND函数用来进行四舍五入操作。

    字符串函数(用来进行字符串操作的函数)

    ①       字符串1||字符串2:||函数,拼接(sqlserver(+)和Mysql(concat)无法使用)

    ②       Length(字符串):算出字符串的长度(字符串中包含多少个字符)(sqlserver(len)无法使用)

    ③       Lower(字符串):小写转换,只针对英文字母;反之,upper大写转换函数

    ④       Replace(对象字符串,替换前的字符串,替换后的字符串):可以将字符串的一部分替换为其他的字符串。

    ⑤       Substring(对象字符串 from 截取的起始位置 for 截取的字符数)(PostgreSQL,mysql支持)。Substr(对象字符串 from 截取的起始位置 for 截取的字符数)(oracle,db2专用语法)

    l  日期函数(用来进行日期操作的函数)

    ①  Select current_date(MySQL取得当前日期)

    Sqlserver:current_timestamp

    Oracle:select current date from dual(临时表)

    Db2:select current(半空格)date from sysibm.sysdummy1(临时表)

    ②  Select current_time(MySQL取得当前时间)

    Select cast(current_timestamp as time)as cur_time

    Oracle:select current_timestamp from dual;

    Db2:select current time from sysibm.sysdummy1

    ③  Select current_timestamp(mysql取得当前的日期和时间)

    Oracle:Select current_timestamp from dual

    Db2:select current timestamp from sysibm.sysdummy1

    ④  Extract(日期元素 from 日期):截取日期元素(返回是数值类型)

    l  转换函数(用来转换数据类型和值得函数)

    ①  Cast(转换前的值 as 想要转换的数据类型):类型转换(方便dbms内部处理开发的功能,而不是为了方便用户开发的功能)

    ②  Coalesce(数据1,数据2,数据3….):将null转换为其他值

    l  函数(用来进行数据聚合的函数)

    u  谓词

    谓词就是返回值为真值得函数

    ①  Like——字符串的部分一致查询

    dd%(以dd开头的所有字符串)

    %ddd%(包含ddd的字符串)

    %ddd(选取以字符串ddd结尾的记录)

    _(下划线)表示“任意1个字符”

    ②  Between——范围查询

    Between结果中会包含and左右两个临界值。

    ③  Is null、is not null——判断是否为null

    ④  In——or的简便用法

    ⑤  使用子查询作为in谓词的参数

    ⑥  Not in 和子查询

    Select 字段,字段

    From 表名

    Where 字段 not in(select子查询)

    ⑦  Exists

    通常指定关联子查询作为exist的参数

    作为exist参数的子查询中经常会使用select*

    使用Not exist 替换not in

    l  Case表达式(Oracle:decode    mysql:if)

    搜索case表达式

    Case when <判断表达式> then <表达式>

    When <判断表达式> then <表达式>

    When <判断表达式> then <表达式>

    .

    .

    .

    Selse <表达式>

    End

    集合运算

    l  表的加法——union(并集)

    集合运算符会除去重复的记录

    l  集合运算的注意事项

    ①       作为运算对象的记录的列数必须相同

    ②       作为运算对象的记录中列的类型必须一致

    ③       可以使用任何select语句,但order by子句只能在最后使用一次

    Union all(包含重复行的集合运算)

    Intersect (选取表中公共部分)(交集)

    Except(记录的减法)(差集)(oracle:minus  )

    l  联结(以列为单位对表进行联结)

    ①       内联结——inner join

    ②       外联结——outer join(left,right)

    外联结中使用left、right来指定主表。使用二者所得到的结果完全相同

    ③       交叉联结——cross join(笛卡尔积)

    SQL高级处理

    l  窗口函数

    窗口函数也称OLAP函数(online analytical processing,对数据库数据进行实时分析处理)(MySQL不支持)

    <窗口函数> over ([partition by<列清单>]

    Order  by<排序用例清单>)

      能够作为窗口函数使用的函数

    ①       聚合函数(sum、avg、count、max、min)

    Select 字段名,字段名,

    Avg(字段名)over (order by 字段 rows 2 preceding)as 字段名

    From 表名

    ©  Rows 2 preceding:截止到之前2行(也就是最靠近的3行)

    这样的统计方法称为移动平均(moving average)应用于对股市趋势的实时跟踪当中

    ©  Following(之后):截止到当前记录之后2行(最靠近的3行)类似preceding

    ©  两个order by:over中的order by只是用来决定窗口函数按照什么样的顺序进行计算的,对结果的排列顺序没有影响。要使结果按照某列的升序进行排列,可以在select语句的最后加上order by列名

    ©  将聚合函数作为窗口使用时,会以当前记录为基准来决定统计对象的记录。

     

    ②       Rank、dense_rank、row_number等专用窗口函数

    窗口函数兼具分组和排序两种功能

    通过partition by 分组后的记录集合称为“窗口”

    ²  专用窗口函数的种类

    ü  Rank 函数

    计算排序时,如果存在相同位次的记录,则会跳过之后的位次。(有3条记录排在第1位时:1位、1位、1位、4位)

    ü  Dense_rank函数

    同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。(有3条记录排在第1位时:1位、1位、1位、2位)

    ü  Row_number函数

    赋予唯一的连续位次(有3条记录排在第1位时:1位、2位、3位、4位)

    用于专用窗口函数无需参数,所以通常括号中都是空的

    原则上窗口函数只能在select子句中使用

    l  Grouping运算符

    Grouping运算符包含以下3种

    ①       Rollup——同时计算出合计值和小计值

    Select 字段名,字段名

    From 表名

    Group by rollup(字段名)(此处MySQL:group by 字段名 with rollup)

    Grouping(字段)as 字段名:grouping函数在其参数列的值为超级分组记录(合计行记录)所以产生的null时返回1,其他情况返回0;

    Cast(字段 as varchar(16)):为了满足case表达式所有分支的返回值必须一致的规定

    使用grouping函数能够简单地分辨出原始数据中的null和超级分组记录中的null。

    ②       Cube——用数据来搭积木(语法同rollup)

    ③       Grouping sets——取得期望的积木

  • 相关阅读:
    jeecg错误集锦之hql查询问题 java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.IdentNode
    jeecg错误集锦之hql查询问题 org.hibernate.hql.internal.ast.QuerySyntaxException: order_pay is not mapped [SELECT PayChannel as className ,count(PayChannel) FROM order_pay group by PayChannel]
    es6--解构赋值-对象
    es6--解构赋值
    es6--let和const命令
    es6--let和const命令
    vue双向绑定时添加.sync不起作用的原因
    构建父子组件时注意的问题
    小程序scroll-view组件补充
    css自定义属性
  • 原文地址:https://www.cnblogs.com/maku/p/7093823.html
Copyright © 2011-2022 走看看