数据库——SQL

数据库术语

  • 数据库(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’) orde

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 数据库定时任务是指在数据库设置一个自动运行的任务,根据设定的时间间隔定期执行某个操作。当需要对某个字段进行定时更新时,可以通过编写SQL语句并使用定时任务实现自动更新某个字段的功能。 首先,需要创建一个定时任务,可以使用数据库自带的定时任务工具或者操作系统的定时任务功能。在定时任务,可以指定一个时间间隔,比如每隔一小时执行一次。 然后,在定时任务编写SQL语句,用于更新要操作的字段。可以使用UPDATE语句来更新某个字段的值。例如,假设要更新一个表的某个字段,可以使用以下SQL语句: ``` UPDATE 表名 SET 字段名 = 新值 WHERE 条件; ``` 其,表名是要更新的表的名称,字段名是要更新的字段的名称,新值是要更新的字段的新值,条件是限定更新的条件。 接着,将编写好的SQL语句插入到定时任务,并设置好定时任务的执行时间间隔。定时任务会在指定的时间间隔内自动执行,根据SQL语句更新相应的字段。 需要注意的是,定时任务更新字段时,需要确保定时任务的执行时间不会影响数据库的正常运行,避免对数据库的性能产生负面影响。 通过以上步骤,就可以实现使用SQL设置定时任务,每隔一段时间自动更新某个字段的功能。定时任务会按照设定的时间间隔自动执行SQL语句,更新对应字段的值,从而实现自动化更新的效果。 ### 回答2: 数据库定时任务可以使用SQL设置每隔一段时间自动更新某个字段。一种常见的方法是使用数据库的定时任务功能,比如MySQL的事件(Event)或者PostgreSQL的定时器(Timer)。下面以MySQL事件为例,详细说明如何实现。 首先,我们需要创建一个事件,来执行自动更新操作。可以使用以下SQL语句创建一个名为"update_event"的事件: ```mysql CREATE EVENT update_event ON SCHEDULE EVERY 1 HOUR DO UPDATE 表名 SET 字段名 = 新值 WHERE 条件; ``` 上述SQL语句,我们创建了一个名为"update_event"的事件,它每隔1小时就会执行一次。在"DO"后的语句,我们使用"UPDATE"命令来更新指定的表和字段。可以根据需要修改表名、字段名和条件等内容。 接下来,可以使用以下语句启用事件调度器: ```mysql SET GLOBAL event_scheduler = ON; ``` 这样,在启用事件调度器后,事件"update_event"将会按照预定的时间间隔自动执行更新操作。 需要注意的是,具体的实现方式依赖于所使用的数据库管理系统,不同的数据库可能有不同的语法和设定。还要考虑到数据量的大小和性能的影响,以及定时任务的具体需求,选择合适的定时任务方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值