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——取得期望的积木

  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/maku/p/7093823.html
Copyright © 2011-2022 走看看