数据的检索、排序、过滤

基本概念

  • 数据库:保存有组织的数据的容器(通常是一个或一组文件)。
  • 表:存储特定类型的数据。完整表名是数据库名+表名。
  • 列:一个表中有多个列,每个列存储一种特定信息。每个列都有数据类型限制
  • 行:表中的一个记录
  • 主键:表中每一行都应该有一列或几列能唯一标识自己,如id。主键需要满足:
    • 任意两行不具有相同主键值
    • 每行都必须有主键值(不为null)
    • 主键列值不能修改
    • 主键值不能重用(某行被删除,其主键不能赋给以后的新行)
    • 使用多列做主键时要保证他们列值的组合唯一
  • SQL(Structured Query Language):是一种专门用来与数据库沟通的语言。SQL语句不区分大小写,但为了便于阅读,通常对SQL关键字使用大写。语句中所有的空格都被忽略,因此换行与否不影响语句作用,但分成多行利于阅读和调试。
  • MySQL是一种DBMS(数据库软件)。DBMS分为基于共享文件系统的DBMS和基于客户机-服务器的DBMS。MySQL是基于客户机-服务器的数据库。
  • MySQL Administrator(MySQL管理器)是一个图形交互客户机,用来简化MySQL服务器的管理。
  • MySQL Query Browser 是一个图形交互客户机,用来编写和执行MySQL命令。

在一个表中检索数据

  • 检索单个列
    SELECT prod_name(列名)
    FROM Products(表名);
  • 检索多个列
    SELECT prod_id,prod_name,prod_price
    From Products;
  • 检索所有列
    SELECT *
    FROM Products;

SQL返回的顺序通常是列在表中定义的物理顺序,但并不总是这样,因此数据返回给应用程序后通常需要格式化,再表示出来。

  • 只检索不同的值
    SELECT DISTINCT vend_id
    FROM Products;
    注意:DISTINCT作用于所有的列,并非只是后面一个,如:
    SELECT DISTINCT vend_id,prod_price 作用于两个列
    FROM Products;
  • 返回不超过五行的数据(MySQL中)
    SELECT prod_name
    FROM Products
    LIMIT 5;
  • 返回从第五行起的不超过五行数据
    SELECT prod_name
    FROM Products
    LIMIT 5 OFFSET 5;

注意:行数是从第零行开始的

  • 注释:行注释--#;段落注释/* */

对检索后的结果排序

  • 对输出某列以字母顺序进行排序
    SELECT prod_name
    FROM Products
    ORDER BY prod_name;

注意:1. ORDER BY应为SELECT语句最后一条子句
   2. 用非检索列排序数据也是完全合法的

  • 按多个列排序
    SELECT prod_name
    FROM Products
    ORDER BY prod_price, prod_name; --相同价格按名字排
  • 按列位置排序
    SELECT prod_id, prod_name, prod_price
    FROM Products
    ORDER BY 2, 3; --先按第二列name排序再按第三列price排序
  • 按降序排序,关键字DESC
    SELECT prod_name
    FROM Products
    ORDER BY prod_price DESC;

DESC关键字只对应其前面的列名,想在多个列上进行降序排序,必须对每一列都指定DESC关键字。不指定时默认是升序ASC

过滤数据

使用WHERE子句

  • 检查单个值
    SELECT prod_name, prod_price
    FROM Products
    WHERE prod_price=3.49; --筛选出价格为3.49的产品

WHERE子句操作符

操作符说明操作符说明
<>不等于!=不等于
!<不小于!>不大于
  • 不匹配检查
    |BETWEEN|在指定的两个值之间|IS NULL|为NULL值|
    SELECT vend_id, prod_name,
    FROM Products
    WHERE vend_id!='DLL01'; --筛选出不是DLL01的产品

字符串的比较需要引号,数值比较不需要引号

  • 范围值检查
    SELECT prod_name, prod_price
    FROM Products
    WHERE prod_price BETWEEN 5 AND 10; --筛选出价格在5和10之间的产品,包括开始和结束值
  • 空值检查
    SELECT prod_name, prod_price
    FROM Products
    WHERE prod_price IS NULL; --筛选出所有没有价格的产品

高级数据过滤

  • 多个过滤条件,都使用AND连接
    SELECT prod_id, prod_name, prod_price
    FROM Products
    WHERE vend_id!='DLL01' AND prod_price<=4;
  • 表示“或”,用OR
  • 在AND和OR的组合中,优先处理AND操作符。假如要列出价格为10美元及以上,且由DLL01或BRS01制造的所有产品:
    SELECT prod_id, prod_name, prod_price
    FROM Products
    WHERE (vend_id!='DLL01' OR vend_id='BRS01') AND prod_price>=10;
  • IN指定条件范围
    SELECT prod_name, prod_price
    FROM Products
    WHERE vend_id! IN('DLL01', 'BRS01'); --由DLL01或BRS01制造的所有产品

IN在这里与OR执行了相同功能。优点如下:

  1. 语法更清楚直观
  2. 与AND、OR组合时更方便
  3. IN一般比OR执行得更快
  4. 最大优点:可以包含其他SELECT语句,能动态地建立WHERE子句
  • NOT用于否定其后条件
    SELECT prod_name, prod_price
    FROM Products
    WHERE NOT vend_id!='DLL01'; --除了DLL01制造的所有产品

用通配符进行过滤

  • 通配符:用于匹配值的一部分,只能用于文本字段(字符串)。使用LIKE操作符指示DBMS后面的搜索模式使用通配符匹配。
  • 百分号%通配符:任意字符出现任意次数(不匹配NULL)
    SELECT prod_name, prod_price
    FROM Products
    WHERE prod_name LIKE 'Fish%'; --所有名称以Fish开头的产品

许多DBMS用空格填补字段的内容,造成’F%y’搜索不到以F开头y结尾的字段,解决方法:‘F%y%’

  • 下划线_通配符:匹配任意一个字符
  • 方括号[ ]通配符:指定字符集,匹配单个字符
    SELECT cust_conduct
    FROM Customers
    WHERE cust_conduct LIKE '[JM]%'; --以J或M起头
    否定:
    WHERE cust_conduct LIKE '[^JM]%;'

不要过度使用通配符,如果其他操作能达到相同的目的,应使用其他操作符。使用时不要置于搜索模式的开始处(此时是最慢的)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值