mysql基础小结(来源:MySQL必知必会)

前引:本篇知识小结是本人总结《MySQL必知必会》一书的笔记,如有内容不符的内容,烦请联系。内容较少的章节合并到了相邻章节。扩充内容补充到了相似章节。

第一章 了解SQL:概念篇

数据库:是一个以某种有组织的方式存储的数据的集合。(通常理解为保存有组织的数据的容器)

数据库软件应该称为DBMS(数据库管理系统),数据库是通过DBMS创建和操作的容器。

表:是一种结构化的文件,可以用来存储某种特定类型的数据。

SQL指结构化查询语言,是一种专门用来与数据库通信的语言。

SQL使我们有能力访问数据库

SQL是一种ANSI的标准计算机语言

RDBMS:指的是关系型数据库管理系统,是SQL的基础,同样是所有现代数据库的基础,比如:SQL server,DB2,Oracle,MySQL等

RDBMS中的数据存储在被称为表的数据库对象中,表是相关数据项的集合,它由列和行组成。

现代的SQL服务器构建在rdbms之上

DBMS数据库管理系统:是一种可以访问数据库中数据的计算机程序,使我们有能力在数据库中提取,修改或者存储信息,不同的dbms提供不同的函数供查询,提交以及修改数据。

关系型数据库管理系统也是一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的。

可以把SQL分为两个部分:数据操作语言DML  和数据定义语言DDL

DML:select  update  delete insert into

DDL:create alter database/table  drop table  create index drop index

第二章 什么是MySQL:

数据的所有存储,检索,管理和处理实际上是由数据库软件DBMS完成的。

DBMS可分为两类:一类是基于共享文件系统的DBMS,另一类为基于客户机-服务器的DBMS。(MySQL,Oracle,SQLserver等),这里客户机可以理解为:安装有sql yog的计算机(本人选的是这个),服务器是指在电脑上安装的有MySQL管理系统的计算机(自己测试通常是在一台电脑上)。

命令行登录:mysql -hlocalhost  -u root -p  之后键入密码。(注意已经配置过环境变量了,否则需要找到安装路径bin目录下执行该命令)

第三章 使用MySQL

use 数据库名

show databases;

show tables;

show columns from 表名;等同于:describe customers

show create customers

 show create database newdb 显示创建语句。show create table 表名;

第四章 检索数据

select *

from products;一般来说除非确实需要每个列,否则最好别使用通配符 *

select distnct id

from table;

distinct 关键字应用于所有列而不是他的前置列,Distinct 后面可以跟多个字段滤重,跟单个一样也是保证唯一性。

limit 检索的时候是从第0行开始的,不是第一行。

count(),count*和1的区别:没有区别,count(列名)和count1有些区别,有主键,count(主键)快,没有主键count1快。Count(列名)会去除空值,要注意

第五章 排序检索数据--order by

通常排序的列是显示所选择的列,但是并不一定是这样,用非检索的列排序数据也是合法的。

默认是升序排列  ASC  ,降序 DESC 需要指定。升序降序结合使用的时候是不一样的,要注意。

第六章 过滤数据--where

=  <> != < <= > >= between  常用操作符,MySQL的between是包含两端的,有的不包括,请注意。

空值  is not  null   is  null

And :第一个和第二个条件都成立

Or:第一个和第二个只要成立一个条件即可成立

and 用来指示检索所有给定的条件。

or 任意条件满足即可成立。注意:and的优先级要比or高,当组合使用的时候记得加上括号。

where (id=12 or id=13)and salary=20

in 在某个范围之内,与or差不多,

两者的差别:

当使用多个候选清单的时候 in  更直观,

in的操作符更少,计算次序更容易管理

in最大的优点是可以包含子查询

第八章 通配符过滤数据--  like  _

like 匹配多个,_ 下划线匹配一个,最好不要把like放在开头位置

第九章 正则表达式

正则表达式的作用是匹配文本,将一个正则表达式与一个文本串进行比较。

