您的位置:首页 > 数据库

SQL必知必会学习笔记

2016-10-12 00:00 435 查看
1.了解数据库

1)数据库定义:一个以某种有组织的方式存储的数据集合;

2)DBMS:数据库管理系统;

3)表:某种特定类型数据的结构化清单;

4)表名:数据库名和表名等的组合;

5)模式:关于数据库和表的布局及特性的信息;

6)列:表中的一个字段;所有表都是由一个或多个列组成;

7)数据类型:限制该列中存储的数据;

8)行:表中的一个记录;

9)主键:一列或一组列,其值能够唯一标识表中每一行;

10)SQL, Structured Query Language,结构化查询语言,構造化照会言語 ;

11)SQL的扩展;

2.检索数据

1)结束SQL语句" ; " ,SQL不区分大小写,SQL忽略所有空格;

2)通配符 " * ":可以检索到未知列,但会降低检索和应用程序性能;

3)Distinct: 只返回不同的值;不能部分使用Distinct;

SELECT DISTINCT vend_id,prod_price FROM products;
--返回结果将是vend_id不同,或者prod_price不同的数据

4)ROWNUM:Oracle中的行计数器;

SELECT prod_name FROM products WHERE ROWNUM <= 3;

5)数据库起始行:第0行开始;

6)并非所有的SQL实现都一样,基本SQL和SQL的扩展;

7)SQL注释: ” -- “; ” 、” /**/“ ;

3.排序检索数据

1)ORDER BY子句:保证其是SELECT语句中的最后一条子句,否则将报错;

SELECT prod_name FROM products ORDER BY prod_name;

2)通过非选择列进行排序是完全合法的;

SELECT prod_name FROM products ORDER BY vend_id;

3)按多个列排序

SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_id,prod_name;

4)按列位置排序

SELECT prod_id,prod_price,prod_name FROM products ORDER BY 1,3;

5)指定排序方向:ASC ; DESC

SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_id DESC,prod_name;

6)在多个列上进行降序排列,必须对每一列指定DESC关键字;

SELECT vend_id,prod_id,prod_price,prod_name FROM products ORDER BY vend_id DESC,prod_name DESC;

7)区分大小写和排序方式取决于数据库的设置方式;

4.过滤数据

1)WHERE子句操作符: = , <> , != , < ,<=, !< ,> , >=, !> ,BETWEEN , IS NULL;

2)BETWEEN:匹配范围中的所有值,包括边界值;

SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

3)NULL:无值,它与字段包含0,空字符串或仅仅包含空格不同;

SELECT prod_name FROM products WHERE prod_desc IS NULL;

4)NULL和非匹配:非匹配不一定会返回NULL的值,故一定要验证被过滤列中含NULL;

5.高级数据过滤(WHERE中的操作符)

1)操作符:用来联结或改变WHERE子句中的子句的关键字;

2)AND操作符:同时满足多个条件;

SELECT prod_name FROM products WHERE vend_id = 'DLL01' AND prod_price <= 4;

3)OR操作符:匹配任一条件即可;

SELECT prod_name FROM products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';

4)AND和OR结合使用:注意求值顺序,进了使用圆括号;

SELECT prod_name FROM products WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >= 10;

5)IN操作符:指定条件范围,范围中的每个条件都可以进行匹配;

SELECT prod_name FROM products WHERE vend_id IN ('DLL01','BRS01');
--其执行了和OR一样的功能
--IN可以包含其他SELECT子句

6)NOT操作符:否定其后条件的关键字;

SELECT prod_name FROM products WHERE NOT vend_id = 'DLL01'
3ff0
ORDER BY prod_name;
--<>操作符也可完成同样过滤
SELECT prod_name FROM products WHERE vend_id <> 'DLL01' ORDER BY prod_name;

6.通配符进行过滤

1)通配符:用来匹配值的一部分的特殊字符;

2)搜索模式:由字面值,通配符或两者组合构成的搜索条件;

