数据库——SQL

本文深入探讨了SQL(结构化查询语言)的基础知识,包括数据库术语、检索数据、排序、过滤和高级过滤。介绍了主键概念、ORDER BY、WHERE子句、IN操作符、LIKE通配符、计算字段以及数据处理函数。此外,还讨论了聚集函数如AVG、COUNT、MAX和MIN的使用,以及视图、存储过程、事务处理、游标、约束、索引、触发器和数据库安全。文章最后提到了SQL语句的语法和数据类型的重要性。
摘要由CSDN通过智能技术生成

数据库术语

  • 数据库(database):保存有组织的数据的容器。(数据库软件是数据库管理系统DBMS,数据库是通过DBMS创建和操纵的容器)
  • 表(table):某种特定类型数据的结构化清单。(在相同数据库中不能有同样名字的表,但在不同数据库中,表的名字可以相同)
  • 模式:关于数据库和表的布局及特性的信息
  • 列:表中的一个字段。所有表都是由一个或多个列组成的。
  • 数据类型:所允许的数据的类型。每个表列都有相应的数据类型,它限制该列中存储的数据。
    数据类型及其名称是SQL不兼容的一个主要原因,一些高级的数据类型没有得到一致的支持,相同的数据类型在不同的DBMS中也有可能具有不同的名称。
  • 行:表中的一个记录(行和记录两个术语可以交替使用,但从技术上讲行是正确的术语)
  • 关键字(keyword):作为SQL组成部分的保留字,关键字不能用作表和列的名字。
  • 主键:主键(primary key):一列(或一组列),其值能够唯一标识表中每一行(应该保证创建的每个表中都有主键,以便于数据操作和管理)
    主键需要满足的条件:
    1. 任意两行都不具有相同的主键值;
    2. 每一行都必须有一个主键值(主键值不能为null)
    3. 主键列中的值不允许修改或更新;
    4. 主键值不能重用(如果某行被删除,则他的主键不能赋给后面的新行)
  • SQL: Structured Query Language(结构化查询语言)
    SQL语句不区分大小写,不管是SELECT或是select或者Select都一样,但是表名列名值等可能是区分大小写的,这有赖于具体的DBMS及其如何配置。
    在处理SQL语句是,其中所有的空格都被忽略,既可以写成长长的一行,也可以分写在多行。
  • NULL:无值(no value)它与字段包含0、空字符串或仅仅包含空格不同。
  • 操作符(operator)用来联结或改变WHERE子句中的子句的关键字,也称为逻辑操作符。
  • 通配符(wildcard):用来匹配值的一部分的特殊字符
  • 搜索模式(search pattern):由字面值、通配符或两者组合构成的搜索条件。
  • 谓词(predicate):从技术上说,LIKE是谓词而不是操作符。
  • 字段(field):基本上与列(column)的意思相同,经常互换使用,不过数据库列一半称为列,而属于字段通常与计算字段一起使用。
  • 拼接(concatenate):将值连接到一起,(将一个值附加到另一个值)构成单个值。
  • 查询(query):任何SQL语句都是查询,但此术语一般指SELECT语句。(MySQL从4.1版本开始支持子查询)
  • 可伸缩(scale):能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称为可伸缩性好。
  • 笛卡尔积(cartesian product):有没有联结条件的表关系返回的结果为笛卡尔积。检索出的行数目将是第一个表中的行数乘以第二个表中的行数。
  • 约束:管理如何插入或处理数据库数据的规则。

检索数据

  • SELECT语句

  1. 检索单个列

SELECT prod_name FROM Products;(此语句输出的数据不会按特定的排序)

在这里插入图片描述
2. 检索多个列

SELECT prod_id,prod_name,prod_price FROM Products;

在这里插入图片描述
由图可见,SQL语句一般返回原始的无格式的数据,如图中价格列没有表示为两位小数点的数。实际应用中很少直接使用实际检索出的数据。
3. 检索所有列

SELECT * FROM Products;

在这里插入图片描述
列的顺序一般是列在表定义中出现的物理顺序,但并不总是如此。一般而言最好不使用通配符,因为检索不需要的列会降低检索和应用程序的性能。
4. 检索不同的值

SELECT DISTINCT vend_id FROM Products;

在这里插入图片描述
在这里插入图片描述
DISTINCT关键字指示数据库只返回不同的值。
如果用DISTINCT同时检索多列,则返回多列组合起来不同的那些行
在这里插入图片描述
5. 限制结果
不同的DBMS中实现这一功能的语句不一样

  • 在SQLServer和Access中:

SELECT TOP 5 prod_name FROM Products;//只检索前5行数据

  • 在DB2中:

SELECT prod_name FROM Products FETCH FIRST 5 ROWS ONLY;

  • 在Oracle中:

SELECT prod_name FROM Products WHERE ROWNUM<=5;

  • 在MySQL、MariaDB、PostgreSQL或者SQLite中:

SELECT prod_name FROM Products LIMIT 5;
SELECT prod_name FROM Products LIMIT 5 OFFSET 5;
//返回从第五行起的五行数据 第一个数字指从哪开始,第二个数字是需要检索的行数

在MySQL和MariaDB中可以简化为:

SELECT prod_name FROM Products LIMIT 3,4;
//从第三行开始的四行数据

第一个被检索的是第0行,而不是第一行

6.使用注释

  • 行内注释

    SELECT prod_name      -- 这是一条注释
    FROM Products;
    

