sql必知必会
sql
数据库是以某种有组织的方式存储的数据集合。
数据库是以某种有组件的方式存储的数据集合
数据库是以某种有组织的方式 存储的 数据集合
Database 保存有组织的数据的容器
数据库软件 是通过DBMS创建和操作的容器
表: 假设在一个容器中创建文件,然后将相关资料放入此文件中
表是一种结构化的文件,用来存储某种特定类型的文件
表:某种特定类型的结构化清单
注意:表是同一类型的结构化清单
表名是唯一的,表名唯一的本质,是数据库名和表名等的唯一组合,这说明表具备独特性
虽然在一个数据库中不能两次使用相同的表名,但是不同的数据库可以创建相同的数据表
表具备了一些特性,这些特性定义了数据在表中如何存储,比如存储什么数据,如何分解,如何命名
描述表的这组信息叫模式 schema , 模式 Schema 用来描述数据库中特定的表,也可以用来描述整个数据库和其中表的关系
模式: 关于数据库和表的布局以及特性的信息
表的组成
表由列组成,列存储表中某部分的信息, 列,又叫字段
数据类型 定义了列可以存储哪些数据种类。
重点:如何将数据分解为多个列极为重要,根据具体需求来决定把数据分解为各种程度
数据类型还可帮助正确的分类数据,并可以优化磁盘
注意:有的数据类型在不同的 sql语言里是不兼容的;相同的数据类型在不同的dbms 里具有不同的名称——创建表结构时要记住这些差异
行:
表是按列定义,数据是按行存储,所保存的每个记录存储在自己的行内
行是表中的一个记录,记录也叫record,但行才是主流
主键
主键:每一行或者每一列都要有一个唯一标识,主键表示一个特定的行,应该总是定义主键
可以不加主键,但加主键更利于以后的数据操作和管理
任何列都可以作为主键,只要它满足:
- 任意两行都不具有相同主键
- 每一行都必须具有一个主键值,主键列不允许空值null
- 主键列的值不允许修改或更新【只允许自增】
- 主键不能重用,若某个行被删除,它的主键不能赋给以后的新值
在使用多列作为主键时,上述条件必须应用到所有列,所有列值组合必须是唯一的
SQL
与数据库共同的语言
SQL的目的:提供一种从数据库中读写数据的简单有效的方法
语句:全都是由有很强描述性的英语单词组成
强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作
搜索
不同的SQL语言返回的数据顺序是不同的,但是数据正确就是正常的
SQL对分号宽松,但是建议带分号 加分号不会错,不加则可能会错
SQL不区分大小写,但是表名/列名/值可能有所不同
将SQL语句分成多行更容易阅读和调试
数据的显示是表示问题而不是检索问题
根据检索条件返回搜索检索条件值
select column from table; 搜索某个列从某个表里
select columnA,columnA from table; 搜索某些列从某个表里,列与列之间要加逗号,最后一列不能加逗号
Select * from table 返回所有列从某个表里 列的顺序不总是表中出现的物理顺序,但SQL数据很少直接显示,因为查询语言会对返回值进行格式化后再表示出来。 *会降低检索速度和程序性能
根据检索条件检索返回指定值
关键字 distinct
select distinct columnA,columnB from table
使用它来返回期望的、唯一的列数据
假设查询某个列返回值应有1,2,2,3,3,5,但使用distinct后仅会返回1,2,3,5
限制搜索结果
返回某些限制下的结果,比如指定行数
此处各个 sql 语言实现不一致
MySQL 使用 limit 关键字来返回指定行数
select column from table limit number;从表中返回5行,注意:sql索引是从0开始
MySQL 使用 offset 关键字来从指定从某个索引开始
select column from table limit 5 offset 6
查询列从第 6 个开始,共返回 5 行,这里的共其实就是最多的意思,因为也有可能不够 5
Limit 指定返回多少行 limit 从哪行开始
也可以简写为 limit offsetNum ,limitNum 这里要注意,简写情况下 limit 数与 offset 数是相反的
不同的sql 有不同的细微差异,但大体都一致
注释
行内注释
行内注释的通用写法是两个短横线后接注释 “--”
MySQL 通常使用#
多行注释
/*
这是一段注释
*/
课后练习
1.编写SQL语句,从Customers表中检索所有的ID(cust_id)。
select cust_id from Customers;
2.OrderItems表包含了所有已订购的产品(有些已被订购多次)。编写SQL语句,检索并列出已订购产品(prod_id)的清单(不用列每个订单,只列出不同产品的清单)。提示:最终应该显示7行。
Select distinct prod_id from OrderItems
3.编写SQL语句,检索Customers表中所有的列,再编写另外的SELECT语句,仅检索顾客的ID。使用注释,注释掉一条SELECT语句,以便运行另一条SELECT语句。(当然,要测试这两个语句。)
Select * from Customers
select ID from Customers
排序
没有排序语句的话,默认按照数据最初添加到表中的顺序,或者受到DBMS重用回收存储空间的方式的影响,它不可控。
常规select语句只能返回正确结果,无法格式顺序
order by 排序语句
注意它属于子句,只能放在句末,注意是最后的子句
子句通常由关键字 加一组所提供的数据组成
order by 排序逻辑
文本:按照字母顺序排列
中文:取决于数据库字符集和排序规则拼音/笔画/Unicode
数字:从小到大
默认升序 ASC
如果想降序: Desc
多列排序
select column from table
order by column1,column2
注意:排序字段前后顺序影响排序优先级,如果column1完全一致才会基于column2进行排序,如果column1完全不一致就不会按照column2排序
按列位置排序
按照列的位置进行排序,注意是列在整个表格中的相对位置,从1开始
两种情况
如果是*的状态 select * from table order by num;
它会按照实际列中的指定列号来排序,也就是根据默认的第num位来排序
如果是根据指定列来查询 会按照指定列的列号来排序
select column1,column2,column3 from table
order by 2,3 ; #会基于column2,column3来进行排序
本质上是按“查询结果中的列位置”排序
假设给定的查询列数共有2个但是排序项目却大于2,则会报错,因为sql不知道如何排序
好处:
不用重新输入列名
缺点:不明确给出列名可能造成错用列名排序;对select清单更改时更容易错误的对数据进行排序;排序列不在select清单时,不能使用此技术。
指定排序方向
默认升序:asc
指定降序:desc
Desc只能作用于前面的数据字段,无法作用于其后面的字段
select columnA, columnB from table order by columnA desc , columnB
此案例中,columnA由于添加了desc,会降序排列,columnB没有则默认会升序
假设要对多个列进行降序,则必须对每一列指定desc关键字
asc没有什么用处,因为它是默认的
区分大小写与排序顺序
在通用逻辑里,A与a是相同的,假设有区分需求,需要找数据库管理员
1.编写SQL语句,从Customers中检索所有的顾客名称(cust_names),并按从Z到A的顺序显示结果。
Select cust_names from Customers order by cust_names desc
2.编写SQL语句,从Orders表中检索顾客ID(cust_id)和订单号(order_num),并先按顾客ID对结果进行排序,再按订单日期倒序排列。
Select cust_id , order_num from orders order by cust_id, order_date desc
3.显然,我们的虚拟商店更喜欢出售比较贵的物品,而且这类物品有很多。编写SQL语句,显示OrderItems表中的数量和价格(item_price),并按数量由多到少、价格由高到低排序。
Select orderNum,orderPrice from orderItems order by orderNum desc , orderPrice desc;
4.下面的SQL语句有问题吗?(尝试在不运行的情况下指出。)
SELECT vend_name,
FROM Vendors
ORDER vend_name DESC;
- 查询列只有一项的情况下不能带逗号
- 是order by 而不是 order
过滤数据【指定搜索条件】 搜索条件也叫过滤条件
Where 子句的使用
select columns from table Where Selection
根据 where 筛选的词来返回符合条件的列表
如果order by与where联合使用,确保order by 始终都在子句的最后一个子句
where 操作符:
!= <> 不等于
= 大于等于
<= 小于等于
= 等于
Between 在指定的两个值之间
is null 为 null 值
单个值
select price from table where price < 10
不匹配检查
注意,比较某列时,如果是非数值,这个值要用引号包裹,否则就不用引号
select name from table where name != 'DLL01';
范围值检查
取两者之间使用关键字between and
假设取价格是否在 4-8 之间
select price from table where price between 4 and 8 取价格在4到8之间的表内容
空值检查
is null
当表被设计时,某个列在被设置成不包含值时,称其为包含空值null
Null与字段0/空字符串/仅包含空格不同
确定值是否为null,不能简单的检查是否等于null,正常是使用where子句来检查是否真实为null:
select columnA from table where columnB is null 在某表中查询b字段为空下的a字段
浙公网安备 33010602011771号