3)谓词:当操作符作为谓词时,就不在是操作符;LIKE其实是谓词;

4)LIKE操作符

5)%通配符:任何字符出现任意次数,可匹配多个字符;

SELECT  prod_id,prod_name FROM products WHERE prod_name LIKE 'Fish%';
--可以设置DBMS为区分大小写的
SELECT  prod_id,prod_name FROM products WHERE prod_name LIKE 'fish%';
--可以使用多个通配符
SELECT  prod_id,prod_name FROM products WHERE prod_name LIKE '%bean bag%';
--根据部分信息搜索电子邮件地址(WHERE email LIKE 'b%@forta.com')
--注意%后面跟的空格;
--%不会匹配为NULL的行(WHERE prod_name LIKE '%')

6)_ 通配符:匹配单个字符;

--匹配两个字符,注意bear之后不确定的空格,可加%
SELECT  prod_id,prod_name FROM products WHERE prod_name LIKE '__ inch teddy bear%';

7)[]通配符:指定一个字符集,它必须匹配字符集中的任意一个单个字符;

--测试未成功???
SELECT  cust_contact FROM customers WHERE cust_contact LIKE '[JM]%' ORDER BY cust_contact;

--前缀字符^来否定
SELECT  cust_contact FROM customers WHERE cust_contact LIKE '[^JM]%' ORDER BY cust_contact;

8)不用过度使用通配符,会影响性能;

7.创建计算字段

1)计算字段:

可以直接从数据库中检索出转换、计算或格式化过的数据;

运行时在SELECT语句内创建,并不实际存在于数据库表中;

2)客户端与服务器的格式:在SQL语句内可完成的许多转换和格式化工作都可以直接在客户端应用程序内完成。但一般来说,在数据库服务器上完成这些操作比在客户端中完成要快得多;

3)拼接:将值联结到一起构成单个值;使用“ + ” 或者 “ || ”;

--Access和SQL Server中使用“ + ”
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;

--Oracle等中使用“ || ”
SELECT vend_name || ' ('|| vend_country || ')' FROM vendors ORDER BY vend_name;

--RTRIM()函数去掉字符串右边的所有空格;
--LTRIM()函数去掉字符串左边的所有空格;
--TRIM()函数去掉字符串左右两边的所有空格;
SELECT RTRIM(vend_name) || ' ('|| RTRIM(vend_country) || ')' FROM vendors ORDER BY vend_name

4)别名:一个字段或值的替换名;又叫导出列;

--AS通常可选,但最好使用
SELECT RTRIM(vend_name) || ' ('|| RTRIM(vend_country) || ')' FROM vendors ORDER BY vend_name;

5)执行算术计算: ” + , - , * , / “;

SELECT  prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM OrderItems WHERE order_num = 20008;

8.使用函数处理数据

1)Oracle中的函数:

提取字符串的组成部分-SUBSTR() ;

取当前日期-SYSDATE;

数据类型转换-Oracle使用多个函数,每种类型的转换有一个函数;

--自动数据类型转换
SELECT '3.232454'+20 FROM DUAL;
--23.232454 字符串转数值型
SELECT '100'||20 FROM DUAL;
--10020数值型转字符串

--TO_CHAR(DATE,'FORMAT') 日期型转字符串
--2016-10-15 00:52:18
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
--$122323.45数据转字符串
SELECT TO_CHAR(122323.45,'$99999999.99') FROM DUAL;

--TO_DATE(STRING,'FORMAT')字符串转日期型
--16-10-14
SELECT TO_DATE('2016-10-14','YYYY-MM-DD') FROM DUAL;

--TO_NUMBER
SELECT TO_NUMBER('2016') AS Year FROM DUAL;

--RUNC(number[,decimals])
SELECT TRUNC(2.3453465756,-2) AS FirstNumber,TRUNC(2.3453465756,2) AS SecondNumber FROM DUAL;

