数据库基础
数据库:保存有组织的数据的容器
表:某种特定类型数据的结构化清单
模式:关于数据库和表的布局及特性的信息
行:表中的一个记录
主键:唯一标识表中的一行 总是应该设立主键
检索数据
检索单个列:
SELECT prod_name
FROM Products;
如果没有明确查询的顺序,返回的数据没有特定的顺序。而且通常需要应用程序自己格式化数据格式;
SQL语句不区分大小写,经常以大写表示关键字,所有空格都被忽略,换不换行都行;必须以‘;’结尾
多个列之间用,隔开,检索所有列用*
SELECT prod_name,prod_id
FROM Products;
Distinct
不重复数据.distict关键字必须放在列名的前面
SELECT DISTINCT vend_id
FROM Products;
限制返回行数
SQL server 和access用 TOP 关键字 只检索前5行
SELECT TOP 5 prod_name
FROM Products;
Mysql、 Maria DB、SQLite用 LIMIT关键字,比如不超过5行
SELECT prod_name
FROM Products
LIMIT 5;
要得到后面5行的,需要指定从哪里开始以及检索的行数
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
从第5行气的5行数据(第一个被检索的行是第0行,从0开始)
注释
行内注释 –
SELECT TOP 5 prod_name -- 这是条注释
FROM Products;
多行:/**/
排序检索 order by
按列名
SELECT prod_name
FROM Products
ORDER BY prod_name;
以prod_name字母顺序排序
ORDER BY 子句要保证是select语句中最后一条语句
用非检索列排序也是合法的
按多个列排序,指定列名,用,分开。 先按第一个,然后第一个相同时按第二个等
按列位置
SELECT prod_name, prod_price, prod_id
FROM Products
ORDER BY 2,3;
2,3指的是select后的第二个第三个列。不在select清单里的列不能用,而且很容易发生修改了select清单但没有修改order by子句的问题
降序 DESC
SELECT prod_name
FROM Products
ORDER BY prod_name DESC;
DESC只应用到直接位于它前面的列,要是想多个列上降序,每个列名后面都得加DESC
一般认为A a在字母顺序中一样,要是修改的话可能需要联系数据库管理员
过滤数据 where
SELECT prod_name,prod_price
FROM Products
WHERE prod_price = 3.49;
后面有多少个0是DBMS默认的,3.49和3.4900是一样的
order by要位于where之后
<> 不等于 !<不小于 !>不大于 Between 两者之间 is null 为null值
SELECT prod_name,prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
BETWEEN必须指定低和高两个,由AND连接,闭区间
检查是否为空要用is null
SELECT prod_name,prod_price
FROM Products
WHERE prod_price IS NULL;
在过滤数据时,不满足某条件的返回结果里并不会包含null,null必须单独判断
组合where 子句 逻辑操作符
and, or, in, NOT
SELECT prod_name,prod_price
FROM Products
WHERE prod_price <=4 AND vend_id = 'DLL01';
or的话,许多DBMS只看第一个满足,后面就不看了,一并检索出来
可以用括号()来明确多个and or之间的优先级
SELECT prod_name,prod_price
FROM Products
WHERE vend_id IN ( 'DLL01','BRS01');
IN后的选项必须在()里,逗号隔开,其实就是完成了OR的操作。合法选项很多时,用IN更清楚,求值顺序更容易管理,而且一般比or执行的快。IN的最大优点是可以包含其他select子句
通配符
用来匹配值的一部分的特殊字符
%
%表示任意字符出现任意次数
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
通配符可以在任意位置,使用任意多个
但是要注意,许多DBMS会用空格在后面填充,有时候’f%y’这样可能匹配不到,最好是’f%y%’
另外,通配符匹配不到nuLL
WHERE prod_name LIKE '%';
是匹配不到NULL的
_
_只匹配单个字符
不能多也不能少
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '__ inch teddy bear';
只匹配10-99 inch的
[]
[]用来指定一个字符集,必须匹配指定位置的一个字符。只有Access和Sql server支持
创建计算字段
存储在表中的数据一般不是应用程序要用的,有时候需要从数据库中检索出转换、计算或格式化后的数据。
只有数据库知道select中哪些列是实际的表列,哪些是计算字段。客户端看不出区别来。
拼接字段
多数DBMS使用+号
SELECT vend_name + '('+vend_country +')'
FROM Vendors
Order by vend_name;
Mysql 和mariaDB中使用的是concat
SELECT Concat(vend_name + '('+vend_country +')')
FROM Vendors
Order by vend_name;
可以用RTRIM(列名)来去掉多余的空格
使用别名
一个字段或值的替换名
SELECT RTRIM(vend_name) + '('+RTRIM(vend_country) +')'
AS vend_title
FROM Vendors
Order by vend_name;
算术计算
可以在计算字段中+ -* /
SELECT prod_id, quantity, item_price,quantity*item_price as expanded_price
FROM OrderItems
where order_num = 20008;