--
mysql安装
--
https://www.mysql.com/downloads/
终端执行命令
(可参考本笔记MySQL环境搭建-mysql 8.0.13 解压版安装配置方法图文教程)
mysql 教学demo --命令行输指令创建表
http://www.forta.com/books/0672336073/
数据库tysql关系图
--
概念
--
数据库:保存有组织数据的容器
数据库软件:也作DBMS,数据库是通过DBMS来创建和操纵的容器。
表table:某种特定类型的结构化清单。数据库中的每个表都有唯一的名字来标识自己,称之为表名。
模式schema:用来描述关于数据库和表的布局及特性的信息。
表的列column:表中的一个字段,所有表都是由一个或多个列组成的。
行row:表中的一条记录。record
主键primary key:一列或几列,其值能够唯一标识表中的每一行。不能重用,不允许修改和更新,即使某行从表中删除,他的主键也不能赋给以后的新行。
数据类型datatype:所允许的数据的类型,每个表列都有相应的数据类型,它限制该列中存储的数据。
--
ch2 检索数据
--
查询
SELECT 列1, 列2 FROM 表;
一般习惯:关键是大写,列名和表名使用小写。
所有空格都被忽略。即SQL可以写一行也可以多行。不区分大小写,不论关键字还是表名列名。
SELECT
DISTINCT vend_id FROM Products; --仅显示不同项,DISTINICT必须放在列名的前面,否则无效(不会报错,仅DISTINICT不生效,SELECT正常执行)
SELECT DISTINCT vend_id FROM Products LIMIT 2; --限制仅输出查询的两行,不同数据库软件对于指令略有不同
SELECT prod_id FROM Products LIMIT 3 OFFSET 1;--从OFFSET开始查询最多3行,OFFSET为起点坐标(从0开始计数)
注释
-- 注释内容 两个连字符和注释之间有至少一个空格符,否则语法错误
#注释内容,没有空格要求
/*注释内容*/ 可以进行多行注释,没有空格要求
--
ch3 排序检索数据
--
SELECT prod_name FROM Products
ORDER BY prod_price; -- 按物品价格排序,默认从低到高,必须是SELECT中最后一条语句,否则报错。
SELECT prod_name,prod_price FROM Products
ORDER BY prod_price,prod_name; --先按价钱再按名称排列(分两次排列)
SELECT vend_id,prod_name,prod_price FROM Products ORDER BY 3,1 DESC; --先按第3列再按第1列排序(从0开始算,一般调试使用)
SELECT prod_name,prod_price FROM Products ORDER BY prod_price DESC,prod_name DESC; --降序排序,不同列名需要分别添加DESC才有效果。
--
ch4 过滤数据
--
SELECT prod_name,prod_price FROM Products
WHERE
prod_price = 9.49; --匹配价格为9.49的产品
WHERE子句操作符
常用的比较操作符
不等于 <> 或者 !=
不大于 !>
在指定的两个值之间 BETWEEN
是NULL值 IS NULL
NULL
它与字段包含0、空字符串或仅仅包含空格不同
eg. SELECT prod_name,prod_price,vend_id FROM Products WHERE vend_id != 'BRS01';
SELECT cust_name,cust_email FROM Customers WHERE cust_email IS NULL;--筛选NULL值
--
ch5 高级数据过滤
--
SELECT prod_name,prod_price,vend_id FROM Products
WHERE vend_id = 'DLL01'
AND prod_price = 3.49;
OR操作符
当OR WHERE子句的第一个条件得到满足时,就不再计算第二个条件了(原文这样写,不太明白)
感觉取的是两个条件的并集。打印如下
优先级 AND > OR
IN操作符:
优点:
清楚直观。
求值顺序便于管理,相对于AND OR来说。
执行效率比OR高。
最重要的是能够包含其他SELECT语句。
NOT操作符,条件取反操作。
MariaDB 支持使用NOT否定IN、BETWEEN和EXISTS子句。大多数DBMS允许使用NOT否定任何条件。
SELECT prod_name,vend_id FROM Products WHERE vend_id NOT IN ('DLL01', 'BR01') ORDER BY prod_name;
--
ch6 用通配符进行过滤
--
LIKE操作符--匹配搜索、复杂过滤
LIKE ‘%’表示任何字符出现任意次数。有些DBMS使用*表示。
%可以匹配任何字符,但有一个例外,就是NULL。
LIKE ‘_’ 表示只匹配单个字符。
方括号[] 通配符 用来指定一个字符集合。它必须匹配指定位置的一个字符。(不生效,暂时未扎到原因)
--
ch7 创建计算字段
--
字段(filed):基本上与列(column)意思相同。
TRIM,RTRIM,LTRIM函数在MYSQL中无效。
下面返回元素的一个列即为计算字段。连接字符串用函数CONCAT
用AS方便命名返回后 的列名(计算字段)
执行计算命令
如何测试计算,直接用SELECT
--
ch8 使用函数处理数据
--
#找发音相似的客户
SELECT cust_name,cust_contact FROM Customers WHERE
SOUNDEX(cust_contact)=
SOUNDEX('Michael Green');
SELECT order_num,order_date FROM Orders WHERE YEAR(order_date) = 2012;--筛选年份为2012的订单号
数字处理函数
--
ch9 汇总数据
--
聚集函数:对某些行运行的函数,计算并返回一个值。
基本的一些聚集函数,计算平均值,计数,最大值,最小值,求和。
COUNT(*) 对所有行计数,包括NULL行。如果指定列名,则会忽略NULL行。
聚集函数用来汇总数据,这些函数很高效,返回结果比在客户端应用程序中计算要快的多。
指定不同价格求平均
--
ch10 分组数据
--
按给定的分组返回对应组的计算字段。
GROUP BY子句使用注意:
a 支持嵌套,数据将在最后指定的分组上进行汇总。(建立分组时,指定的所有列都一起计算)
b 子句接收的每一列必须是检索列或是有效的表达式,不能是聚集函数。如果SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。
c 不允许GROUP BY列带有长度可变的数据类型(如文本或备注型字段)
d 如果分组中包含NULL值的行,则NULL作为一个分组返回。若列中有多个NULL值的行,它们将分为一组。
e GROUP BY 必须出现在WHERE子句之后,ORDER BY子句之前。
WHERE过滤行,而HAVING过滤分组。(匹配)HAVING支持所有的WHERE操作符。
WHERE在数据分组前对数据进行过滤,而HAVING在数据分组后对数据进行过滤。
--
ch11 子查询
--
查询(query)任何SQL语句都是查询。但此术语一般指SELECT语句。
子查询(subquery):SQL允许创建子查询,即嵌套在其他查询语句中的查询。查询嵌套
查询产品id为'RGAN01'的所有订单用户
注意:
a 作为子查询的SELECT语句只能查询单个列。否则报错。
b 子查询和性能:使用子查询并不总是执行这类数据检索的最有效方法。
作为计算字段使用子查询--显示Customers表中每个顾客的订单总数:(注 红色部分需要两张表都在from后面才能使用,否则只能找到其中一张表)
--
ch12 联结表 --join
--
思考:如果数据存储在多个表中,怎样用一条SELECT语句就检索出来呢?
联结是一种机制,用来在一条SELECT语句中关联表,因此称为联结。
关系表:
关系表的设计就是要把信息分解成多个表,一类数据一个表。各表通过某些共同的值互相关联,所以也叫关系数据库。
将数据分解为多个表能够更有效地存储,更方便地处理。
创建联结:指定要联结的所有表以及关联他它们的方式即可。
笛卡尔积:没有联结条件(上面的where),则返回的是第一张表A和第二张表B的每一行匹配(AXB),我们称之为笛卡尔积。
注:笛卡尔积不是我们想要的,这里返回的数据每个供应商都匹配了每个产品,包括供应商根本没有的产品。要保证所有联结都有正确的where语句,否则DBMS将返回比你想要的数据多得多的数据。
叉联结:有时返回笛卡尔积的联结,也称叉联结(cross join)--暂时未涉及
内联结:目前为止使用的联结为等值联结,它是基于两个表之间的相等测试。这种联结也称为内联结。稍微不同的语法:
select T1col, T2col
form T1 join T2
on T1.id = T2.id