where  name regexp '100'

where name regexp '.100'  .表示匹配任意一个字符。

请注意:like  '100'   和 regexp '100'

like 表示匹配整个列,如果被匹配的文本在列值中出现则like不会返回它。

后者会在列值中进行匹配。

默认不区分大小写  如果要区分  where name  regexp binary '100'

or 匹配:| regexp '100|200'

[]匹配:regexp '[123] ton'  123任意一个都可以。等同于[1|2|3],[^123]匹配除了123之外的字符

where name  regexp '[1-5] ton' 范围性匹配。

注意当匹配特殊字符的时候需\\ 为前导。where ’\\.‘

转义字符多数使用 单个\ ,MySQL本身使用两个\\ 

第十章 计算字段--

concat(name,'hh',salary)

trim rtrim ltrim  去掉左右两边的空格。

第十一章 使用数据处理函数--

length()  返回长度

lower() 小写

upper()大写

sunstring()截取

mysql基础小结(来源:MySQL必知必会)_第1张图片mysql基础小结(来源:MySQL必知必会)_第2张图片​编辑

 切记日期要为  yyyy-MM-dd  格式的

第十二章 汇总数据聚合函数

AVG()

count():count(*)对表中的数据计数,不管是不是包含空值,count(列名)计数会忽略空值。

max()

min()

sum():会忽略列值为 null 的行。

group by having   where  和 having  的 区别:where 在数据分组前过滤,having 在数据分组后过滤。

order by 

第十五章 表连接--

笛卡尔积:表连接没有关联条件时候会产生。

常用  inner join    left  join    right join

组合查询:union 使用场景

在单个查询中从不同的表中返回类似结构的组合查询

对单个表执行多个查询,按单个查询返回数据。

union  会自动去除重复行 ,union all  不会

第十八章 全文本搜索-

innodb不支持全文本搜索,myisam支持。

数据插入:

insert  into  table

values('11','aa','2000'),('12','ab','3000')

insert  into  table (id,name,salary)

values('11','aa','2000'),('12','ab','3000')

插入的时候如果带有列名 可不按顺序也不影响,表结构改变也不影响。最好不要使用不带列名的插入。

insert into newtable (cust_id,cust_name,cust_aa)

select cust_id,cust_name,cust_aa from table;

列名不一定要一样,因为插入只是负责把新数据插入到指定的列,跟别的没有关系。

更新数据:update

update table

set id=99

where name='aa'

更新多个列:

update table

set id=99,

salary='50'

where name='aa';

ignore  关键字,当要更新多行的时候,如果其中的一行或者多行出现一个错误,则整个更新被取消,包括之前更新过的值。  发生错误也要更新可使用  update ignore table  。

如果想删除整列数据 可以把该列置为空  null

删除一行   :delete from  table where id='20'  delete删除表中数据而不删除表本身。

如果要删除所有行    可使用  truncate table  ,他的速度更快。(它实际上是删除原来的表并重新创建一个新表,而不是逐行删除表中数据。)

Delete from table where 列名称=值

DELETE FROM  orders  WHERE company='nw'

删除所有行:delete from table  保留表结构

Truncate table 表名

Drop  table 表名

区别

truncate 是整体删除(速度快),delete是逐条删除(数度慢)

truncate 删除不记录MySQL日志,不可恢复数据,delete记录服务器日志,这也是truncate比delete效率高的原因。

Truncate不激活trigger触发器,但是会重置identity(标识列,自增字段)相当于自增列会被置为初始值,

Delete identity 还是会累加。

第二十一章 创建和操纵表-

create table if not exists customers

create table customers

(

cust_id int not null auto_increment,

cust_name char(50) not null,

cust_address char(50) null,

primary key (cust_id)

)ENGINE=InnoDB;

不要把null与空串混淆,null是没有值,他不是空串,,如果指定‘ ’,(两个单引号,其间没有字符),这在not null中是允许的,,空串是一个有效的值,他不是无值。

