美文网首页
《SQL必知必会》学习笔记(一)

《SQL必知必会》学习笔记(一)

作者: 小鹿虫子 | 来源:发表于2021-09-27 08:45 被阅读0次

    第1课 了解SQL
    概念讲解:
    数据库:以某种有组织的方式存储的数据集合。类似一个文件柜,知识存放数据的物理位置,它不管数据是什么,也不管数据是如何组织的。(通常是一个文件或一组文件)
    数据库软件就是数据库管理系统(DBMS),数据库是通过DBMS创建和操纵的容器
    表(table):是一种结构化的文件,可用来存储某种特定类型的数据。存储在表中的数据是同一类型的数据或清单。表名必须是唯一的,一般是数据库名和表名的组合。在一个数据库中不能两次使用相同的表名,但在不同的数据库中完全可以使用相同的表名。
    模式(schema):可以用来描述数据库中特定的表,也可以用来描述整个数据库(和其中表的关系),
    列(column):表中的一个字段,所有表都是由一个或多个列组成的。
    数据类型(datatype):定义了列可以存储哪些数据种类。每个列表都有相应的数据类型,它限制(或允许)该列中存储的数据。
    行(row):表中的一个记录,亦有成为数据库记录(record),可以互通,但是行才是正确的术语
    主键(primary key):表中每一行都应该有一列(或几列)可以唯一标识自己。没有主键,更新或删除表中特定行就极为困难,因为你不能保证操作只涉及相关的行,没有伤及无辜。主键必须满足:任意两行都不具有相同的主键,每一行都必须具有一个主键值(主键值不允许空值null);主键列中的值不允许修改或更新;主键值不能重用(如果某行从表中删除,它的主键不能赋予以后的新行)
    子句(clause),SQL语句由子句构成,有些子句是必需的,有些则是可选的,一个子句通常由一个关键字加上所提供的数据组成。如from子句
    如何动手实践:需要一个数据库和用来测试sql语句的应用系统。可联系的DBMS有:MySQL(或派生的MariaDB)mysql workbench,microsoft sql server express(sql server management studio)
    第2课 检索数据
    select:从一个或多个表中检索信息。必须至少给出两条信息,想选择什么,以及从什么地方选择。
    1、检索单个列
    输入:select prod_name from products;(从products表中检索一个名为prod_name的列,根据你使用的具体dbms和客户端,你可能会看到一条信息说明检索了多少行,花了多长时间,如果没有明确排序查询结果,则返回的数据没有特定顺序。)
    2、检索多个列(在select关键字后给出多个列名,列名之间必须以逗号分割,但最后一个列名后不加)
    输入:select prod_id,prod_name,prod_price from products;
    3、检索所有列(加通配符)
    输入:select * from products
    如果给定一个通配符,则返回表中所有列,列的顺序一般是表中出现的物理顺序,但并不总是如此。
    4、检索不同的值
    譬如你想检索products 表中所有产品供应商的ID:
    输入:select vend_id from products; 返回到所有products 的ID
    输入:select distinct vend_id from products;只返回到不同(具有唯一性)的vend_id行
    (distinct关键字作用于所有的列,不仅仅是跟在其后的那一列)
    5、限制结果
    select语句一般返回指定表中的所有匹配行,很可能是每一行,如果想只返回第一行或者一定数量的行,在不同的DBMS里实现方式不一样
    一、SQL sever中,使用top关键字完成
    输入:select top 5 prod_name from products;(只检索前5行)
    二、DB2
    输入:select prod_name from products FETCH FIRST 5 ROWS ONLY;(只取前五行)
    三、Oracle,需要基于rownum(行计数器)来计算行
    输入:select prod_name from products where rownum <=5;
    四、如果你使用MySQL, MariaDB,PostgreSQL 或者SQLite,需要使用limit子句
    输入:select prod_name from products limit 5;(不返回超过5行的数据)
    输入:select prod_name from products limit 5 offset 5;(返回从第5行起的第5行数据,第一个数字是检索的行数,第2个数字是指从哪儿开始,第一个检索的行是第0行,而不是第1行)
    6、使用注释:
    一、注释使用--(两个连字符)嵌在行内,--之后的我呢本就是注释
    二、行内注释,在一行的而开始处使用#,这一整行都将作为注释
    三、多行注释,可以在脚本的任何位置停止或开始,注释从/开始,到/结束,两个之间任何内容都是注释这种方式常用于把代码注释掉

    第3课 排序检索数据
    一、select 语句中的order by子句,根据需要排序检索出的数据。
    (如果不排序,数据一般将以它在表中出现的顺序显示,可能是数据最初添加到表中的顺序,但如果数据随后进行过更新或删除,那么这个顺序将会受到DBMS重用回收存储空间的方式的影响)
    order by子句取一个或多个列的名字,对输出进行排序。
    输入:select prod_name from products order by prod_name;(对prod_name列以字母顺序排序数据)
    order by子句应该保证它是select语句中国的最后一条子句。如果不是最后的子句,将会出错
    二、按多个列排序(只需指定这些列名,列名之间用逗号分开即可,就像选择多个列时那样)
    输入:select prod_id,prod_price,prod_name from products order by prod_price,prod_name;(首先按价格,然后按名字排序)
    三、按列的位置排序
    输入:select prod_id,prod_price,prod_name from products order by 2,3;
    order by2表示按select 清单中的第二列prod_price 进行排序,order by2,3表示先按prod_price,再按prod_name进行排序。
    劣势:不能明确给出列名有可能造成错用列名,其次,再对select清单进行更改时,容易错误地对数据进行排序(忘记对order by子句进行相应的改动),最后如果进行排序的列不再select清单中,就不能用这项技术
    四、指定排序方向(升序从A到Z是默认的排序顺序),降序排列,必须制定desc关键字
    输入:select prod_id, prod_price,prod_name from products order by prod_price desc;
    如果打算按多个列排序
    输入:select prod_id, prod_price,prod_name from products order by prod_price desc,prod_name;
    desc关键字只应用到直接位于其前面的列名,在上例中,只对prod_price列指定desc,对prod_name列不指定,因此,prod_price列以降序排列,而prod_name列(在每个价格内)仍然按标准的升序排序。如果想在多个列上进行降序排序,必须对每一列指定desc
    asc是升序排列,但一般作用不大,因为默认是升序排列
    第4课 过滤数据(where字句指定搜索条件)
    数据可中一般包含大量的数据,很少需要检索表中的所有行,只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。
    一、where字句在表明(from子句)之后给出
    输入:select prod_name,prod_price from products where prod_price = 3.49;这条语句从products表中检索两个列,但不返回所有行,只返回prod_price值为3.49的行,这条命令使用了简单的相等检验,检查这一列的值是否为指定值。
    注意:在同时使用order by和where字句时,应该让order by 位于where之后,不然会出现错误。
    二、where子句操作符
    = 等于 <> 不等于 !=不等于 <小于 <= 小于等于 !<不小于 >大于 >=大于! >不大于 between在指定两个值之间 is null 为null值
    三、检查单个值
    输入:select prod_name,prod_price from products where prod_price <10;(检索所有价格小于等于10美元的产品)
    四、不匹配检查
    输入:select vend_id,prod_name from products where vend_id<> ‘dll01’;(列出所有不是供应商dll01制造的产品)
    如何使用引号: 单引号用来限定字符串,如果将值与字符串类型的列进行比较,就需要限定引号。用来与数值列进行比较的值不用引号
    五、范围值检查
    between操作符可用来检索价格在5美元和10美元之间的所有产品,或在指定的开始日期和结束日期之间的所有日期。
    输入:select prod_name,prod_price from products where prod_price between 5 and 10;
    六、空值检查
    在创建表时,表设计人员可以指定其中的列能否不包含值。在一个列不包含值时,称其包含空值null。它与字段包含0,空字符串或仅仅包含空格不同。
    输入:select prod_name from products where prod_price is null;(返回所有没有价格的产品)
    通过过滤选择不包含指定值的所有行时,因为null值比较特殊,所以进行匹配过滤或非匹配过滤时,不会返回这些结果。

    第5课 高级数据过滤
    为里哦进行更强的过滤控制,sql允许给出多个where子句。这些子句有两种使用方式,即以and 子句或or子句的方式使用。操作符(operator)用来联结或改变where子句中的子句的关键字,也称为逻辑操作符(logical operator)
    一、and操作符(通过不只一个列进行过滤时使用,返回到满足多个给定条件的行,是且的关系)
    输入:select prod_id,prod_price,prod_name from products where vend_id ='dll01' and prod_price <=4;
    二、or操作符(where子句中使用的关键字,用来表示检索匹配任一给定条件的行)
    输入:select prod_id,prod_price,prod_name from products where vend_id ='dll01' or vend_id ='brs01' ;
    三、求值顺序(使用圆括号对操作符进行明确分组,圆括号具有比and 或or操作符更搞的优先级,在任何时候使用具有and或者or操作符的where子句,都应该使用括号明确地分组操作符,不要过分依赖默认求值顺序,即使它确实如你希望的那样,使用圆括号没有什么坏处,能消除歧义)
    输入:select prod_name,prod_price from products where (vend_id='dll01' or vend_id='brs01') and prod_price>=10;
    四、In操作符用来指定条件范围,范围中的每个条件都可以进行匹配,在where子句中用来指定要匹配值的清单的关键字,功能与or相当
    输入:select prod_id,prod_price,prod_name from products where vend_id in('dll01' ,'brs01' )order by prod_name;
    (为什么要使用in操作符,在有很多合法选项时,in操作符的语法更清楚,更直观,求值顺序更易管理,比or操作符执行的更块。并且可以包含其它的select语句)
    五、not操作符(where子句中的not操作符有且只有一个功能,就是否定其后所跟的任何条件。因为not从不单独使用,用在过滤的列前,而不仅时在其后
    输入:select prod _name from products where not vend_id ='Dll01' order by prod_name;
    也可以用<>操作符来完成
    输入:select prod _name from products where not vend_id<>‘Dll01' order by prod_name;

    第6课 用通配符进行过滤
    like操作符
    利用通配符可以创建比较特定数据的搜索模式。假如你像找出名称包含bean bag的所有产品,可以构造出一个通配符的搜索模式,找出在产品名的任何位置出现bean bag的产品
    通配符(wildcard)用来匹配值的一部分的特殊字符。只能用于文本字段(字符串),非文本的数字类型的字段不能使用通配符搜索。通配符可在搜索模式中的任意位置使用,并且可以使用多个通配符。
    搜索模式(search pattern)由字面值、通配符或两者组合构成的搜索条件。
    谓词(predicate)当like是谓词时就不时操作符。
    like操作符指示DBMS,后跟的搜索模式利用通配符匹配而不是简单的相等匹配进行比较
    一、百分号(%)通配符
    %表示任何字符出现任意次数
    输入:select prod_id,prod_name from products where prod_name like ‘fish%‘;(找出所有以词fish起头的产品,接受fish之后的任意字符,不管它由多少字符)
    输入:select prod_id,prod_name from products where prod_name like ’%bean bag%‘;(表示匹配任何位置上包含bean bag的值,不论它之前或是之后出现什么字符)
    输入:select prod_name from products where prod_name like 'F%y';(通配符也可出现在中间,虽然不太有用,根据部分信息查找电子邮件中用到的比较多)
    此外,除了能匹配一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。注意,通配符%看起来时可以匹配任何东西,但有个例外,这就是null子句,where prod_name like '%' 不会匹配产品名称为null的行
    二、下划线()通配符。与%的用户一样,但它只匹配单个字符,而不是多个字符
    输入:select prod_id,prod_name from products where prod_name like ‘
    _ inch teddy bear‘;(_是代表两个字符, 只能代表1个字符)
    三、方括号([])通配符,用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符
    输入:select cust_contact from customers where cust_contact like '[JM]%' order by cust_contact;(找出所有名字以J或M起头的联系人,匹配方括号中的任意一个字符,它也只能匹配单个字符,因此,任何多于一个字符的名字都不匹配。此通配符可以用前缀字符^脱字号来否定);
    输入:select cust_contact from customers where cust_contact like '[ ^JM]%' order by cust_contact;(匹配以J和M以外的任意字符起头的任意联系人名,这个也可以使用not操作符得出类似结果,^的好处是使用多个where子句时可以简化语法);
    输入:select cust_contact from customers where not cust_contact like '[ ^JM]%' order by cust_contact;
    通配符的技巧:不要过多使用通配符,如果其它操作符能达到相同的目的,应该使用其它操作符;在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处,尤其要注意通配符的位置。
    第7课 创建计算字段
    第8课 使用函数处理数据
    第9课 汇总数据
    第10课 分组数据
    第11课 使用子查询
    第12课 联结表
    第13课 创建高级联结
    第14课 组合查询
    第15课 插入数据
    第16课 更新和删除数据
    第17课 创建和操纵表
    第18课 使用视图
    第19课 使用存储过程
    第20课 管理事务处理
    第21课 使用游标
    第22课 高级sql特性

    相关文章

      网友评论

          本文标题:《SQL必知必会》学习笔记(一)

          本文链接:https://www.haomeiwen.com/subject/fxkzgltx.html