注释使用两个–连字符嵌在行内,–之后的文本就是注释

    #这是一条注释
    SELECT prod_name
    FROM Products;

在一行的开始处使用#,这一行都将作为注释//这种形式很少得到支持

/* SELECT prod_name,vend_id 
FROM Products; */
SELECT prod_name,vend_id 
FROM Products;

注释从/* 开始到 */结束,这些字符之间的任何内容都是注释。这种方式常用于给代码加注释

排序检索数据——ORDER BY

  • 排序数据

SELECT prod_name FROM Products;//没有特定顺序

如果不排序,数据将以它在底层表中出现的顺序显示,这有可能是数据最初添加到表中的顺序。但是如果数据进行过更新或者删除,那么这个顺序将会受到DBMS宠用回收存储空间的方式的印象。如果不明确控制的话,最终的结果不能也不应该依赖该排序顺序。
子句(clause):SQL语句由子句构成,有些子句是必须的,有些是可选的。一个子句通常由一个关键字加上所提供的数据组成。比如SELECT语句中的FROM子句
用ORDER BY子句对输出进行排序:

SELECT prod_name FROM Products ORDER BY prod_name;//按字母顺序排序

在这里插入图片描述
ORDER BY子句必须是语句中的最后一条子句;可以用非检索的列来选择排序方式。

  • 按多个列排序

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 1,2;

在这里插入图片描述
它是按命令中列的相对位置来选,而不是列名的位置来选
这个命令的好处在于不用重新输入列名,但它也有缺点,首先,不明确给出列名有可能造成错用列名排序;其次再对select清单进行更改时容易错误的对数据进行排序;最后,如果要排序的列不在清单中,则不能使用这个命令。

  • *指定排序方向
    升序排序是默认的排序方式,进行降序排序要使用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只应用到直接位于其前面的列名
DESC全名DESCENDING
升序ASC 全名ASCENDING

排序检索就用ORDER BY 子句!

过滤数据——WHERE

用where子句中鼎搜索条件(过滤条件)
最好不要在应用层进行过滤数据,

select prod_name,prod_price from Products where prod_price=3.49;

在这里插入图片描述

  • 检查单个值

select prod_name,prod_price from Products where prod_price<10;

在这里插入图片描述

  • 不匹配检查

select vend_id,prod_name from Products where vend_id <> ‘DLL01’;

在这里插入图片描述
单引号用来限定字符串,如果将值与字符串类型的列进行比较,就需要限定引号,如果是与数值列进行比较则不用引号
通常将<>改为!=也可以达到同样的效果,但不是所有的DBMS都支持这种操作,如MicrosoftAccess就不支持,而MySQL可以
在这里插入图片描述

  • 范围值检查

select prod_name,prod_price from Products where prod_price between 5 and 10;

在这里插入图片描述
between必须指定两个值,两个值必须用and分割,between会匹配范围中所有的值,包括开始值和结束值

  • 空值检查

select cust_name from Customers where cust_email is null;
在这里插入图片描述
通过过滤选择不包含指定值的所有行时,不会返回含NULL值得行,因为数据库不知道它是否匹配

高级过滤数据

组合WHERE子句
  • AND操作符

select prod_id,prod_price,prod_name from Products where vend_id = ‘DLL01’ and prod_price <=4;

在这里插入图片描述

  • OR操作符
    许多DBMS在OR WHERE 子句的第一个条件得到满足时就不再计算第二个条件了

select prod_name,prod_price,vend_id from Products where vend_id = ‘DLL01’ or vend_id = ‘BRS01’ ;

在这里插入图片描述

  • 求值顺序
    AND的优先级比OR更高

select prod_name,prod_price,vend_id from Products where vend_id = ‘DLL01’ or vend_id = ‘BRS01’ and prod_price >=10;

在这里插入图片描述
由途中结果可见,SQL在执行上述语句时,它理解为:供应商BRS01制造的价格为10美元以上的商品或者供应商DLL01制造的商品

select prod_name,prod_price,vend_id from Products where (vend_id = ‘DLL01’ or vend_id = ‘BRS01’) and prod_price >=10;
在这里插入图片描述
加了括号之后就变为了返回供应商BRS01或DLL01制造的价格为10美元以上的商品
括号的优先级是最高的,所以在使用具有AND和OR操作符的WHERE子句时,应该使用括号明确地分组操作符

IN操作符

IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。

select prod_name,prod_price,vend_id from Products where vend_id in (‘DLL01’ , ‘BRS01’) order by prod_name;

在这里插入图片描述
IN操作符后跟由逗号分隔的合法值,这些值必须在圆括号中。
IN操作符其实完成了与OR操作符相同的功能,用IN操作符的优点如下:

  1. 在有很多合法选项时,IN操作符更清楚直观;
  2. 在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理;
  3. IN操作符一般比一组OR操作符执行的更快
  4. IN可以包含其他SELECT语句,能够更动态地建立WHERE子句
NOT操作符

NOT操作符有且只有一个功能,就是否定其后跟的任何条件;NOT关键字用在要过滤的列前,而不是其后

select prod_name from Products where not vend_id=‘DLL01’ order by prod_name;

在这里插入图片描述
大多数DBMS支持NOT否定任何条件,MariaDB只能否定IN、BETWEEN和EXISTS子句

用通配符进行过滤——LIKE

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值