创建由多个列组成的主键:create  table  表名

order_num  int  not null,

item_price decimal(8,2) not null,

primary key(order_num,order_item)

)ENGINE=InnoDB;

AUTO_INCREMENT:代表自动增量,每插入一行会自动增加。

每个表只允许一个AUTO_INCREMENT,而且它必须被索引,

如果在插入值的时候指定这个值,那么后续的增量将从这个值开始。后面你可能不知道最后这个值是谁,可用 select last_insert_id()  查询最后一个  AUTO_INCREMENT值。

指定默认值:prod_id int not null default 1

mysql有多种引擎,这些引擎都隐藏在MySQL服务器内,不同的存储引擎具有各自不同的功能和特性,为不同的任务选择正确的引擎能获得良好的功能和灵活性。

innodb  是一个可靠的事物处理引擎,它不支持全文本搜索。

memory在功能上等同于myisam,但是由于数据是存储在内存而不是磁盘中,速度很快(特别适合临时表);

mysiam是一个性能及高的引擎,它支持全文本搜索,但不支持事物处理。

所支持的引擎的完整列表以及不同请参阅:http://dev.mysql.com/doc/refman/5.0/en/storage_engines.html

引擎类型可以混用,但是有一个大缺陷,外键不能跨引擎,即使用一个引擎的表不能引用具有使用不同引擎的表的外键。

更新表:

alter table 表名 add 列名 char(20);

alter table 表名 drop column 列名;

添加外键:

alter table 表名

add constraint 外键名

foreign key (order_num) references orders (order_num);

重命名表:rename table customer to newtables

多个表重新命名:中间用逗号隔开即可。

第二十二章 使用视图-

视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。

视图重用sql语句。

简化复杂的SQL操作。

使用表的部分数据而不是整个表。

保护数据,可以给用户授予表的特定部分的访问权限,而不是整个表的访问权限。

更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。视图本身不包含数据。

视图的规则和限制:

与表名一样,视图必须唯一命名。

创建的视图数目没有限制

视图可以嵌套

视图不能索引,也不能有关联的触发器或默认值。

查询时视图可以和表一起使用。

create view

show  create view viewname

更新视图:先删除 drop view viewname,再创建,或者 直接用 create or replace view

视图可以更新基本的表,但是基本上不建议这样使用。

第二十三章 使用存储引擎-

存储过程:简单来说就是为以后的使用而保存的一条或者多条MySQL语句的集合。

使用的理由:

通过把处理封装在容易使用的单元中,简化了复杂的操作。

由于不要求反复建立一系列处理步骤,保证了数据的完整性。

简化对变动的管理,如果表名,列名或者业务逻辑有变化,只需要更改存储过程的代码,使用他们的人员甚至不需要知道这些变化。

提高性能,存储过程要比使用单独的SQL语句要快。

但是存储过程的编写要比基本的sql语句复杂。

执行存储过程:

call 存储过程名(@pricelow,

                          @pricehigh,

                         @priceaverage);

存储过程可以显示结果也可以不显示。

create procedure 存储过程名()

begin

select avg(prod_price) as 别名

from table;

end;

可以变更分隔符:delimiter //

create procedure 存储过程名()

begin

select avg(prod_price) as 别名

from table;

end//

delimiter ;

使用存储过程:call 存储过程名();

实际上存储过程是一种函数。

删除:drop procedure 存储过程名  不加括号

如果在删除的过程中不存在会报错,可用 drop procedure if exists

变量:内存中一个特定的位置,用来临时存储数据。

create procedure 名(

out p1 declmal(8,2),

out p2 decimal(8,2)

)

begin

select min(prod-price)

into p1

from products;

select max(prod-price)

into p2

from products;

end;

执行:call 名(@pricelow,

                         @pricehigh);

所有MySQL变量都必须以@开始。

select @pricelow;

--

create procedure 名(

in onumber int,

out ototal decimal(8,2)

)

begin

