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使用通配符的技巧

  • 不过度使用,其他操作符能替代其作用的用其他操作符
  • 除非绝对有必要,否则不要把它们用在搜索模式开始出。否则会搜索起来最慢
  • 注意通配符位置,放错地方不会返回想要的数据