1. MySQL概述
1.1数据库基础
- 数据库:保存有组织的数据的容器(通常十一个文件或一组文件)
- 表:一种结构化的文件,可用来存储某种特定类型的数据,顾客清单、产品目录等。
- 虽然在相同的数据库中不能两次使用相同的表明,但在不同的数据库中却可以使用相同的表名
- 模式:关于数据库和表的布局及特性的信息
- 列:表中的一个字段。所有表都是由一个或多个列组成的。
- 数据类型:所容许的数据的类型。每个表列都有相应的数据类型,它限制(或容许该列中)存储的数据
- 行:表中的一个记录(把表想象成网格,网格中垂直的列为表列,水平行为表行)
- 主键:一列(或一组列),其值能够唯一区分表中每个行
- 唯一标识表中每行的这个列称为主键,用来表示特定的行,方便更新或删除表中特定行。
- 主键需满足:
- 任意两行都布局相同的主键值
- 每个行都必须有一个主键值(主键列不允许NULL值)
- 不更新主键列中的值
- 不重用主键列的值
- 不在主键列中使用可能会更改的值。(例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。)
1.2什么是SQL
- SQL:一种专门用来与数据库通信的语言
1.3 MySQL概述
- MySQL:数据的所有存储、检索、管理和处理实际上是由数据库软件—DBMS(数据库管理系统)完成的。MySQL是一种DBMS,即它是一种数据库软件。
1.4MySQL命令行实用程序
- 命令输入在mysql>之后
- 命令用;或\g结束,仅按enter不执行命令
- 输入help或\h获得帮助,也可输入更多的文本获得特定命令的帮助(如,输入help select获得使用select语句帮助)
- 输入quit或exit退出命令行实用程序
2.使用MySQL
2.1连接MySQL
- 主机名(计算机名)–如果连接到本地MySQL服务器,为localhost;
- 端口(如果使用默认端口3306之外的端口);
- 一个合法的用户名
- 用户口令(如果需要)
2.2选择数据库
- 使用某个数据库
mysql > use db1;
- use语句并不返回任何结果,依赖于使用的客户机,显示某种形式的通知。
2.3了解数据库和表
- show databases返回可用数据库的一个列表。
- show tables:返回当前选择的数据库可用表的列表
- show columns from 表名:它对每个字段返回一行,行中包含字段名、数据类型、是否允许NULL、键信息、默认值以及其他信息(如字段cust_id的auto_increment)
- 自动增量:某些表列需要唯一值,如订单编号,雇员ID等。每个行添加到表中时,MySQL可以自动为每个行分配下一个可用编号,不用在添加一行时手动分配唯一值,这个功能就是所谓的自动增量,如果需要,则必须在用create语句创建表时把它作为表定义的组成部分
- MySQL支持用describe作为show columns from的一种快捷方式
- show status:用于显示广泛的服务器状态信息;
- show create database和show create table:分别用来显示创建特定数据库或表的MySQL语句;
- show grants:用来显示授予用户(所有用户或特定用户)的安全权限
- show errors和show warnings:用来显示服务器错误或警告信息
3.检索数据
3.1检索
- select:检索数据,必须至少给出两条信息——想选择什么,以及从什么地方选择。
//检索单个列
mysql> select plugin from user;
//检索多个列
mysql> select authentication_string,account_locked from user;
//检索所有列
mysql> select * from user;
- 通配符(*):给定一个通配符,则返回表中所有列,列的顺序一般是列在表定义中出现的顺序,但表的谋士的变化(添加或删除列)可能会导致顺序的变化,最好不用通配符,检索不需要的列会降低检索和应用程序的性能。
- select distinct (表中某种数据):告诉MySQL只返回不同(唯一)的(表中数据)行
- distinct关键字应用于所有列,如果给出 select distinct vend_id,prod_price,除非两个列不同,否则所有航都将被检索出来
- select prod_name from products limit 3:会返回三行数据,若limit 3,3则是从行3开始返回两行。(行0指第一行,limit1,1将检索出第二行而不是第一行)
- MySQL 5语法(limit 4 offset 3)从行3开始取四行,就像limit 3,4一样
- select products.prod_name from crashcourse.products:使用完全限定的列名和完全限定的数据库名。
4.排序检索数据
4.1排序数据
- 子句:一个子句通常由一个关键字和所提供的数据组成,子句的例子有select语句的from子句,可使用order by子句,取一个或多个列的名字,据此输出排序
- 也可
mysql > select prod_id,prod_price,prod_name from products order by prod_price,prod_name;
首先按价格,然后再按名称排序(仅在多个行具有相同的价格时才对产品按名称排序)
mysql > select prod_id,prod_price,prod_name from products order by prod_price desc,prod_name;
(添加desc表示降序排列,最贵的排在最前面,然后按产品名字排序)
- order by 与limit组合可以找出一个列中最高或最低的值
- order by必须位于from子句后
5.过滤数据
5.1使用where子句
mysql > select prod_name, prod_price from products where prod_price =2.50;
只返回prod_price值为2.50的行
- SQL过滤与应用过滤:数据也可以在应用层顾虑。为此目的,SQL的SELECT语句为客户机应用检索出超过实际所需的数据,然后客户机代码对返回数据进行循环,以提取出需要的行。
- 在同时使用order by 和where子句时,应该让order by 位于where之后
5.2 where子句操作符
- 检查单个值:
mysql > select prod_name,prod_price from products where prod_name = 'fuses';
- 不匹配检查:
mysql > select vend_id,prod_name from products where vend_id <>1003;
- 不是由供应商1003制造的所有产品
- 单引号用来限定字符串,如果将值与串类型的列进行比较,则需要限定引号,用来与数值列进行比较的值不用引号。
- 范围内检查:
mysql > select prod_name,prod_price from products where prod_price between 3 and 10;
- 空值检查:
mysql > select prod_name from products where prod_price is null;
返回空prod_price字段,不是价格为0;
6.数据过滤
6.1使用where子句
- 操作符:用来联结或改变where子句中的子句的关键字,也称为逻辑操作符。
- AND操作符:
mysql > select prod_id,prod_price,prod_name from products where vend_id=1003 and prod_price <=10;
- or操作符:
mysql > select prod_id,prod_price,prod_name from products where vend_id=1002 or vend_id=1003;
- 计算次序:AND在计算次序中优先级高
mysql > select prod_name,prod_price from products where (vend_id = 1002 or vend_id = 1003) and prod_price >=10;
可以让or提前进行操作
6.2 IN操作符
- IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配:
mysql > select prod_name,prod_price from products where vend_id IN (1002,1003) order by prod_name;
- 优点:
- 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
- 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
- IN操作符一般比or操作符清单执行更快
- IN的最大优点是可以包含其他select语句,是的能够更动态的建立where子句
6.3 NOT操作符
- NOT操作符是where子句中用来否定后跟条件的关键字:
mysql > 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对各种条件取反有很大的差别
7.用通配符进行过滤
7.1 LIKE操作符
- 通配符:用来匹配值的一部分的特殊字符。
- 搜索模式:由字面值、通配符或两者组合构成的搜索条件
- 百分号通配符(%):%表示任何字符出现任意次数
//搜索以m开头的任何词,这里的%表示m之后的任意字符
mysql> select user from user where user like 'm%';
//搜索任何位置包含文本m的值,不论前或后出现什么字符
mysql > select user from user where user like '%m%';
//搜索s开头e结尾的所有产品
mysql > user from user where user like 'a%m';
- 不能通过’%'来匹配NULL值作为产品名的行
- 下划线(_)通配符:
- 与%通配符用途一样,区别在于下划线职匹配单个字符而不是多个字符
mysql > select prod_id,prod_name from products where prod_name like '_ ton anvil';
7.2使用通配符的技巧
- 不过度使用,其他操作符能替代其作用的用其他操作符
- 除非绝对有必要,否则不要把它们用在搜索模式开始出。否则会搜索起来最慢
- 注意通配符位置,放错地方不会返回想要的数据