select sum(iten*quantity)

from tabel

where order_num=onumber

into ototal;

end;

调用:call ordertotal(2005,@total);

select @total

显示存储过程名:show create procedure 名;

show procedure status  ;显示所有的存储过程列表。

可加过滤条件:show procedure status like '名'

游标:有时,需要在检索出来的行中前进或者后退一行或者多行,这就是使用游标的原因。游标是一个存储在MySQL服务器上的数据库查询,他不是一条select语句,而是被该语句检索出来的结果集。MySQL游标只能用于存储过程和函数。

创建游标:create procedure 名()

begin

declare 游标名 cursor

for

select order_num from orders;

end;存储过程完成后游标就消失了,因为他局限于存储过程。

打开:open 游标名

close 游标名;

触发器:是MySQL响应一下任意语句而执行的一条MySQL语句。delete insert update,其他不支持。

创建触发器:唯一的触发器名

触发器关联的表

触发器应该响应的活动(delete,insert,update)

触发器核实执行(处理之前或者之后)

create trigger 触发器名 after insert on 表名

for each row select 'aaaaa'

只有表才支持触发器,视图临时表不支持。

触发器按每个事件每次定义,每个表每个事件每次只允许一个触发器,每个表最多支持6个,之前和之后。单一触发器不能和多个事件或者多个表关联。

drop trigger 触发器名。触发器不能更新或覆盖,为了修改一个触发器,必须先删除然后再创建。

第二十六章 管理事物处理

事务处理:并非所有的引擎都支持事物处理,它用来维护数据库的完整性,它保证成批的sql操作要么完全执行,要么完全不执行。

事务:指一组SQL语句。

回退:指撤销指定SQL语句的过程

提交:指将未存储的SQL语句结果写入数据库表

保留点:指事务处理中设置的临时占位符,你可以对它发布回退。(与回退整个事务处理不同)。

管理事务处理的关键在于将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退。

start transaction

rollback;

commit;

事务处理块中,提交不会隐含的进行,未进行明确的提交,使用commit语句。

start transaction;

delete from 表 where order_num=20010;

delete from 表2 where order_num=20010;

commit;

隐含事务关闭 当commit  或者 rollback语句执行后,事务会自动关闭。

使用保留点:复杂的事务会使用,复杂的事务处理可能需要部分提交或回退。

创建占位符:savepoint deletel;

每个保留点都取标识它的唯一名字,以便在回退时,MySQL知道回退到何处,

rollback  to delete1;

保留点越多越好,更加的灵活。保留点在事务处理完成后自动释放,也可以用 release savepoint 明确的释放保留点。

修改是否自动提交:set autocommit=0;  他是针对每个连接的而不是服务器。

第二十七章 全球化和本地化

字符集:为字母和符号的集合。

编码:为某个字符集成员的内部表示。

校对:为规定字符如何比较的指令。

使用何种字符集和校对的决定在服务器,数据库和表级进行。

show character set ; 查看所有可用的字符集。和默认的校对。

show collation;显示所有的校对,以及他们适用的字符集。

create table  table

(

lie int,

lie varchar(20)

)default character set hebrew

collate hebrew_general_ci;

第二十八章 安全管理-

USE mysql;
SELECT USER FROM USER;
CREATE USER ben IDENTIFIED BY 'root'
RENAME USER ben TO benben;

set password for ben=password('new')

set password  =password('new') 不指定用户名时更新当前用户的口令。
DROP USER benben;
SHOW GRANTS FOR ben;
GRANT SELECT ON newdb.* TO ben;
SHOW GRANTS FOR ben;
REVOKE SELECT ON newdb.* TO ben;

新建连接  :IP  可以用本机local host  或者通过ipconfig 查看即可。

grant  和 revoke可在几个层次上控制访问权限:

整个服务器,使用grant all  和 revoke all;

整个数据库:使用 on databases.*

特定的表:on  database.table

特定的列

特定的存储过程

grant select ,insert on 库名.*  to 用户名;

第二十九章 数据库维护-

首先刷新未写入数据 flush tables

ANALYZE TABLE orders  检查表键是否正常
CHECK TABLE orders,orderitems;--检查

mysql  -u root  -p

show global variables like "%datadir%";  查看安装目录

链接补充:MySQL :: MySQL Documentation

以下内容是一些基础的补充:仅供参考

可以把SQL分为两个部分:数据操作语言DML  和数据定义语言DDL

DML:select  update  delete insert into

DDL:create alter database/table  drop table  create index drop index

Distinct 后面可以跟多个字段滤重,跟单个一样也是保证唯一性。

第三十章 约束-

约束:用于限制表的数据的类型,在创建表的时候添加,或者建表之后添加。

Not null,nuique,primary key,foreign key,check,default

Not null约束:不能为空值

Create table ss

(

Id int ,

Nam varchar(255)  not null

)

Unique约束:唯一标识数据库表中的每条记录

Unique和主键约束均为列或列集合提供了唯一性的保证,主键拥有自动定义的unique约束。每个表可以有多个unique约束,但是每个表只能有一个主键约束。

Create table sd

(

Id int not null,

Lastname varchar(20)

Unique (int)

)

如果需要命名unique约束,以及定义多个unique约束:有重复值的时候无法给该字段添加唯一约束

Create table zs1

(

Id int,

Af varchar(23) not null,

Adddd varchar(25)

Constraint 约束名 unique (id,af)

)

表创建完成的时候添加约束:(多个)

Alter table zs1 add unique(id)

Alter table zs1 add constraint 约束名 unique (id,af)

撤销约束:

Alter table zs1 drop index 约束名

Alter table zs1 drop constraint 约束名

单个约束撤销的时候直接加上约束的字段即可。

Primary key 约束:标识唯一记录,不包含空值,和unique的区别是  主键不能为空值,nuique可以。

Create table zs1  mysql

(

Id int,

Nnn varchar(25)

Primary key (id)

)

Create table zs1

(

Id int,

Nn varchar(25) primary key

)

主键包含多个字段:

Create table zs1

(

Id int,

Nn varchar(25)

Ab int

Constraint 约束名 primary key (id,nn)

)

建表之后创建:

Alter table zs1 add primary key (id)

Alter table zs1 add constraint 约束名 primary key (d,nn)

如果在建表之后添加主键,必须把主键列声明为不包含null(在表首次创建的时候)

撤销主键约束:

Alter table zs1 drop primary key  --mysql

Alter table zs1 drop constraint 约束名 –oracle

Foreign key:一个表中的字段是主键,在另一个表中是外键,外键约束用于预防破坏表之间连接的动作。也能防止非法数据插入外键列,因为它必须指向那个表中的值之一。

Create  table zs2   --mysql

(

Id int ,

Orid int,

Idp int,

Primary key (id),

Foreign key (idp) referenecs zs1(id)

)

Create table zs3 – oracle

(

Id int primary key,

Idd int ,

Ida int froeign key references zs1(id)

)

外键包含多个:

Create table zs4

(

Id int ,

Idd int ,

Qq int,

Primary key (id),

Constraint 约束名 foreign key (idd)

References zzs1(id)

)

Alter table zs1 add froeign key(id) references zs2(idp)

Alter table zs1 add constraint 约束名 foreign key (id) references zs2(idp)

撤销外键:

Alter table zs1 drop foreign key 约束名

Alter table zs1 drop constraint 约束名

Check约束:用于限制列中的值的范围,如果对单个列定义check约束,那么该列只允许特定的值,对一个表定义check约束,那么此约束会在特定的列中对值进行限制。

Create table zs1 --mysql

(

Id int,

Na varchar(25),

Check (id>0)

)

Create table zs1 --oracle

(

Id int check (id>0),

Na varchar(25),

)

多个check约束:

Create  table zs1

(

Id int,

Nn int,

City int,

Constraint 约束名 check (id>0 and city=’assa’)

)

撤销约束:

Alter table zs1 drop constraint 约束名

Alter table zs1 drop check 约束名

Default约束:

Create table zs1

(

Id int,

Nn int,

Nam varchar(25) default ‘asasa’

)

Alter table zs1 --mysql

Alter city set default ‘aaa’

Alter table zs1 --oracle

Alter column city set default ‘saaa’

撤销default约束:

Alter table zs1 -- mysql

Alter city drop default

Alter table zs1 --oracle

Alter column city drop default

第三十一章 索引

index---索引是对数据库表中一列或者多列的值进行排序的结构。缩短查询的时间。 主键,唯一,联合索引。

创建索引,在不读取整个表的情况下,索引使数据库应用程序可以更快的查找数据。

索引会加速查询,但是更新数据慢。理想的做法是在常常被搜索的列(以及表)上面创建索引。

Create table zs1  --建表时侯

(

Id int,

Name int,

Asas int

Index(id)

);

Create index 索引名

On zs1 (id)

Create index 索引名

On zs1 (id desc)

索引不止一个:

Create index 索引名

On zs1 (id ,nn)

删除索引:不同的数据库可能不一样

Drop index 索引名 on zs1

Drop index zs1.id --sqlserver

Drop index id –oracle

Alter table zs1 drop index 索引名

--删除表--

Drop table zs1  表的一切都会删除

Drop database 数据库名

Truncate table zs1 仅仅删除表中的数据,保留结构之类的

--修改表—

添加列

Alter table zs1 add 列名 数据类型

删除列:alter table zs1 drop column 列名 –注意某些数据库不支持这种写法

改变列的数据类型:alter table zs1 alter column 列名 数据类型  --MySQL要用modify

--auto-increment会在新纪录插入表中时生成一个唯一的数字

我们通常希望在每次插入新纪录时,自动的创建主键字段的值,我们可以在表中创建一个auto-increment字段,

Create table zs1  主键自增 –MySQL语法

(

Id int not null auto_increment,

Nn varchar(25),

Add varchar(25)

Primary key (id)

)

Alter table zs1 auto_increment =100  更改起始值

当插入数据的时候手动更改自增的值,后面再次插入以上一条数据的序列值为准累加。

SQL server 语法:

Create table zs1

(

Id int primary key identity,

Lastname int

)

Access的语法:

Create table zs1

(

Id int primary key autoincrement,

Laname varchar(255)

)

要规定 "P_Id" 列以 20 起始且递增 10,请把 autoincrement 改为 AUTOINCREMENT(20,10)

Oracle语法:

Create sequence sqq

Minvalue 1

Start 1

Increment by 1

Cache 10

Insert into table zs1 (id,name,sex) values (sqq.nextval,’aa’,’man’)  这个相对复杂一下,需要注意

--date函数---

--date 函数—

mysql基础小结(来源:MySQL必知必会)_第3张图片mysql基础小结(来源:MySQL必知必会)_第4张图片​编辑

mysql基础小结(来源:MySQL必知必会)_第5张图片mysql基础小结(来源:MySQL必知必会)_第6张图片​编辑

MySQL日期类型:

Date 格式:YYYY-MM-DD

Datetime 格式:YYYY-MM-DD HH:MM:SS

Timestamp 格式:YYYY-MM-DD HH:MM:SS

Year 格式:YYYY或者YY

Sql server日期格式:

  • DATE - 格式 YYYY-MM-DD
  • DATETIME - 格式: YYYY-MM-DD HH:MM:SS
  • SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
  • TIMESTAMP - 格式: 唯一的数字

----null  值---

Null 值是遗漏的未知数据,默认的,表可以存放null值,null值用作未知的或不适用的值的占位符。无法比较null和0;他们是不等价的。

无法用运算符来比较测试空值,必须使用 is null   和 is not null

关于 null  的函数:

Isnull(),nvl(),ifnull(),coalesce()

Isnull(列,0)  nvl(列,0)  ifnull(列,0)   coalesce(列,0)

--数据类型---

Char(size):保存固定长度的字符串(可包含字母,数字以及特殊字符),在括号中指定字符串的长度,最多255个字符。

Varchar(size):保存可变长度---------指定字符串的最大长度,最多255个字符。

Tinytext:存放最大长度为255个字符的字符串

Text: 存放最大长度为65535个字符的字符串

Int(size)

Tinyint:-128-127

Float(size,d):带有浮动小数点的小数字,括号中规定最大位数,d规定小数点最大位数。

Decimal(size,d):作为字符串存储的double类型,允许固定的小数点。

Date() 不带时间

Datetime():带有时间

Timestamp:时间戳 带有时间,

Time:时间

Year:年

---本书实例建表语句如下:

########################################

# MySQL Crash Course

# http://www.forta.com/books/0672327120/

# Example table creation scripts

########################################

########################

# Create customers table

########################

CREATE TABLE customers

(

  cust_id      INT       NOT NULL AUTO_INCREMENT,

  cust_name    CHAR(50)  NOT NULL ,

  cust_address CHAR(50)  NULL ,

  cust_city    CHAR(50)  NULL ,

  cust_state   CHAR(5)   NULL ,

  cust_zip     CHAR(10)  NULL ,

  cust_country CHAR(50)  NULL ,

  cust_contact CHAR(50)  NULL ,

  cust_email   CHAR(255) NULL ,

  PRIMARY KEY (cust_id)

) ENGINE=INNODB;

#########################

# Create orderitems table

#########################

CREATE TABLE orderitems

(

  order_num  INT          NOT NULL ,

  order_item INT          NOT NULL ,

  prod_id    CHAR(10)     NOT NULL ,

  quantity   INT          NOT NULL ,

  item_price DECIMAL(8,2) NOT NULL ,

  PRIMARY KEY (order_num, order_item)

) ENGINE=INNODB;

#####################

# Create orders table

#####################

CREATE TABLE orders

(

  order_num  INT      NOT NULL AUTO_INCREMENT,

  order_date DATETIME NOT NULL ,

  cust_id    INT      NOT NULL ,

  PRIMARY KEY (order_num)

) ENGINE=INNODB;

#######################

# Create products table

#######################

CREATE TABLE products

(

  prod_id    CHAR(10)      NOT NULL,

  vend_id    INT           NOT NULL ,

  prod_name  CHAR(255)     NOT NULL ,

  prod_price DECIMAL(8,2)  NOT NULL ,

  prod_desc  TEXT          NULL ,

  PRIMARY KEY(prod_id)

) ENGINE=INNODB;

######################

# Create vendors table

######################

CREATE TABLE vendors

(

  vend_id      INT      NOT NULL AUTO_INCREMENT,

  vend_name    CHAR(50) NOT NULL ,

  vend_address CHAR(50) NULL ,

  vend_city    CHAR(50) NULL ,

  vend_state   CHAR(5)  NULL ,

  vend_zip     CHAR(10) NULL ,

  vend_country CHAR(50) NULL ,

  PRIMARY KEY (vend_id)

) ENGINE=INNODB;

###########################

# Create productnotes table

###########################

CREATE TABLE productnotes

(

  note_id    INT           NOT NULL AUTO_INCREMENT,

  prod_id    CHAR(10)      NOT NULL,

  note_date DATETIME       NOT NULL,

  note_text  TEXT          NULL ,

  PRIMARY KEY(note_id),

  FULLTEXT(note_text)

) ENGINE=MYISAM;

#####################

# Define foreign keys

#####################

ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_orders FOREIGN KEY (order_num) REFERENCES orders (order_num);

ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) REFERENCES products (prod_id);

ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers (cust_id);

ALTER TABLE products ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors (vend_id);

--------完结:内容穿插可能不规范后续会优化整理

你可能感兴趣的:(大数据,mysql,数据库,sql)