sql必知必会读书笔记二

本文介绍了SQL的基础知识,包括字段拼接、各类SQL函数、聚合函数、COUNT函数的特点、HAVING与WHERE的区别、SQL语句的子句及顺序、自连接、自然连接、外连接等概念,同时涵盖了基本的CRUD操作、表的更新与删除、存储过程、事务处理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 1.拼接字段

    在SQL中的SELECT语句中,可使用一个特殊的操作符来拼接两个列。根据你所使用的DBMS,此操作符可用加号(+)或两个竖杠(||)表示。在mysql中使用concat函数。

     

    demoselect id,concat(name,'-',realname) from table

     

    2.sql函数

    sql函数不可移植

     

    3.大多数SQL实现支持以下类型的函数。

    用于处理文本字符串(如删除或填充值,转换值为大写或小写)的文本函数。

    用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。

    用于处理日期和时间值并从这些值中提取特定成分(如返回两个日期之差,检查日期有效性)的日期和时间函数。

    返回DBMS正使用的特殊信息(如返回用户登录信息)的系统函数。

     

    4.SQL聚集函数

    函  数

    说  明

    AVG()

    返回某列的平均值

    COUNT()

    返回某列的行数

    MAX()

    返回某列的最大值

    MIN()

    返回某列的最小值

    SUM()

    返回某列值之和

     

    5.COUNT()

    如果指定列名,则COUNT()函数会忽略指定列的值为空的行,但如果COUNT()函数中用的是星号(*),则不忽略。

     

    6.HAVINGWHERE的差别

    这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。

     

    7.SELECT子句及其顺序

    子  句

    说  明

    是否必须使用

    SELECT

    要返回的列或表达式

    FROM

    从中检索数据的表

    仅在从表选择数据时使用

    WHERE

    行级过滤

    GROUP BY

    分组说明

    仅在按组计算聚集时使用

    HAVING

    组级过滤

    ORDER BY

    输出排序顺序

     

    8.自连接

    SELECT c1.cust_id, c1.cust_name, c1.cust_contact
    FROM Customers AS c1,Customers AS c2
    WHERE c1.cust_name = c2.cust_name
     AND c2.cust_contact = 'Jim Jones';

     

    9.自然连接

    SELECT C.*, O.order_num, O.order_date,
           OI.prod_id, OI.quantity, OI.item_price
    FROM Customers AS C,Orders AS O,OrderItems AS OI
    WHERE C.cust_id = O.cust_id
     AND OI.order_num = O.order_num
     AND prod_id = 'RGAN01';

     

    10.外联接

     

    假设a表和b表的数据是这样的。  

      a                       b    

      id     name  id     stock   

      1        a            1         15  

      2         b            2         50  

      3         c                  

     

    select   *   from   a   inner   join   b   on   a.id=b.id  

      这个语法是连接查询中的内连接,它产生的结果是  

      两个表相匹配的记录出现在结果列表中。  

      根据上面的表,出现的结果是这样的  

      a.id     name     b.id     stock  

      1         a             1         15  

      2           b             2         50  

      ----------------------------  


    select   *   from   a,b   where   a.id=b.id  

      这个语法是内连接的另外一种写法,其执行结果与inner   join   一样  


      --------------------------------    

     

      select   *   from   a   left/right   join   b   on   a.id=b.id  

      这个是外连接语法中的左外连接或右外连接  

      如果是左外连接的话,它将显示a表的所有记录,  


    select   a.*,b.*   from   a   left   join   b   on   a.id=b.id  

      查询的结果是这样的:  

      a.id     name     b.id     stock  

      1       a         1             15  

      2       b         2             50  

      3        c       null         null  

      --------------------------------------------  

      如果是右外连接的话,它将显示b表的所有记录,  

    select   a.*,b.*   from   a   right   join   b   on   a.id=b.id  

      查询的结果是这样的:  

      a.id     name     b.id     stock  

      1          a         1             15  

      2           b         2             50   

     

     

    11.UNION

    UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔(因此,如果组合四条SELECT语句,将要使用三个UNION关键字)。

    UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过,各个列不需要以相同的次序列出)。

    列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含转换的类型(例如,不同的数值类型或不同的日期类型)。

    UNION从查询结果集中自动去除了重复的行;换句话说,它的行为与一条SELECT语句中使用多个WHERE子句条件一样。因为Indiana州有一个Fun4All单位,所以两条SELECT语句都返回该行。使用UNION时,重复的行会被自动取消。

    这是UNION的默认行为,如果愿意也可以改变它。事实上,如果想返回所有的匹配行,可使用UNION ALL而不是UNION

     

    12.从一个表复制到另一个表

     

    INSERT INTOCustomers(cust_id,
                          cust_contact,
                          cust_email,
                          cust_name,
                          cust_address,
                          cust_city,
                          cust_state,
                          cust_zip,
                          cust_country)
    SELECT cust_id,
           cust_contact,
           cust_email,
           cust_name,
           cust_address,
           cust_city,
           cust_state,
           cust_zip,
           cust_country
    FROM CustNew;

    SELECT *
    INTO CustCopy
    FROM Customers;

    CREATE TABLECustCopy AS
    SELECT * FROM Customers;

     

    13.Update

    UPDATECustomers
    SET cust_email = 'kim@thetoystore.com'
    WHERE cust_id = '1000000005';

     

    14.Delete

    DELETE FROMCustomers
    WHERE cust_id = '1000000006';

     

    15.更快的删除

    如果想从表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE语句,它完成相同的工作,而速度更快(因为不记录数据的变动)。

     

    16.更新和删除的指导原则

    • 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATEDELETE语句。
    • 保证每个表都有主键(如果忘记这个内容,请参阅第12课),尽可能像WHERE子句那样使用它(可以指定各主键、多个值或值的范围)。
    • UPDATEDELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。
    • 使用强制实施引用完整性的数据库(关于这个内容,请参阅第12课),这样DBMS将不允许删除其数据与其他表相关联的行。
    • 有的DBMS允许数据库管理员施加约束,防止执行不带WHERE子句的UPDATEDELETE语句。如果所采用的DBMS支持这个特性,应该使用它。

    若是SQL没有撤销(undo)按钮,应该非常小心地使用UPDATEDELETE,否则你会发现自己更新或删除了错误的数据。

     

    17.更新表

    ALTER TABLEVendors
    ADD vend_phone CHAR(20);

     

    ALTER TABLEVendors
    DROP COLUMN vend_phone;

     

    18.删除表

    DROP TABLECustCopy;

     

    19.存储过程

     

    20.事务处理

    可以回退哪些语句?

    事务处理用来管理INSERTUPDATEDELETE语句。不能回退SELECT语句(回退SELECT语句也没有必要),也不能回退CREATEDROP操作。事务处理中可以使用这些语句,但进行回退时,这些操作也不撤销。

     

    21.sql高级特性

    约束

    主键

    外键

    唯一约束

    检测约束

    索引

    触发器

     

     

    22.数据库安全

    • 对数据库管理功能(创建表、更改或删除已存在的表等)的访问;
    • 对特定数据库或表的访问;
    • 访问的类型(只读、对特定列的访问等);
    • 仅通过视图或存储过程对表进行访问;
    • 创建多层次的安全措施,从而允许多种基于登录的访问和控制;
    • 限制管理用户账号的能力。

     

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值