这些特定定义了数据在表中如何存储金沙js娱乐场官方网站,任意两行都不具有相同的主键值

可以有效的组织和管理存储在数据库中的数据,即数据库表的每一列都是不可分割的原子数据项,不加,不加,存储在表中的数据是一种类型的数据或一个清单,数据库中的每个表都有一个名字,它的主键不能赋给以后的新行),每一行都必须具有一个主键值( 主键列不允许NULL值)

一、基本概念

启动MySQL服务

$ sudo service mysql start
或者
/etc/init.d/mysql start

目录

数据库入门

数据库:
保存有组织的数据的容器(通常是一个文件或一组文件).数据库软件应该称为
DBMS(DataBase Manage System) 数据库管理系统,数据库是指通过 DBMS
创建和操纵的容器,数据库可以是保存在硬盘上的文件,但也可以不是。你不能直接访问数据库,而是使用
DBMS 来访问,他替你访问数据库。

表:
某种特定类型数据的结构化清单。存储在表中的数据是一种类型的数据或一个清单,数据库中的每个表都有一个名字,用来标识自己,此名字是唯一的,这表示数据库中没有其他表具有相同的名字。

表具有一些特性,这些特定定义了数据在表中如何存储,如存储什么样的数据,数据如何分解,个部分信息如何命名等等,描述这组信息就是所谓的模式
模式: 关于数据库和表的布局及特性的信息.

列:表中的一个字段,所有的表都是由一个或多个列组成的。
数据类型:
所容许的数据的类型,每个表都有相对应的数据类型,他限制(容许)该列中存储的数据。数据类型限制可存储在列中的数据种类,数据类型还帮助正确的排序数据,并在优化磁盘使用方面起重要的作用,因此,在创建表时必须对数据类型给予特别的关注

行:表中的一个记录,
主键:一列(或一组列),其值能够唯一区分表中的每个行。唯一标识表中每行的这个列称为主键,主键用来表示一个特定的行,没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。表中的任何列都可以作为主键,只要它满足以下条件:

  • 任何两行都不具有相同的主键值
  • 每个行都必须具有一个主键值(主键值不允许 NULL 值)。

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

1.表中的任何列都可以作为主键, 只要它满足以下条件:
任意两行都不具有相同的主键值;
每一行都必须具有一个主键值( 主键列不允许NULL值) ;
主键列中的值不允许修改或更新;
主键值不能重用( 如果某行从表中删除, 它的主键不能赋给以后的新行)
2.MySQL的要求:任意两行都不具有相同的主键值;
每个行都必须具有一个主键值(主键列不允许NULL值)。
3.tips:除MySQL强制实施的规则外,应该坚持的
几个普遍认可的最好习惯为:
 不更新主键列中的值;
 不重用主键列的值;
 不在主键列中使用可能会更改的值。(例如,如果使用一个
名字作为主键以标识某个供应商,当该供应商合并和更改其
名字时,必须更改这个主键。)

  1.数据库:

  数据库(DataBase)就是一个存储数据的仓库,为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。数据库是数据管理软件。数据存储分为三个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。

使用root用户登陆

$ mysql -u 用户名 -p

-p表示使用密码登录

      • 启动MySQL服务
      • 使用root用户登陆
      • 查看命令帮助信息
      • 查看授予用户的安全权限
      • 注释
      • 取消正在输入的命令
      • 查看当前含有哪些数据库
      • 连接数据库
      • 查看当前数据库中含有哪些表
      • 显示表属性
      • 显示服务器警告或错误信息
      • 退出数据库
      • 新建数据库
      • 新建数据表
      • 数据类型
        • CHAR和VARCHAR的区别
        • ENUM和SET的区别
      • 插入数据
      • SQL约束
        • 主键
        • 外键
        • 非空约束
        • 默认值约束
        • 唯一约束
      • MySQL通配符
      • MySQL查询语句关键字顺序
      • SELECT操作
        • 查看表中所有的内容
        • SELECT基本格式
        • 对查询结果排序
        • 去除重复值
        • 限制返回结果数
        • 内置函数和计算
        • 子查询
        • 连接查询
      • 删除数据库
      • 重命名数据表
      • 删除数据表
      • 在表中增加列
      • 删除列
      • 修改列
      • 修改数据类型
      • 修改表中某个值
      • 删除某行记录
      • 为某列建立索引
      • 显示某表的索引
      • 创建视图一种虚拟存在的表
      • 导入将文件中的数据保存进表
      • 导出将表中数据保存到文件中
      • 备份整个数据库
      • 备份整个表
      • 恢复数据库
      • 正则表达式
      • 空白元字符
      • 字符类预定义字符集
      • 匹配多个实例
      • 定位元字符
      • 拼接字段
      • 别名alias
      • MySQL算数操作符
      • SELECT测试
      • SQL函数
      • 常用的文本处理函数
      • 日期和时间处理函数
      • 数值处理函数
      • SQL聚集函数
      • 分组数据
        • WHERE 和
          HAVING
        • GROUP BY 和 ORDER
          BY
      • SELECT子句顺序
      • 子查询