2)使用函数一定要做好代码注释,确保别人可以知道所编写的SQL代码的含义;

3)文本处理函数

LEFT() 返回字符串左边的字符;

RIGHT() 返回字符串右边的字符;

LENGTH() ; DATALENGTH(); LEN() 返回字符串的长度;

LOWER() 将字符串转为小写;

LTRIM() 去掉字符串左边的空格;

RTRIM() 去掉字符串右边的空格;

UPPER() 将字符串转换为大写;

SOUNDEX() 返回字符串的SOUNDEX值(将任何字符串转换为描述其语音表示的字母数字模式的算法);

SELECT vend_name, UPPER(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;

--SOUNDEX()
SELECT cust_name,cust_contact FROM customers WHERE cust_contact = 'Michael Green';
SELECT cust_name,cust_contact FROM customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');

4)日期和时间处理函数(Oracle中)

--to_char()提取日期的成分
--to_number()将提取出的成分转换为数值
SELECT order_num FROM orders WHERE to_number(to_char(order_date,'YYYY')) = 2012;

--to_date()将两个字符串转换为日期
--CONVERT()可替代to_date()
SELECT order_num FROM orders WHERE order_date BETWEEN to_date('01-01-2012') AND to_date('12-31-2012');

5)数值处理函数(最具统一却不常用)

ABS() 返回一个数的绝对值

COS() 返回一个角度的余弦

EXP() 返回一个数的指数值

PI() 返回圆周率

SIN() 返回一个角度的正弦

SQRT() 返回一个数的平方根

TAN() 返回一个角度的正切

9.汇总数据

1)聚集函数:对某些行运行的函数,计算并返回一个值;

AVG() 返回某列的平均值;

--AVG()只能用来确定特定数值列的平均值,且列名必须作为函数参数给出;
--多个列的平均值要使用多个AVG();
--忽略列值为NULL的值;
SELECT AVG(prod_price) AS avg_price FROM products;
SELECT AVG(prod_price) AS avg_price FROM products WHERE vend_id = 'DLL01';


COUNT() 返回某列的行数

--COUNT(*)对表中的数目进行计数,不管表列中包含的是空值还是非空值;
--COUNT(column)对特定列中具有值的行进行计数,忽略NULL值;
--结果为:5
SELECT COUNT(*) AS num_cust FROM customers;
--结果为:3  表示5个顾客中只有3个顾客有电子邮件地址
SELECT COUNT(cust_email) AS num_cust FROM customers;


MAX() 返回某列的最大值

--MAX()大多用于找出最大的数值或日期值
--在用于文本数据时,其返回该列排序后的最后一行
--其忽略列值为NULL的行
SELECT MAX(prod_price) AS max_price FROM products;


MIN() 返回某列的最小值

--MAX()大多用于找出最小的数值或日期值
--在用于文本数据时,其返回该列排序后的最前面一行
--其忽略列值为NULL的行
SELECT MIN(prod_price) AS max_price FROM products;


SUM() 返回某列值之和

--利用标准的算术操作符,所有聚集函数都可以用来执行多个列上的计算,如下
--忽略列值为NULL的行
SELECT SUM(item_price*quantity) AS total_price FROM orderItems WHERE order_num = 20005;

2)聚集不同值

对所有行执行计算,指定ALL参数或默认ALL参数;

只包含不同的值,指定DISTINCT参数;

--DISTINCT不能用于COUNT(*),可用于COUNT(列名)
--DISTINCT必须使用列名,不能用于计算或表达式
--DISTINCT用于MIN或MAX是无意义的
SELECT AVG(prod_price) AS avg_price FROM products WHERE vend_id = 'DLL01';
SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 'DLL01';

3)组合聚集函数 SELECT语句可根据需要包含多个聚集函数

SELECT COUNT(*) AS num_items,MIN(prod_price) AS price_min,MAX(prod_price) AS price_max
,AVG(prod_price) AS price_avg
FROM products;

10
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: