1、了解sql
1.1数据库基础
1.1.1数据库(database)
:保存有组织的数据的容器(通常是一个文件或一组文件)(也可理解为某种有组织的方式存储的集合)
注:数据库软件称为DBMS(数据库管理系统)
1.1.2表(table)
:某种特定类型数据的结构清单(同一个类型且名字唯一)
特性:
定义了数据在表中如何存储,包含存储什么样的数据,和数据如何分解命名等~
表名:使表名成为唯一的,实际上是数据库名和表名等的组合。
模式:关于数据库和表的布局等特性信息。
1.1.3列(column)
:表中的一个字段。所有表都是由一个或者多个列组成
注:
每个列都有相应的数据类型。
数据类型(datatype)
:定义了列可以存储哪些数据种类。
分解数据:
正确的将数据分解为多个列极为重要。
1.1.4行(row)
:表中的一个记录
1.1.5主键(primary key)
一组(或一列)其值能够唯一标识表中每一行。
提示:
应该总是定义主键,虽然并不总是需要主键,但多数数据库设计者都
会保证增他们创建的每个表都具有主键,以便于以后的数据操作
和管理。
表中的任何列都可以作为主键,只要它满足以下条件:
1)任意两行都不具有相同的主键值
2)每一行都必须具有一个主键值(主键列不允许NULL值)
3)主键列中的值不允许修改或更新
4)主键值不能重用(如果某行从表中删除,他的主键不能赋值给以后的新行)
1.2什么是SQL
SQL是Structured Query Language(结构化查询语言的缩写)。SQL
是专门用来与数据库沟通的语言
优点:
1)sql不是某个特定数据库供应商准有的语言,几乎所有重要的
DBMS都支持SQL
2)简单易学
3)可以进行非常复杂和高级的数据库操作
2、检索数据
2.1 SELECT语句
关键字(Keyword):
作为SQL组成部分的保留字。关键字不能用作表或列的名字。
附录E列出了某些常用的保留字
提示:SQL是一种语言而不是一个应用程序,具体如何写SQL语句并显示输出,是随不同的应用程序而变化的
2.2检索单个列
select pro_name From Products;
上述语句利用select语句从Products表中检索一个名为pro_name的列。
所需列名跟在select之后,from关键字支出从那个表中检索数据
提示:
多数SQL语句以分号(;)分隔。
SQL语句不区分大小写因此SELECT与select是相同的。许多开发人员
喜欢对SQL关键字使用大写,而对列名和表名使用小写,这样做使代码更易于阅读和调试。
不过虽然SQL是不区分大小写的,但是表名、列名和值可能有所不同(具体情况依赖于DBMS的配置)
在处理SQL语句时,其中所有空格都被忽略。SQL可写成长长的一行也可以分写多行
2.3检索多个列
检索多个列时,仍使用相同的SELECT语句。唯一不同的是必须在SELECT关键字后给出多个列名,
列名之间必须以逗号分隔。
提示:
数据表示:
SQL语句一般返回原始的,无格式的数据。数据的格式化是表示问题,而不是检索问题。
因此,表示一般显示该数据的应用程序中规定。通常很少直接使用实际检索出的数据(没有应用程序提供的格式)
2.4检索所有列
在实际列名的位置使用星号(*)通配符
提示:如果给定一个通配符(*),则返回表中所有列。列的顺序一般是列在表定义中出现的物理顺序
但并不总是如此。
最大的优点是检索出未知列
2.5检索不同的值(distinct)
DISTINCT它指示数据库只返回不同(具有唯一性)的值。如果使用distinct关键字,它必须放在列名前面
提示:不能部分使用distinct
此关键字作用于所有的列,不仅仅是跟在其后的那一列。除非指定的列完全相同,否则所有的行都会被检索出来
2.6限制结果
如果你想返回第一行或一定数量的行,但是在不同的数据库中这一实现并不相同
在SQL sever和Access中可以使用TOP关键字来限制最多返回多少行
例:
SELECT TOP 5 pro_name FROM Products;
此代码使用SELECT TOP 5语句只检索前五行数据
在oracle需要基于ROWNUM(行计数器)来计算运行
例:
SELECT prod_name
FROM Prodects
WHERE ROWNUM <=5;
在mysql中需要使用LIMIT子句
例: SELECT prod_name
FROM Products
LIMIT 5;
limit 5返回不超过五行的数据
为了的倒后面的5行数据,需要指定从哪开始以及检索的行数
例:
SELECT pro_name
FROM Products
LIMIT 5 OFFSET 5;
第一个5字表示返回5行,第二个5表示从第6行开始(包括第六行)
###经常用到在数据库中查询中间几条数据的需求
比如下面的sql语句:
① selete * from testtable limit 2,1;
② selete * from testtable limit 2 offset 1;
注意:
1.数据库数据计算是从0开始的
2.offset X是跳过X个数据,limit Y是选取Y个数据
3.limit X,Y 中X表示跳过X个数据,读取Y个数据
这两个都是能完成需要,但是他们之间是有区别的:
①是从数据库中第三条开始查询,取一条数据,即第三条数据读取,一二条跳过
②是从数据库中的第二条数据开始查询两条数据,即第二条和第三条。
offset就代表偏移量的意思 offset num 代表从 num+1开始查询
并非所有的sql实现都一样
2.7使用注释
注释使用--(两个连字符)嵌在行内。--之后的文本就是注释,这种比较常用
还有一种注释#,在一行的开始处使用#,这一整行都将作为注释。
/*开始,到*/结束
3、排序检索数据
ORDER BY(按.....顺序)
3.1排序数据
关系数据库设计理论认为,如果不明确规定顺序排序,则不应该假定检索出的
数据的顺序有任何意义
提示:
ORDER BY子句的位置
在指定一条ORDER BY子句时,应保证它是SELECT语句中最后一条子句。
通常ORDER BY子句中使用的列将是为显示二选择的列。但是,用非检索的列排序数据是完全合法的。
3.2按照多个列排序
例:
SELECT prod_id,prod_price,prod_name FRMO Products
ORDER BY prod_price,prodname;
对于上述例子中的输出,仅在多个行具有相同的prod_price值时才对产品按照prod_name进行排序、如果
prod_price列中所有的值都是唯一的,则不会按prod_name排序。
3.3按列位置排序
例:
SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY 2,3;
提示:当根据不出现在SELECT清单中的列记性排序时,不能采用这项技术
3.4指定排序方向(DESC)
数据的排序不限于升序排列(从A到Z)这知识默认的排序
使用ORDER BY 子句+DESC可降序排列
SELECT prod_id,prod_price,prod_name
FRMO Products
ORDER BY prod_price DESC;
若是打算用多个列进行排序
SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY prod_price DESC,prod_name;
提示:
DESC关键字只应用到直接位于其前面的列名。
如果想在多个列上进行降序排序,必须对每一列指定DESC关键字
DESC=descending降序,ASC=ascending升序(此为DBMS默认的)
在字典(disctionary)排序顺序中,A被视为与a相同,这是大多数DBMS的默认行为
4、过滤数据(WHERE)
4.1使用WHERE子句
WHERE子句在表名(FROM子句)之后给出
在同时使用ORDER BY和WHERE子句时,让ORDER BY位于WHERE之后
例子:
SELECT prod_id,prod_price,prod_name
FROM Products
WHERE 3<prod_price AND prod_price<10
ORDER BY prod_price DESC,prod_name;
4.2 WHERE子句操作符号
操作符 说明
= 等于
<> 不等于
< 小于
<= 小于等于
!< 不小于
> 大于
>= 大于等于
!= 不大于
BETWEEN 在指定的两个指之间
IS NULL 为NULL值
4.2.1检查单个值
例:
SELECT prod_name,prod_price
FROM Products
WHERE pro_price<10;
4.2.2 不匹配检查
SELECT prod_id,prod_price,prod_name,vend_id
FROM Products
WHERE vend_id <> ‘DLL01‘;
检索出所有供应商不是DLL01制造的商品
提示:如果将值与字符串类型的列进行比较,就需要限定引号。
用来与数值比较不用引号
4.2.3 范围值检查
BETWEEN
例:
SELECT prod_id,prod_name,prod_price
FROM Prudcts
WHERE prod_price BETWEEN 3 AND 9;
在使用BETWEEN时,必须制定两个值————所需范围的低端值和高端值。
这两个值必须用AND关键字分隔
4.2.4 空值检查
在创建表时,表的列可指定其中的列能否不包含值,在一个列不包含值时
称其包含空值NULL
NULL:
无值(no value),它与字段包含0,空字符串货仅仅包含空格不同
例:
SELECT prod_name
FROM Products
WHERE prod_prcie IS NULL;
提示:各个DBMS特有的操作符
注意:NULL和非匹配
过滤数据时,一定要验证被过滤列中含NULL的行确实出现在返回数据中
SQL语句中AND时且的意思,OR是或者即满足一个即为真
5、高级过滤方式
WHERE子句的高级过滤方式和NOT和IN的
5.1 组合WHERE子句
SQL允许给出多个WHERE子句,这个子句有两种使用方式即AMD和
OR子句使用方式。
操作符号(operator)
用来联结或改变WHERE子句中的子句的关键字,也称为逻辑操作符
(logical operator)
5.1.1 AND操作符
用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行(
即同时满足多行),可以增加多个
过滤条件,每个条件间都要使用AND关键字
例:
SELECT prod_id,prod_name,prod_price
FROM Products
WHERE vend_id=‘DLL01‘ AND prod_price <= 4
ORDER BY prod_price DESC;
5.1.2 OR 操作符
用在WHERE子句中的关键字,与AND相反,许多DBMS在第一个条件满足时
不管第二个条件是否满足,相应的行都会被检索出来。
例:
SELECT prod_id,prod_name,prod_price,vend_id
FROM Products
WHERE vend_id=‘DLL01‘ OR prod_price BETWEEN 1 AND 4
ORDER BY prod_price DESC , prod_name;
5.1.3 求值顺序
例:假如需要列出价格为10及以上,且由DLL01或
BRS01制造的所有产品。
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = ‘DLL01‘ OR vend_id = ‘BRSO1‘ AND prod_price >= 10
ORDER BY prod_price DESC ,prod_name;
++输出结果为:
prod_name prod_price
-------------------------------------------------
Bird bean bag toy 3.49
Fish bean bag toy 3.49
Rabbit bean bag toy 3.49
Raggedy Ann 4.99
18 inch teddy bear 1 1.99
上面的结果,返回的行中有4行价格小于10,显然,返回的行
未按照预期的进行过滤,由于AND在求值过程中优先级更高,操作符被
符被错误的组合了
此问题解决方法是使用圆括号对操作符进行明确分组
SELECT prod_name,prod_price
FROM Products
WHERE vend_id=‘DLL01‘ OR vend_id =‘BRS01‘ AND prod_price >= 10
ORDER BY prod_price DESC , prod_name;
输出结果为:
prod_name prod_price
----------------------------------------------------
18 inch teddy bear 11.99
提示:
任何时候使用具有AND和OR操作符的WHERE子句,
都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序。
使用圆括号也没什么坏处,它能消除歧义。
5.2 IN操作符
IN操作符指定条件范围,范围或者能够的每个条件都可以进行匹配。IN取一组由逗号分隔,
括在圆括号中的合法值。
例:SELECT prod_id,prod_name,prod_price,vend_id
FROM Products
WHERE prod_price IN (‘DLL01‘,‘BRS01‘)
ORDER BY prod_name DESC;
5.3 not操作符
有且只有一个功能,WHERE 子句中用来否定其后条件的关键字
列:SELECT prod_name
FROM Products
WHERE NOT vend_id =‘DLL01‘
ORDER BY prod_name;
匹配非DLL01之外的所有东西
这个例子也可以使用操作符号<>来完成
给:
SELECT prod_name
FROM Prodcuts
WHERE vend_id <> ‘DLL01‘
ORDER BY prod_name
6、 用通配符进行过滤
6.1 LIEK 操作符
通配符(wildcard)
用来匹配值的一部分字符
搜索模式(search pattern)
由字面值、通配符或两者的组合构成的搜索条件
谓词(predicate)
操作符何时不是操作符?当她作为谓词时。从技术上说LIKE
是谓词而不是操作符。虽然最终的结果是相同的,但应该对此术语有所了解
注意:通配符搜索只能用于文本字段(字符串),非文本数据类型
字段不能使用通配符搜索
6.1.1 百分号(%)通配符
最常使用的通配符是百分号(%),%百分号表示任何字符出现的次数
例子:
SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE ‘Fish%‘
执行这条语句时将检索任意以Fish起头
的词。
注意NULL:
通配符%看起来像是可以匹配任何东西,但有个例外
就是NULL子句 WHERE prod_name LIKE ‘%‘ 不会匹配产品
名称为NULL的行
6.1.2 下划线(_)通配符
下划线的用途与%一样,但它只匹配单个字符,而不是多个字符
即加几个下划线匹配几个字符
例子:
SELECT * FROM Products
WHERE prod_name LIKE ‘__ inch tedy bear‘
6.1.3 方括号([])通配符
方括号([])通配符用来指定一个字符集
她必须匹配指定位置(通配符的位置)的一个字符
说明:并不总是支持集合
并不是所有的DBMS都支持用来创建集合的[]
。只有微软的Access和SQL Sever支持集合。
例子:找出所有名字以J或M起头的联系人!
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE ‘[JM]%‘
ORDER BY cust_contact;
输出:
cust_contact
--------------
Jim Jones
John Smith
Michelle Green
[JM]匹配括号中任意一个字符,它也只能匹配单个字符
[JM]之后的%通配符匹配第一个字符之后的任意数目的字符,返回所需的结果
此通配符可以用前缀字符^(脱字号)来否定。
列子:
查询匹配J和M之外的任意字符起头的任意联系人名
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE ‘[^JM]%‘
ORDER BY cust_custact;
说明:Access中的否定集合
需要用!而不是^
注:当然也可以使用NOT操作符得出类似的结果。
^的唯一优点是在使用多个WHERE 子句时可以简化语法
例子:
SELECT cust_contact
FROM Customers
WHERE NOT cust_contact LIKE ‘[JM]‘
ORDER BY cust_contact;
6.2 使用通配符的技巧
不要过度使用通配符。如果其他操作符能达到相同的目的
应该使用其他操作符
确实需要使用通配符时,也尽量不要把他们用在搜索模式的开始处
把通配符置于开始处,搜索起来是最慢的
仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据!
7. 创建计算字段
7.1 计算字段
存储在数据库表中的数据一般不是应用程序所需要的格式
字段(field)
基本上与列(column)的意思相同,经常互换使用
不过数据库列一般称为列,而术语字段通常与计算字段一起使用
从客户端(如应用程序)来看,计算字段的数据与其他列的数据返回方式相同
提示:客户端与服务器的格式
在SQL语句内可完成的许多的转换和格式化工作可都可以
直接在客户端内完成。但一般来说,在数据库服务器上完成操作
要比在客户端快的多
7.2 拼接字段
拼接(concatenate)
将值联结到一起(将一个值附加到另一个值)构成单个值
题设:创建由两列组成的标题
Vendors 表包含供应商名和地址信息、假如要生成一个供应商报表
需要在格式化的名称(位置)中列出供应商的位置
此报表需要一个值,而表中的数据存储在两个列:vend_name
和vend_country中。此外,需要用括号将vend_country括起来,
在SQL中的SELECT语句中,可使用一个特殊的操作符来拼接两个列。
根据你所使用的DBMS,此操作符可用加号(+)或者两个竖杠(||)表示
说明:+与||
Access和SQL Sever使用+号。DB2,ORCALE,PostgreSQL,SQLite和Open Office Base使用||
列子:
SELECT vend_name+_‘(‘+vend_country+‘)‘
FROM Vendors
ORDER BY vend_name;
输出:
(无列名)
---------------------------------------
Bear Enporium (USA )
Bears R Us (USA )
Doll House Inc (USA )
Fun and Games (England )
Fuball Inc (USA )
Jouets et ours (France )
下面是相同的语句,但使用的是||语法
SELECT vend_name ||‘(‘|| vend_country ||‘)‘
FROM Vendors
ORDER BY vend_name;
输出如上~
下面是使用
MY SQL或MariaDB时需要使用的语句:
SELECT Concat(vend_name,‘(‘,vend_country,‘)‘)
FROM Vendors
ORDER BY vend_name;
从上述输出中可以看到,SELECT 语句返回包含上述
四个元素的一个列(计算字段)。
在看看上述SELECT 语句返回的输出。结合成一个计算字段的两个列用空格填充,
许多数据库(不是所有)保存填充为列宽的文本值,而实际上
你要的结果不需要这些空格。所以为正确返回格式化数据
,必须去掉这些空格。这可以使用
SQL的RTRIM()函数来完成
例子:
SELECT RTRIM(vend_name)+‘(‘+RTRIM(vend_country)+‘)‘
FROM Vendors
ORDER BY vend_name;
输出:
---------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
RTRIM()函数去掉值右边的所有空格。各个列都进行了整理
说明:TRIM函数
大多数DBMS都支持RTRIM()去掉字符右边的空格
LTRIM() 去掉字符左边的空格
TRIM() 去掉字符串左右两边的空格
使用别名(alias):
原因:SELECT语句可以很好地拼接地址字段。但是这个新计算列的名字实际上是没有的
它只是一个值。r如果仅在SQL查询工具中查看一下结果,这样没什么不好。
但是一个未命名的列不能用于客户端应用中,因为客户端没有办法引用它
且使用别名可以让SQL语句更简短。
SQL支持别名,是一个字段或值的替换名。用关键字AS赋予
例子:
SELECT RTRIM(vend_name)+‘(‘+RTRIM(vend_country)‘)‘
AS vend_title
FROM Vendors
ORDER BY vend_name;
输出:
vend_title
--------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
下面是相同的语句,但是使用的是||语法;
SELECT RTRIM(vend_name) || ‘(‘||RTRIM(vend_country)||‘)‘
AS vend_title
FROM Vendors
ORDER BY vend_name;
下面是MySQL合MariaDB中使用的语句
SELECT Concat(vend_name,‘(‘,vend_country,‘)‘)
AS vend_title
FROM Vendors
ORDER BY vend_name;
使用别名可以让SQL语句更简短
例子:表的别名实例
下面的 SQL 语句选取 "菜鸟教程" 的所访问记录。我们使用 "Websites" 和 "access_log" 表,
并分别为它们指定表别名 "w" 和 "a"(通过使用别名让 SQL 更简短):
实例
SELECT w.name, w.url, a.count, a.date
FROM Websites AS w, access_log AS a
WHERE a.site_id=w.id and w.name="菜鸟教程";
说明:AS通常可选
提示:别名的其他用途
别名还有其他用途。常见的用途包括
在实际的表列名包含不合法的字符(如空格)时
重新命名它,在原来的名字含混或容易误解时扩充它。
别名有时也称为导出列(derived volumn)是相同的东西
7.3 执行算术计算
计算字段的另一常见用途是对检索出的数据进行算术计算。
例子:
SELECT prod_id,
quantity,
item_price
,quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num=20008;
输出如下:
prod_id quantity item_price expanded_price
---------- ----------- ------------ -----------------
RGAN01 5 4.9900 24.9500
BR03 5 11.9900 59.9500
BNBG01 10 3.4900 34.9000
BNBG02 10 3.4900 34.9000
BNBG03 10 3.4900 34.9000
基本算术操作符如下:圆括号可以用来区分优先顺序
操作符 说明
+ 加
- 减
* 乘
/ 除
提示:如何测试计算
SELECT语句为测试、检验函数和计算提供了很好的方法·。虽然
SELECT通常用于从表中检索数据,但是省略了FROM子句后就是简单地
访问和处理表达式。
原文地址:https://www.cnblogs.com/huaweiming/p/9291882.html