《Mysql必知必会》读书笔记——第一篇

第一章 了解SQL

数据库:保存有组织的数据的容器。

表:某种特定类型的结构化清单。

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

第一节 列和数据类型

表是由列所组成的。

数据类型:所容许的数据的类型。每个表列都有相应的数据类型,它限制该列的数据。

第二节 行

表中的数据是按行存储的,所保存的每个记录存储在自己的行内。

行:表中的一个记录。

第三节 主键

主键:一列或者一组列,其值能够唯一区分表中每个行。

mysql主键规则:
1.任意两行都不具有相同的主键值。
2.每个行都必须具有一个主键值(主键值不允许是NULL值)。

主键的最好习惯:
1.不更新主键列的值;
2.不重用主键列的值;
3.不在主键中使用可能会更改的值。

第四节 什么是SQL

SQL是结构化查询语言(Structured Query Language)的缩写。SQL是一种专门用来与数据库通信的语言。

第二章 MySQL简介

第一节 MySQL工具

MySQL命令行

登录:mysql --host=localhost --user=root --password=root
或者: mysql -h localhost -u root -p root
退出:quit 或 exit

第三章 使用mysql

第一节 连接数据库

在正确连接到MySQL知后,没有任何数据库打开供我们使用,这时可用USE关键字选择一个数据库。

关键字(key word):作为MySQL语言组成部分的一个保留字,绝不能使用关键字命名一个表或者列。

例如,为了使用一个名为crashcourse的数据库,应该输入以下内容:

USE crashcourse;

USE语句并不返回任何结果。
记住,必须使用USE打开数据库,才能读取其中的数据。

第二节 了解数据库和表

当我们想知道MySQL可以使用的数据库时,可以使用SHOW关键字查询数据库名:

SHOW DATABASES;

为了获得一个数据库内的表的列表时,使用SHOW TABLES

 SHOW TABLES;

SHOW也可以用来显示表列:

SHOW COLUMNS FROM CUSTOMERS;

SHOW COLUMNS 要求给出一个表名,它对每个字段返回一行,行中包含了字段名,数据类型,是否允许NULL值,键信息,默认值以及其他信息。

什么是自动增量:
某些表列需要唯一值。在每个表添加到表中时,MySQL可以自动的每个行分配下一个可以使用的编号,不用再添加一行时手动分配唯一值。这个功能就是自动增量,如果需要它,则必须在用Create语句创建表时把它作为一个表定义的组成部分。

MySQL支持使用describe作为show columns from * 的一种快捷方式。换句话说,describe customers;是show columns from customers;的一种快捷方式。

所支持的其他show语句还有:

  1. show status,用于显示广泛的服务器状态信息;
  2. show crate databases和show crate table,分别用来显示创建特定数据库或表的MySQL语句。
  3. show grants,用来显示授权用户的安全权限;
  4. show errors和show warnings,用来显示服务器错误或警告消息。

第四章 检索数据

第一节 select语句

使用规则:

select columns_name from table_name;

以上的select语句将返回名为table_name表中columns_name这一列的所有行数据。数据没有过滤,也没有排序。

注意:

  1. SQL语句不区分大小写。
  2. 在处理SQL语句时,其中所有空格都被忽略。

第二节 检索多个列

检索多个列时,只需要在select后面跟多个列名即可。在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加。

检索所有列:

select * from tabel_name;

检索不同的行

当我们想在检索的列中显示所有不同的行时,可以使用distinct关键字。

select distinct columns_name from table_name;

distinct告诉MySQL只返回不同(唯一)的columns_name行。

注意:
不能部分使用distinct,distinct会应用于所有列而并不仅仅是前置它的列,例如:

select distinct col_name1, col_names2 from table_name;

除非指定的两个列都不同,否则将所有行都被索引出来。

限制条件

select语句返回所有匹配的行,它们可能是指定表中的每个行,为了返回第一行或者前几行,可使用limit子句:

select prod_name from products limit 5;

limit 5指示MySQL返回不多于5行。
为了得到下一个5行,可以指定开始的行与显示的行数,如:

select prod_name from products limit 5, 5;

上面语句意思是指示MySQL返回从第5行开始的后面5行。
带有一个值的LIMIT总是从第一行开始的,给出的数为返回的行数,带两个值的limit可以指定从行数为第一个值的位置开始。

行0 检索出来的第一行为第0行而不是第一行,因此LIMIT 1,1 将检索出第二行而并非第一行。

完全限定的表名

可以通过完全限定的名字来引用列:

select products.prod_name from products;

表名也可以完全限定的:

select products.prod_name from crashcourse.products;

第五章 排序检索数据

第一节 排序数据

为了明确排序用select语句检索出来的数据,可使用order by子句。order by子句可以取一个或者多个列的名字,据此对输出进行排序。如:

select prod_name from products order by prod_name;

指示MySQL对prod_name列以字母顺序排序数据。

第二节 排序多个列

为了按多个列排序,只要指定列名,列名之间用逗号分开即可。
在按多个列排序时,排序完全按所规定的顺序进行。如:

select prod_id, prod_price, prod_name from products order by prod_price, prod_name;

对于这个例子,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按照prod_name排序。

第三节 指定排序方向

数据排序并不仅限于升序,还可以使用order by子句进行降序排列,为了进行降序排列,必须使用desc关键字。例如:

select prod_id, prod_price, prod_name from 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相反的关键字是asc(ascending),在升序排序时可以指定,但实际上,因为升序排列是默认的,所以asc没什么作用。

使用order by和limit的组合,能够找出一个列中最高或最低的值。例如:

select prod_price from products order by prod_price desc limit 1;

应该注意的是,order by必须放在from子句之后,如果使用limit,它必须位于order by之后,使用子句顺序不当将会报错。

第六章 过滤数据

第一节 使用where子句

在select语句中数据根据where子句中指定的搜索条件进行过滤。where子句在表名(from 子句)之后给出。如:

select prod_name, prod_price from products where prod_price=2.50;

这个例子只是简单的使用了判断是否相等的情况,还可以使用其他条件进行过滤。

where子句的位置:在同时使用order by 和where子句时,应该让order by位于where之后,否则将产生错误。

第二节 where子句操作符

操作符说明
=等于
<>不等于
!=不等于
<小于
>大于
<=小于等于
>大于
>=大于等于
between在指定的两个值之间

例子:

select prod_name, prod_price from products where prod_price <= 10;
select prod_name, prod_price from products where prod_name = 'fuses';

何时使用引号:单引号用于限定字符串,如果将值与串类型的列进行比较,则需要限定引号。用来与数值列进行比较时的值不用加引号。

Between用法:

select prod_name, prod_price from products where prod_price between 5 and 10;

在使用between时,所需范围的低端值和高端值之间必须用and关键字分隔,between匹配范围中的所有值,包括指定的开始指与结束值,也就是说所给的范围是一个闭区间。

空值检查
一个列不包含值时,我们称其为包含空值NULL。
select语句中有一个特殊的where子句,可用来检查具有NULL值的列,这个where子句就是IS NULL语句。语法为:

select prod_name from products where prod_price is null;

注意:在通过过滤选择出不具有特定值的行时,你可能希望返回具有NULL的值的行,但是并不会,数据库并不知但空值是否匹配我们给出的匹配条件,所以在匹配过滤或者不匹配过滤时不返回它们。
因此,在过滤数据时,一定要先验证返回数据中确实给出了被过滤列具有NULL的行。

第七章 数据过滤

第一节 组合where语句

在上一章中,where子句在过滤数据时使用的都是单一的条件,为了进行更加强大的过滤控制,MySQL允许使用多个where子句。这时可以使用两种方式使用:

  1. 使用and子句的方式;
  2. or子句的方式使用。

例子:
1. and 操作符

select prod_id, prod_price, prod_name from products where vend_id = 1003 and prod_price <= 10;

还可以添加多个过滤语句,每添加一条就要使用一个and。
2.or操作符

select prod_name, prod_price from products where vend_id = 1002 or vend_id = 1003;

计算次序

当使用and 和or进行组合时,可能会产生组合上的错误,例如:

select prod_name, prod_price from products where vend_id = 1002 or vend_id = 1003 and prod_price >= 10;

这句话我们原本想要表达的意思是说选择vend_id为1002或者1003,而且prod_price要大于等于10的产品,但是在实际运行过程中,MySQL或首先运行and部分,即先找符合vend_id=1003并且prod_price=10的产品,再去寻找vend_id=1002而prod_price随意的产品,运行结果就会和我们想要得到的结果出现不一致。我们需要更改为:

select prod_name, prod_price from products where (vend_id = 1002 or vend_id = 1003) and prod_price >= 10;

第二节 IN操作符

IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取由逗号分隔开来的合法值的清单。例如:

select prod_name, prod_price from products where vend_id in (1002, 1003) order by prod_name;

实际上,in操作符的功能和or是一样的,但是我们还是优先选择in操作符,原因有:

  1. 在使用长的合法选项清单时,in操作符的语法更清楚且更直观;
  2. 在使用in时,计算的次序更容易管理;
  3. in操作符一般比or执行更快;
  4. in的最大优点在于可以包含其他select语句,使得能够更动态的建立where子句。

not操作符

not操作符唯一的功能就是否定它之后的任何条件。例如:

select prod_name, prod_price from products where vend_id not in (1002, 1003) order by prod_name;

MySQL中支持使用NOT对IN、between和exists子句取反,这与多数其他DBMS允许使用not对各种条件取反有很大的差别。

第八章 用通配符进行过滤

第一节 like操作符

为了搜索子句使用通配符,必须使用like操作符。like指示MySQL,后面的搜索模式利用通配符而不是直接相等匹配进行比较。

%操作符

%表示任意字符出现任意次数,例如为了找出以词jet起头的产品,可使用以下语句:

select prod_id, prod_name from products where prod_name like 'jet%';

应该注意的是,除了一个或多个字符外,%还能匹配0个字符。%代表的是搜索模式中给定位置的0个、1个或多个字符。

特别需要注意到的时尾空格,尾空格会干扰到通配符匹配。例如,例如在保存anvil时,如果它的后面有一个或多个空格,则子句 "where prod_name like %anvil;"将不会匹配到它们,因为在最后的l后面还有空格符。解决这一问题的有效办法就是在搜索模式后面附加一个%,一个更好的办法就是使用函数去掉首尾空格。

虽然表面上%可以匹配任意东西,但是实际上它并不能匹配到NULL,即便是“
where prod_name like %”也不能匹配到NULL。

下划线(_)操作符
_操作符的作用和%一样,但是下划线只匹配单个字符而不是多个字符。例如:

select prod_id, prod_name from products where prod_name like '_ ton anvil;'

第二节 使用通配符的技巧

在使用通配符时,要主要的是:

  1. 不要过度使用通配符,如果其他操作符能做到相同的功能,应该使用其他操作符。
  2. 将通配符放置在搜索模式的开始处,搜索起来是最慢的。
  3. 仔细注意通配符的位置。如果放错地方,可能得不到想要的结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值