LCL WARNING
这是我学习《PHP和MySQL Web 开发》的读书笔记,一些重要的知识点我会记录下来,当然只会写我觉得重要的。
如果有幸有人看到这个学习笔记了,你要结合着书看,不要光看这个笔记。
在笔记里我会记录一些我学习中遇到的问题和解决办法与注意事项。
为了方便管理和查找,文章或者说笔记的目录我就按照书里的排了,方便对比着看。
不是教学!重要的是说一遍!我是PHP和MySQL 的初学者,我本身是个前端,为了面向工资编程,拓宽知识面才学的。
其实还是有一些私心得,因为都说教学相长 和 ,我这个是小老虎学习法,对着小老虎讲知识点,保证自己学的扎实,能挣钱。
欢迎探讨和指教,须知一山更比一山高,但是拒绝杠精!
李重楼
本章主要是介绍了:
- SQL是什么
- 在数据库中插入数据
- 从数据库中取回数据
- 表的链接
- 使用子查询
- 更新数据库中的记录
- 删除数据库中的记录
- 删除表
你仔细看,每章前的描述,本章主要有介绍什么什么内容,那基本上都是你要掌握的,看完一章回来对对这个列表,都会了嘛。开始吧。
10.1 SQL是什么
SQL的全称是Structured Query Language。它是访问关系数据库管理系统的标准语言。
Structured Query Language 结构化查询语言,structured 结构化的,读['strʌktʃəd] 。
用于定义数据库的数据定义语言(Data Definition Language,DDL)和用于查询数据库的数据操作语言(Data Manipulation Language,DML).SQL包含这两个基础部分。
10.2 在数据库中插入数据
insert 语句通常格式如下:
INSERT [INTO] table [(col1,col2,col3,...)] VALUES (value1,value2,value3,...);
书中给的例子:
insert into customers values (null,'Julie Smith','25 Oak Street','Airport West');
结合书都能看明白吧?
划重点:mysql中的字符串应该包含在一对单引号或双引号中。
使用 insert 语句指定插入的值会按照插入的顺序添加到表中的列。
如不按照列顺序添加,要指定添加列如下:(比如说只更新用户名)
insert into customers (name,city) values('Melissa Jones','Nar Nar Goon North');
或
insert into customers ->set name = '李重楼', ->address = '莲花池水沟子', ->city = '北京';
然好好好看看关于customerid列指定为null是为什么?(一会儿结合查询看一下查询出来的结果,customerid列的值是什么。)
插入多条数据时,参看程序清单10-1,每个括号内是一条数据,括号间逗号分隔。
LOW_PRIORITY关键字
LOW_PRIORITY 低优先级,主动的降低了语句执行的优先级。(了解即可,我问了后端和爬虫的同事,说不怎么用...)
MySQL的默认的调度策略可用总结如下:
· 写入操作优先于读取操作。
· 对某张数据表的写入操作某一时刻只能发生一次,写入请求按照它们到达的次序来处理。
· 对某张数据表的多个读取操作可以同时地进行。
DELAYED关键字
DELAYED 延迟,延迟插入。这个也先了解,我看到后面重要的话,我回来再修改补充这里。
DELAYED调节符应用于INSERT和REPLACE语句。当DELAYED插入操作到达的时候, 服务器把数据行放入一个队列中,并立即给客户端返回一个状态信息,这样客户端就可以在数据表被真正地插入记录之前继续进行操作了。
10.3从数据库中获取数据
前边的基本格式我就不写了,太长了关键是,实在是懒得敲了。
此处有个重点要说明一下:from 是从..的意思 是 F !! R!! O!!! M!!! form是表单!!!别写错了,出错误的时候检查一下这个命令关键字!再看看表名!列名有没有写错!少个S多个S啥的! 这都是血泪换来经验啊!要好好记住啊~乖!!!
上面那段红字,其实是在我初次看书,实操代码时候记下来的,这里同样写了出来。希望对你有帮助。
书上的代码一定要跟着敲,多敲才能手熟,才能发现问题,比如我用bookorama账号登录的数据库,查询结果就都变成了乱码,首先我敢肯定,这是编码问题。然后我Google了怎么解决,但是呢,我不敢改,因为我用的是公司项目的开发版本数据库,虽然有正式版本作后盾,但是乱改配置我也得掂量一下,所以呢,这里我先放一下。(如果你解决了你告诉我怎么解决的,我这里的编码是utf8mb4的,也请告诉我,root不错乱,但是bookorama 为啥错乱,谢谢。)
select name ,city from customers;
通过在select关键字后给出列名称,可以指定(查询)任何数量的列。
其中一个有用的是通配符 “ * ”(星号),它可以匹配指定一个或多个表中的所有列。
现在呢,尝试一下通过通配符查询customers表,看一下在插入数据时,指定为null或为空的customerid列的值都是什么,这能够帮助你理解自增量。
查询结果如下:(我这个自己改了点数据,可能和你的不一样,以理解为主吧)
+------------+-----------------+--------------------+--------------------+| customerid | name | address | city |+------------+-----------------+--------------------+--------------------+| 1 | 刘能 | 牡丹江大街 | 牡丹江 || 2 | 李重楼 | 北京中 | 北京 || 3 | 谢广坤 | 保定市徐水县 | 保定 || 4 | Alan Wong | 1/47 Haines Avenue | 保定 || 5 | Michelle Arthur | 357 North Road | Yarraville || 6 | Melissa Jones | c3-1 | Nar Nar Goon North |+------------+-----------------+--------------------+--------------------+
另一个是,如果不知道当前表,或者你需要操作的表都包含哪些列,列名,数据类型,主键是什么的话,下面这个命令没忘吧?
describe tablename;
查询结果如下:(customers表结果)
+------------+-----------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+------------+-----------+------+-----+---------+----------------+| customerid | int(11) | NO | PRI | NULL | auto_increment || name | char(70) | NO | | NULL | || address | char(100) | NO | | NULL | || city | char(30) | NO | | NULL | |+------------+-----------+------+-----+---------+----------------+
10.3.1获取满足条件的数据
WHERE语句指定了用于选择特定行的条件。
首先翻回去一页,看一下 where 在select查询语句基本格式中的样式。
它是方括号内的,表示可选的。也就是你有需要可以加上。所以,你要学会看基本格式。
select * from orders where customerid= 3;
可以看出,命令是分行的,你也可以按回车分行敲,也可以一行敲,区别是,如果你分行敲,方便MySQL指出第几行由错误。(我都是一行敲的,方便按键盘方向键上下键切换语句)
我书里的命令是 where customerid= 3,但是书中写的是customerid为5的行将被选中。我觉得是书写错了,查询出来的应该是按照条件查询出的结果,一切以实际操作结果为准。(我的书是原书第四版,如果不是编辑没校正这一块,那他妈就是盗版书的问题了)
表10-1中列出了常用的的比较操作符,自己看吧,可以都操作一下,看一下效果。
特别的列出 BETWEEN 的列子:(between 是这么用的)
select * from customers where customerid between 10 and 16;
然后尝试一下AND和OR组合,使用条件。
10.3.2从多个表中获取数据
这一节的点睛之笔来了啊,其实数据库的点睛之笔也是这句话。(个人认为)
要通过数据回答一个问题。
开始吧。
这些数据分布在不同的表中,因为他们与现实世界的对象相关。
书中说在第8章介绍过了。
当创建一个数据库时,我们经常为现实世界的实体和关系建立模型,并且储存这些实体对象与关系的信息。
要在SQL中奖这些信息放到一起,必须执行一个名为关联的操作。简单地说,这意味着需要根据数据间的关系将两个或更多的表关联到一起。
1.简单的关联
select orders.orderid,orders.amount,orders.date from customers,orderswhere customers.name='Julie Smith' and customers.customerid = orders.customerid;
一个很重要的关联准则请记住:
因为是通过来自两个表的信息来完成这个查询,因此我们必须将两个表都列在这里。(你的查询中,需要列出你要查询的列数据从哪个数据表中来。)
表名之间的逗号等价于输入INNER JOIN 或 CROSS JOIN。
有时也称为完全关联或表的笛卡尔乘积。
笛卡尔乘积...这个比较迷,我给数学不好的同学们解释一下:(两两相乘?)
简单的说就是两个集合相乘的结果。
具体的定义去看看有关代数系的书的定义。 直观的说就是 集合A{a1,a2,a3} 集合B{b1,b2} 他们的 笛卡尔积 是 A*B ={(a1,b1),(a1,b2),(a2,b1),(a2,b2),(a3,b1),(a3,b2)} 任意两个元素结合在一起
然后书里说了,这个没意义。确实没有意义,你输入一下 select * from customers,orders; 你就会看到这两个数据表的笛卡尔乘积 。我就不贴,太长了。
所以,我们需要通过 where子句使用关联条件,来筛选出有意义的数据。
书中例子已经给出了(customers.name='Julie Smith' and customers.customerid = orders.customerid;)筛选出Julie Smith的订单。
个人总结一下:
- 确认需要哪些数据列。
- 如果当前数据表中不包含某数据列,需要把包含此数据列的数据表引入进来。
- 两个数数据表完全关联一下子!(此时脑补你要的数据格式已经出现,只不过有N条,你不知道是哪条!)
- 通过where子句提供筛选条件,得到筛选结果。