基础操作

  2.数据库范式:

  数据库范式即数据库应该遵循的规则。目前关系数据库最常用的四种范式分别是:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BCN范式(BCNF)。

  第一范式:无重复的域。即数据库表的每一列都是不可分割的原子数据项,而不是集合、数组、记录等非原子数据项。

  第二范式:数据库表中的所有列都必须依赖于主键,这意味着一个表只描述一件事情。

  第三范式:表中的每一列只与主键直接相关而不是间接相关。

  BCN范式:Boyce-Codd,不允许出现有主键的一部分被主键另一部分或者其他部分决定。即一个表中只能有一个主键。

  举例(摘自其他博客)说明BCN:

  假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID,
数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:

    (仓库ID, 存储物品ID) →(管理员ID, 数量)

    (管理员ID, 存储物品ID) → (仓库ID, 数量)

  所以,(仓库ID, 存储物品ID)和(管理员ID,
存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

    (仓库ID) → (管理员ID)

    (管理员ID) → (仓库ID)

  即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。

查看命令帮助信息

mysql> HELP 命令名;

启动MySQL服务

$ sudo service mysql start

了解数据库和表(SHOW)

  1. SHOW DATABASES: 返回一个数据库列表,包含在这个列表中的可能是
    MYSQL 内部使用的数据库.
  2. SHOW TABLES: 返回当前选择的数据库内可用表的列表
  3. SHOW COLUMS FROM customers:
    要求给出一个表名,对每个字段返回一行。包含 该字段的信息。

第二章

1.MySQL选项和参数 如果仅输入mysql, 可能会出现一个错误
消息。因为可能需要安全证书,或者是因为MySQL没有运行
在本地或默认端口上。 mysql接受你可以(和可能需要)使用
的一组命令行参数。例如,为了指定用户登录名ben,应该使
用mysql -u ben。为了给出用户名、主机名、端口和口令,
应该使用mysql -u ben -p -h myserver -P 9999。
完整的命令行选项和参数列表可用mysql –help获得。
2.命令输入在mysql>之后;
 命令用;或\g结束,换句话说,仅按Enter不执行命令;
 输入help或\h获得帮助,也可以输入更多的文本获得特定命令的
帮助(如,输入help select获得使用SELECT语句的帮助);
 输入quit或exit退出命令行实用程序。

  3.数据库系统和数据库管理系统:

  数据库系统由数据库、数据库管理系统、应用开发工具构成。

  数据库管理系统(DataBase Management System,
DBMS)是用来定义、管理和维护数据的软件。它是数据库系统的重要组成部分。数据库管理系统通过SQL语言来管理数据库中的数据。

查看授予用户的安全权限

mysql> SHOW GRANTS;

使用root用户登陆

$ mysql -u 用户名 -p

-p表示使用密码登录

创建和操纵表

第三章

1.必须先使用USE打开数据库,才能读取其中的数据。
2.SHOW COLUMNS 要 求 给 出 一 个 表 名 ( 这 个 例 子 中 的 FROM
customers),它对每个字段返回一行,行中包含字段名、数据
类型、是否允许NULL、键信息、默认值以及其他信息(如字段cust_id
的auto_increment)。
什么是自动增量? 某些表列需要唯一值。例如,订单编号、
雇员ID或(如上面例子中所示的)顾客ID。在每个行添加到表
中时, MySQL可以自动地为每个行分配下一个可用编号,不
用在添加一行时手动分配唯一值(这样做必须记住最后一次使
用的值)。这个功能就是所谓的自动增量。
3.SHOW STATUS,用于显示广泛的服务器状态信息;
 SHOW CREATE DATABASE和SHOW CREATE TABLE,分别用来显示创
建特定数据库或表的MySQL语句;
 SHOW GRANTS,用来显示授予用户(所有用户或特定用户)的安
全权限;
 SHOW ERRORS和SHOW WARNINGS, 用来显示服务器错误或警告消息。

  4.SQL语言:

  SQL(Structured Query Language)语言的全称是结构化查询语言。它包括:

    - 数据库定义语言(Data Definition Language, DDL)

    - 数据操作语言(Data Manipulation Language, DML)

    - 数据控制语言(Data Control Language, DCL)

注释

-- 单行注释
/* 多行注释 */

查看命令帮助信息

mysql> HELP 命令名;

创建表

MySQL
不仅用于表数据操作,而且还可以用来执行数据库和表的所有操作,包括表本身的创建和处理。

创建表的方法:

  • 使用具有交互式创建和管理表的工具
  • 使用 MySQL 语句操纵
  1. 表创建基础(CREATE TABLE)
    • 新的表明名再关键字 CREATE TABLE 之后给出
    • 表列的名字和定义,用逗号分隔
  2. 使用 NULL 值: Null 值就是没有值或者缺值,允许 NULL
    值的列也允许再插入行时不给出该列的值,不允许 NULL
    值的列不接受该列没有值的行,换句话说,在插入或更新行时该列必须有值。NULL
    为默认值,如果不指定 NOT NULL, 则认为指定的是 NULL, NULL
    值就是没有值,他不是空串,空串是一个有效的值。
  3. 主键:
    主键的值必须唯一,即,表中的每个行必须具有唯一的主键值,如果主键使用单个列,则他的值必须唯一,如果使用多个列,则这些列的组合值必须唯一。
  4. 使用 AUTO_INCREMENT: 告诉 MySQL
    ,本列每当增加一行时自动增量,每次执行一个 INSERT 操作时, MySQL
    会对该列增量,每个表只允许一个 AUTO_INCREMENT列,而且他必须被索引

第四章 检索数据

1.要想从一个表中检索多个列,使用相同的SELECT语句。唯一的不同
是必须在SELECT关键字后给出多个列名,列名之间必须以逗号分隔。
2.mysql命令行用;
3.在选择多个列时,一定要在列名之间加上逗号,但
最后一个列名后不加。如果在最后一个列名后加了逗号,将出
现错误。
4.如果给定一个通配符( *),则返回表中所有列
5.SELECT DISTINCT vend_id告诉MySQL只返回不同(唯一)的
vend_id行,因此只返回4行.不能部分使用DISTINCT
DISTINCT关键字应用于所有列而
不仅是前置它的列。
6.此语句使用SELECT语句检索单个列。 LIMIT 5指示MySQL返回
不多于5行.LIMIT 5, 5指示MySQL返回从行5开始的5行。
7.SELECT products.prod_name FROM products;

  5.MySQL数据库版本和优势:

取消正在输入的命令

\c

查看授予用户的安全权限

mysql> SHOW GRANTS;

更改表(ALTER TABLE)

  1. 增加列: ALTER TABLE vendors ADD vend_phone CHAR(20)
  2. 删除列: ALTER TABLE vendors DROP COLUMN vend_phone

第五章,排序

1.SELECT prod_name
FROM products
ORDER BY prod_name;
2.SELECT prod_id,prod_price,prod_name FROM products
ORDER BY prod_price,prod_name DESC;
DESC表示降序,ASC是升序
3.如何区分大小写和排序顺序是数据库管理员设定规则
4.在给出ORDER BY子句时,应该保证它
位于FROM子句之后。如果使用LIMIT,它必须位于ORDER BY
之后。使用子句的次序不对将产生错误消息。

  常见数据库

  商业数据库:甲骨文的Oracle、IBM的DB2、微软的Access和SQL
Server。开源数据库:PostgreSQL、MySQL。

查看当前含有哪些数据库

mysql> SHOW DATABASES;

注释

-- 单行注释

/* 多行注释 */

删除表 (DROP TABLE)

第六章 过滤数据

1.SELECT prod_name,prod_price
FROM products
WHERE prod_price=2.50
2.在同时使用ORDER BY和WHERE子句时,应
该让ORDER BY位于WHERE之后, 否则将会产生错误
3.SELECT prod_name,prod_price
FROM products
WHERE prod_price BETWEEN 5 AND 10;
4.SELECT prod_name
FROM products
WHERE prod_price IS NULL;

  版本分类

  根据操作系统:Windows版,UNIX版,Linux版,MacOS版;根据开发情况:Alpha、Beta、Gamma与Available(GA)。

  alpha
暗示这是一个以展示新特性为目的的版本,存在比较多的不稳定因素,还会向代码中添加新新特性

  beta
以后的beta版、发布版或产品发布中,所有API、外部可视结构和SQL命令列均不再更改,不再向代码中添加影响代码稳定性的新特性。Gamma比Beta版更高级。

  GA如果没有后缀,则暗示这是一个大多数情况下可用版本或者是产品版本。.
GA releases则是稳定版。

  优势:MySQL开放源码、跨平台性、价格优势、功能强大且使用方便。

连接数据库

mysql> USE 数据库名

取消正在输入的命令

\c

重命名表 (RENAME TABLE)

第七章 数据过滤

1.AND在计算次序中优先级更高。
2.SELECT prod_name,prod_price
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;
3.MySQL 支 持 使 用 NOT 对 IN 、 BETWEEN 和
EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件
取反有很大的差别。

  Linux安装MySQL

  

查看当前数据库中含有哪些表

mysql> SHOW TABLES;

mysql> DESCRIBE 表名;

查看当前含有哪些数据库

mysql> SHOW DATABASES;

插入数据

使用 INSERT 语句将数据插入表中,
INSERT是用来插入(或添加)行到数据库表的,插入可以用集中方式使用

  1. 插入完整行,使用 INSERT
    ,要求指定表明和被插入到新行的值,最好是写上列名,这样可以保证列明是正确的。
  2. 插入多个行: INSERT
    可以插入一行到一个表中,如果想一次性插入多行的话,就需要使用多个
    INSERT 或者使用单条 INSERT 语句有多组值,每组值用一对圆括号括起来

第八章 用通配符进行过滤

1.通配符,搜索模式,在搜索子句中用通配符必须使用LIKE操作符
2.SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE ‘jet%’;
%表示任何字符出现的任意次数。
3.tips:尾空格可能会干扰通配符匹配。例如,在保存词
anvil 时 , 如 果 它 后 面 有 一 个 或 多 个 空 格 , 则 子 句 WHERE
prod_name LIKE ‘%anvil’将不会匹配它们,因为在最后的l
后有多余的字符。解决这个问题的一个简单的办法是在搜索模
式最后附加一个%。
虽然似乎%通配符可以匹配任何东西,但有一个例
外,即NULL。即使是WHERE prod_name LIKE ‘%’也不能匹配
用值NULL作为产品名的行
4.与%能匹配0个字符不一样, _总是匹配一个字符,不能多也不能少。
5.tips:不要过度使用通配符。如果其他操作符能达到相同的目的,应该
使用其他操作符。
 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用
在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起
来是最慢的。
 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数

二、MySQL数据类型(摘自菜鸟教程:

  MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

显示表属性

mysql> SHOW COLUMNS FROM 表名;

该命令将会输出指定表的每个字段的字段名、数据类型、非空约束、是否是主键和默认值等信息。

连接数据库

mysql> USE 数据库名

更新和删除数据

第九章 用正则表达式进行搜索

1.SELECT prod_name
FROM products
WHERE prod_name REGEXP’1000′
ORDER BY prod_name;
2.LIKE是匹配整个列,REGEXP匹配列值,为在搜索子句中使用通配符,必须使用LIKE操作符。
LIKE指示MySQL,
后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
3.MySQL正则表达式匹配后不区分大小写。区分大小写可以用BINARY关键字,如WHERE
prod_name REGEXP BINARY ‘JetPack.000’
4.匹配特定的字符用[].
5.否定字符集合用^.
6.正则表达式匹配列值,只要列值中含有就可以,LIKE则是匹配整个列形式。
7..是匹配任意字符,匹配特殊字符用\为前导。、|[].
8.\f换页,\n换行,\r回车,\t制表,\v纵向制表。
9.找出你自己经常使用的数字,所有字母字符或所有数字字母字符的匹配。预定义的字符类。
[:alnum:]任意字母和数字
[:alpha:]任意字符
[:blank:]空格和制表[\t]
[:cntrl:]ASCII控制字符 0到31和127
[:digit:]任意数字
[:graph:]与[:print:]相同,但不包括空格
[:lower:]任意小写
[:print:]任意可打印字符
[:punct:]既不是alnum也不是cntrl的字符
[:space:]包括空格在内的空白字符,同[\f\n\r\t\v]
[:upper:]
[:xdigit:]任意十六进制数字
10.匹配多个实例
*0个或多个匹配
+1个或多个
?0个或1个
{n}指定数目的匹配
{n,}不少于指定数目的匹配
{n,m}匹配数目的范围
11.^文本的开始 $文本的结尾 [[:<:]]词的开始
[[:>:]]词的结尾
SELECT ‘hello’ REGEXP ‘[0-9]’返回0

  1.整数类型的存储和范围

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度
浮点数值
DOUBLE 8 字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度
浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

显示服务器警告或错误信息

mysql> SHOW ERRORS;

mysql> SHOW WARNINGS;

查看当前数据库中含有哪些表

mysql> SHOW TABLES;

mysql> DESCRIBE 表名;

更新数据

为了更新(修改)表中的数据,可使用 UPDATE 语句,可采用两种方式使用
UPDATE:
使用 UPDATE 的时候一定要注意,不要省略 WHERE 子句,使用 UPDATE
语句总是以要更新的表的名字开始.要以 WHERE 子句(用来告诉 MySQL
更新哪一行)结束。在更新多个列时,只需要使用单个 SET 命令,每个
列=值对之间用逗号分隔(最后一列之后不用逗号);

  • 更新表中特定行
  • 更新表中所有行

第十章 创建计算字段

1.存储在表中的数据都不是应用程序所需要的。
我们需要直接从数据库中检索出转换、计算或格式化过的数据;而不是
检索出数据,然后再在客户机应用程序或报告程序中重新格式化。
这就是计算字段发挥作用的所在了。与前面各章介绍过的列不同,
计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句
内创建的。数据库知道SELECT语句中哪些列是实际的
表列,哪些列是计算字段。从客户机(如应用程序)的角度来看,计算
字段的数据是以与其他列的数据相同的方式返回的。

2.tips:多数DBMS使用+或||来实现拼接,
MySQL则使用Concat()函数来实现。当把SQL语句转换成
MySQL语句时一定要把这个区别铭记在心
3.SELECT Concat(vend_name,'(‘,vend_country,’)’)
FROM vendors
ORDER BY vend_name;
4.SELECT Concat(RTrim(vend_name),'(‘,RTrim(vend_country),’)’)
FROM vendors
ORDER BY vend_name;
Rtrim去掉右边所有空格,Ltrim去掉左边所有空格
5.使用别名
SELECT Concat(RTrim(vend_name),'(‘,RTrim(vend_country),’)’)AS
vent_title
FROM vendors
ORDER BY vend_name;
6.计算字段
SELECT prod_id,
quatity,
item_price,
quatity*item_price AS expanded_price
FROM orderotems
WHERE order_num=2005;

  2.日期和时间类型

类型 大小 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/’838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4

1970-01-01 00:00:00/2038

结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYYMMDD HHMMSS 混合日期和时间值,时间戳

退出数据库

mysql> EXIT/QUIT;

显示表属性

mysql> SHOW COLUMNS FROM 表名;

该命令将会输出指定表的每个字段的字段名、数据类型、非空约束、是否是主键和默认值等信息。

删除数据

为了从一个表中删除(去掉)数据,使用 DELETE 语句,可依两种方式使用
DELETE

  • 从表中删除特定的行 DELETE FROM products WHERE cust_id = 1006

第十一章 用数据处理函数

1.常用文本处理函数
Left()返回左边字符,Length(),Locate()找出串的一个子串,Lower(),LTrim(),Right(),Rtrim(),Soundex()返回串的soundex值,SubString()返回子串的字符,Upper()
2.SELECT cust_name,cust_contact
FROM customers
WHERE Soundex(cust_contact)=Soundex(‘Y Lie’);
3.日期和时间处理函数
AddDate()天,周,AddTime()时,分,CurDate(),CurTime(),Date()日期时间的日期部分,DateDiff()日期之差,Date_Add()高度灵活的日期运算函数,Date_Format()返回格式化日期或者时间串,Day(),DayOfWeek(),Hour(),Minute(),Month(),Now(),Second(),Time(),Year()。
4.数值处理函数
abs(),cos(),exp(),mod(),pi(),rand()随机数,sin(),sqrt(),tan()
第十二章 汇总数据
1.聚集函数 运行在行组上,计算和返回单个值的函数。
2.AVG()平均值COUNT()行数 MAX()MIN()SUM()
3.SELECT AVG(prod_price)AS avg_price
FROM products;
4.确定特定列的平均值
AVG()忽略NULL的行
SELECT AVG(prod_price) AS avg_price
FROM products
WHERE vend_id =1003;
5.COUNT()
COUNT()包含null,COUNT(column)忽略null
SELECT COUNT(
) AS num_cust
FROM customers;
6.MAX()在用于文本数据时,如果数
据按相应的列排序,则MAX()返回最后一行。???
7.SELECT SUM(item_pricequantity)AS total_price
FROM orderitems
WHERE order_num=2005;
8.distinct只考虑不同的
SELECT AVG(DISTICT prod_price)AS avg_price
FROM products
WHERE vend_id =1003;
9tips:
如果指定列名,则DISTINCT只能用于COUNT()。DISTINCT
不能用于COUNT(
),因此不允许使用COUNT( DISTINCT),
否则会产生错误。类似地, DISTINCT必须使用列名,不能用
于计算或表达式。

  3.字符串类型

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYTEXT 0-255字节 短文本字符串
TEXT 0-65 535字节 长文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据
TINYBLOB  0-255字节  不超过 255 个字符的二进制字符串
BLOB 0-65 535字节 二进制形式的长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据

新建数据库

mysql> CREATE DATABASE 数据库名;

通常SQL语句不区分大小写,但建议将关键字大写,变量和数据小写。

显示服务器警告或错误信息

mysql> SHOW ERRORS;

mysql> SHOW WARNINGS;

更新和删除的指导原则

如果执行 UPDATE 而不带 WHERE
子句,则表中每行都将应用新值更新,类似的,如果执行 DELETE 语句而不带
WHERE 子句,表的所有数据都将被删除。

  • 除非缺失打算更新和删除每一行,否则绝对不要使用不带 WHERE子句的
    UPDATEDELETE语句
  • 保证每个表都有主键,尽可能像 WHERE子句那样使用它
  • 在对 UPDATE 或 DELETE 语句使用 WHERE 子句前,最好先用 SELECT
    进行测试,保证它过滤的是正确的记录,以防止编写的 WHERE 子句不正确
  • 使用强制实施引用完整性的数据库,这样 MySQL
    将不允许删除具有与其他表相关联的数据的行。

第十三章 分组数据

1.SELECT vend_id, COUNT() AS num_prods
FROM products
GROUP BY vend_id;
GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,
为数据分组提供更细致的控制。
 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上
进行汇总。换句话说,在建立分组时,指定的所有列都一起计算
(所以不能从个别的列取回数据)。
 GROUP BY子句中列出的每个列都必须是检索列或有效的表达式
(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在
GROUP BY子句中指定相同的表达式。不能使用别名。
 除聚集计算语句外, SELECT语句中的每个列都必须在GROUP BY子
句中给出。
 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列
中有多行NULL值,它们将分为一组。
 GROUP BY子句必须出现在WHERE子句之后, ORDER BY子句之前。
使用有 WITH ROLLUP 子句的 GROUP BY 语句时,不能再使用
ORDER语句对结果集进行排序,如果对返回的结果顺序不满意,需要应用程序获得结果后在程序中进行排序
2.WHERE 过滤行,HAVING过滤分组
SELECT cust_id,COUNT(
)AS orders
FROM orders
GROUP BY cust_id
HAVING count()>=2;
这里有另一种理解方法,WHERE在数据
分组前进行过滤, HAVING在数据分组后进行过滤。这是一个重
要的区别, WHERE排除的行不包括在分组中。这可能会改变计
算值,从而影响HAVING子句中基于这些值过滤掉的分组。
3.SELECT vend_id,COUNT(
)AS num_prods
FROM products
WHERE prod_price>=10
GROUP BY vend_id
HAVING COUNT()>=2;
4.如果用了having 就要用group by。
SELECT order_num,SUM(quatity
item_price)AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quatity*item_price)>=50
ORDER BY ordertotal;
5.SELECT 是
WHERE 否
GROUP BY 按组计算聚集使用
HAVING 否 ORDER BY
LIMIT 否

三、MySQL表操作

新建数据表

mysql> CREATE TABLE 数据表名
    -> (
    -> 列名1 数据类型(数据长度) PRIMARY KEY,        --主键
    -> 列名2 数据类型(数据长度) NOT NULL,        --非空约束
    -> 列名3 数据类型(数据长度) DEFAULT '默认值',        --默认值约束
    -> UNIQUE(列名a),        --唯一约束
    -> CONSTRAINT 主键名 PRIMARY KEY (列名a,列名b,...),        --复合主键
    -> CONSTRAINT 外键名 FOREIGN KEY (列名) REFERENCES 表名(主键名)        --外键
    -> );

注意最后一个列名后面不加逗号”,”。

退出数据库

mysql> EXIT/QUIT;

检索数据(SELECT)

从一个或多个表中检索信息,为了使用 SELECT
检索数据,必须至少给出两条数据 — 项选择什么,以及从什么地方选择。

  1. 检索单个列: SELECT prod_name FROM products

  2. 检索多个列: SELECT prod_id,prof_name FROM product

  3. 检索所有列: SELECT * FROM product

  4. 检索不同的行: SELECT DISTINCT vend_id FROM products, DISTINCT
    关键字必须直接方法在列名的前面

  5. 限制结果: LIMIT :

    • SELECT prod_name FROM products LIMIT 5
    • SELECT prod_name FROM products LIMIT 5,5
  6. 使用完全限定的表名:
    SELECT products.prod_name FROM crashcourse.products;

第14章 使用子查询

1.SQL
SELECT cust_id
FROM orders
WHERE order_num IN(SELECT order_num
FROM orderitems
WHERE prod_id=’TNT2′);
2.SELECT cust_name,cust_contact
FROM customers
WHERE cust_id IN(SELECT cust_id
FROM orders
WHERE order_num IN(SELECT order_num
FROM orderitems
WHERE prod_id=’TNT2′));
3.列必须匹配:
在WHERE子句中使用子查询(如这里所示),应
该保证SELECT语句具有与WHERE子句中相同数目的列。通常,
子查询将返回单个列并且与单个列匹配,但如果需要也可以
使用多个列。
4.SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM orders
WHERE order.cust_id=customers.cust_id)AS orders
FROM customers
ORDER BY cust_name;

  1.插入数据 INSERT INTO

-- 插入一条新的数据
/* INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email) VALUES('10006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL); */
-- 按表列字段的顺序插入数据时,列字段可省略
INSERT INTO customers VALUES('10006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL);
-- 将一张表插入到原来的表
/* INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)  SELECT cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email FROM cust_new WHERE cust_id NOT IN (SELECT cust_id FROM customers); */
-- 复制表
CREATE TABLE custcopy AS SELECT * FROM customers;

  注意:

  - 任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY。

  - 可以联结多个表执行插入数据操作。

  - 不管从多少个表中检索数据,数据都只能插入到单个表中。

数据类型

数据类型 大小(字节) 用途 格式
INT 4 整数
FLOAT 4 单精度浮点数
DOUBLE 4 双精度浮点数
ENUM 单选 ENUM(‘a’,’b’,’c’)
SET 多选 SET(‘1’,’2’,’3’)
DATE 3 日期 YYYY-MM-DD
TIME 3 时间点或持续时间 HH:MM:SS
YEAR 1 年份值 YYYY
CHAR 0~255 定长字符串
VARCHAR 0~255 变长字符串
TEXT 0~65535 长文本数据

新建数据库

mysql> CREATE DATABASE 数据库名;

通常SQL语句不区分大小写,但建议将关键字大写,变量和数据小写。

排序检索数据

将会讲授如何使用 SELECT 语句的 ORDER_BY
子句,根据需要排序检索出的数据.

子句(clause): SQL 语句由子句构成,有些子句是必需的,而有的是可选的,一个子句通常由一个关键字和所提供的数据组组成,子句的例子有 SELECT 语句的 FROM 子句。
  1. 单列排序: SELECT prod_name FROM products ORDER BY prod_id
  2. 多列排序:
    SELECT prod_name FROM products ORDER BY prod_price,prod_name,
    排序完全按照所规定的顺序进行,也就是说仅在多行具有相同的 price
    的时候才会根据 name 进行排序
  3. 指定排序方向: 数据排序不限于升序顺序(A-Z),还可以使用 ORDER BY
    子句以降序(Z-A)顺序排序,为了进行降序排序,必须指定 DESC 关键字.
    SELECT prod_id, prod_price,prod_name FROM products ORDER BY prod_price DESC.
    DESC
    关键字只能应用到直接位于其前面的列名。如果想要对多个列上进行降序排列,必须对每个列指定DESC关键字。

第十五章 联结表

1.外键为某个表中的一列,它包含另一个表
的主键值,定义了两个表之间的关系。
2.在一条SELECT语句中联结几个表时,相应的关系是
在运行中构造的。在数据库表的定义中不存在能指示MySQL如何对表进
行联结的东西。你必须自己做这件事情。在联结两个表时,你实际上做
的是将第一个表中的每一行与第二个表中的每一行配对。 WHERE子句作为
过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行。
3.由没有联结条件的表关系返回
的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘
以第二个表中的行数。
4.SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id=products.vend_id;
5.ANSI SQL规范首选INNER JOIN语法。此外,
尽管使用WHERE子句定义联结的确比较简单,但是使用明确的
联结语法能够确保不会忘记联结条件,有时候这样做也能影响
性能
SELECT cust_name,cust_contact
FROM customers
WHERE cust_id IN(SELECT cust_id
FROM orders
WHERE order_num IN(SELECT order_num
FROM orderitems
WHERE prod_id=’TNT2′));
SELECT cust_name,cust_contact
FROM customers,orders,orderitems
WHERE customers.cust_id=orders.cust_id
AND orderitems.order_num=order.order_num
ADN prod_id=’TNT2′;
第十六章 创建高级联结


1.SELECT p1.prod_id,p1.prod_name
FROM products AS p1,products AS p2
WHERE p1.vend_id=p2.vend_id
AND p2.prod_id=’DTNTR’;
自联结通常作为外部语句用来替代
从相同表中检索数据时使用的子查询语句。虽然最终的结果是
相同的,但有时候处理联结远比处理子查询快得多。应该试一
下两种方法,以确定哪一种的性能更好。
2.自然联结
SELECT c.*o.order_num,o.order_date,
oi.prood_id,oi.quatity,OI.item_price
FROM customers AS c,orders AS o,orderitems AS oi
WHERE c.cust_id=o.cust_id
AND oi.order_num=o.order_num
AND prod_id=’FB’;
通配符只对第一个表使用。所有其他列明确列
出,所以没有重复的列被检索出来。
3.SELECT customer.cust_id,orders.order_num
FROM customers INNER JOIN orders
ON customers.cust_id=orders.cust_id;
4.SELECT customer.cust_id,orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id=orders.cust_id;
这条SELECT语句使用了关
键字OUTER JOIN来指定联结的类型(而不是在WHERE子句中指
定)。但是,与内部联结关联两个表中的行不同的是,外部联结还包括没
有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字
指定包括其所有行的表( RIGHT指出的是OUTER JOIN右边的表,而LEFT
指出的是OUTER JOIN左边的表)。上面的例子使用LEFT OUTER JOIN从FROM
子句的左边表( customers表)中选择所有行。???
5.SELECT customers.cust_name,
customers.cust_id,
COUNT(orders.order_num)AS num_ord
FROM customers INNER JOIN orders
ON customers.cust_id=orders.cust_id
GROUP BY custmers.cust_id;
6.SELECT customers.cust_name,
customers.cust_id,
COUNT(orders.order_num)AS num_ord
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id=orders.cust_id
GROUP BY customers.cust_id: