描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字、图片,图像、声音、语言等,数据由多种表现形式,
它们都可以经过数字化后存入计算机。
在计算机中描述一个事物,就需要抽取这一事物的典型特征,组成一条记录,就相当于文件里的一行内容,如:
1egon,male,18,1999,山东,计算机系,2017,oldboy
单纯的一条记录并没有任何意义,如果我们按逗号作为分隔,依次定义各个字段的意思,相当于定义表的标题
idnamesexagebirthborn_addrmajorentrance_timeschool#字段
2egonmale181999山东计算机系2017oldboy#记录
这样我们就可以了解egon,性别为男,年龄18岁,出生于1999年,出生地为山东,2017年考入老男孩计算机系
2什么是数据库(DataBase,简称DB)
数据库即存放数据的仓库,只不过这个仓库是在计算机存储设备上,而且数据是按一定的格式存放的
数据库是长期存放在计算机内、有组织、可共享的数据即可。
数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
3什么是数据库管理系统(DataBaseManagementSystem简称DBMS)
在了解了Data与DB的概念后,如何科学地组织和存储数据,如何高效获取和维护数据成了关键
这就用到了一个系统软件---数据库管理系统
如MySQL、Oracle、SQLite、Access、MSSQLServer
mysql主要用于大型门户,例如搜狗、新浪等,它主要的优势就是开放源代码,因为开放源代码这个数据库是免费的,他现在是甲骨文公司的产品。
oracle主要用于银行、铁路、飞机场等。该数据库功能强大,软件费用高。也是甲骨文公司的产品。
sqlserver是微软公司的产品,主要应用于大中型企业,如联想、方正等。
4数据库服务器、数据管理系统、数据库、表与记录的关系
记录:1刘海龙32424523422(多个字段的信息组成一条记录,即文件中的一行内容)
表:student,scholl,class_list(即文件)
数据库:oldboy_stu(即文件夹)
数据库管理系统:如mysql(是一个软件)
数据库服务器:一台计算机(对内存要求比较高)
总结:
数据库服务器-:运行数据库管理软件的机器。
数据库管理软件:管理-数据库软件,比如mysql。
数据库:即文件夹,用来组织文件/表。一个文件夹叫做一个库。
表:即文件,用来存放多行内容/多条记录。一条记录即一行数据。
2.MySQL介绍
MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle旗下公司。
MySQL最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。
mysql是什么?
mysql就是一个基于socket编写的C/S架构的软件
客户端软件
mysql自带:如mysql命令,mysqldump命令等
python模块:如pymysql模块
数据库管理软件分类
分两大类:关系型:如sqllite,db2,oracle,access,sqlserver,MySQL,注意:sql语句通用
非关系型:mongodb,redis,memcache
可以简单的理解为:
关系型数据库需要有表结构
非关系型数据库是key-value存储的,没有表结构
MySQL的启动与查看
启动后
安装完mysql之后,登陆以后,不管运行任何命令,总是提示这个macmysqlerrorYoumustresetyourpasswordusingALTERUSERstatementbeforeexecutingthisstatement.解决方法:step1:SETPASSWORD=PASSWORD('yournewpassword');step2:ALTERUSER'root'@'localhost'PASSWORDEXPIRENEVER;step3:flushprivileges;
设置登陆密码
当你忘记密码时,可用以下方法破解密码
方式一
#1关闭mysql#2在cmd中执行:mysqld--skip-grant-tables#3在cmd中执行:mysql#4执行如下sql:updatemysql.usersetauthentication_string=password('')whereuser='root';flushprivileges;#5tskillmysqld#或taskkill-f/PID7832#6重新启动mysql方式二
统一字符编码
强调:配置文件中的注释可以有中文,但是配置项中不能出现中文
#在mysql的解压目录下,新建my.ini,然后配置#1.在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效[mysqld];skip-grant-tablesport=3306character_set_server=utf8default-storage-engine=innodbinnodb_file_per_table=1#解压的目录basedir=E:\mysql-5.7.19-winx64#data目录datadir=E:\my_data#在mysqld--initialize时,就会将初始数据存入此处指定的目录,在初始化之后,启动mysql时,就会去这个目录里找数据#2.针对客户端命令的全局配置,当mysql客户端命令执行时,下列配置生效[client]port=3306default-character-set=utf8user=rootpassword=123#3.只针对mysql这个客户端的配置,2中的是全局配置,而此处的则是只针对mysql这个命令的局部配置[mysql];port=3306;default-character-set=utf8user=egonpassword=4573#!!!如果没有[mysql],则用户在执行mysql命令时的配置以[client]为准统一字符编码:
#1.修改配置文件[mysqld]default-character-set=utf8[client]default-character-set=utf8[mysql]default-character-set=utf8#mysql5.5以上:修改方式有所改动[mysqld]character-set-server=utf8collation-server=utf8_general_ci[client]default-character-set=utf8[mysql]default-character-set=utf8#2.重启服务#3.查看修改结果:\sshowvariableslike'%char%'
初识sql语句
有了mysql这个数据库软件,就可以将程序员从对数据的管理中解脱出来,专注于对程序逻辑的编写。
mysql服务端软件即mysqld帮我们管理好文件夹以及文件,前提是作为使用者的我们,需要下载mysql的客户端,或者其他模块来连接到mysqld,
然后使用mysql软件规定的语法格式去提交自己命令,实现对文件夹或文件的管理。该语法即sql(StructuredQueryLanguage即结构化查询语言)
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
1、DDL语句数据库定义语言:数据库、表、视图、索引、存储过程,例如CREATEDROPALTER
2、DML语句数据库操纵语言:插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
3、DCL语句数据库控制语言:例如控制用户的访问权限GRANT、REVOKE
1.操作文件夹增:createdatabasedb1charsetutf8;查:showcreatedatabasedb1;showdatabases;改:alterdatabasedb1charsetlatin1;删除:dropdatabasedb1;#2.操作文件先切换到文件夹下:usedb1查看当前所在文件夹:selectdatabase();增:createtablet1(idint,namechar);查:showcreatetablet1;showtables;desct1;改:altertablet1modifynamechar(3);altertablet1changenameNAMEchar(2);修改字段名把name这一列改为NAME名字的长度最多为2删:droptablet1;#3.操作文件中的内容/记录增:insertintot1values(1,'egon1'),(2,'egon2'),(3,'egon3');查:selectid,namefromdb1.t1;select*fromt1;改:updatet1setname='sb'whereid=2;删:deletefromt1whereid=1;
库操作
系统数据库
information_schema:虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等
performance_schema:MySQL5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象
test:MySQL数据库系统自动创建的测试数据库
创建数据库
1语法(helpcreatedatabase):CREATEDATABASE数据库名charsetutf8;2数据库命名规则:可以由字母、数字、下划线、@、#、$区分大小写唯一性不能使用关键字如createselect不能单独使用数字最长128位
查看数据库showdatabases;showcreatedatabasedb1;selectdatabase();选择数据库USE数据库名删除数据库DROPDATABASE数据库名;修改数据库alterdatabasedb1charsetutf8;
表操作
存储引擎
mysql中建立的库===>文件夹
库中建立的表===>文件
现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:
比如处理文本用txt类型,处理表格用excel,处理图片用png等
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。
存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)
在Oracle和SQLServer等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。
而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎。
mysql支持的存储引擎
1、InnoDB存储引擎
2、MyISAM存储引擎
3、NDB存储引擎
4、Memory存储引擎
#memory,在重启mysql或者重启机器后,表内数据清空
5、Infobright存储引擎
6、BLACKHOLE
#blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录
7、NTSE存储引擎
MySQL数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。
这里主要介绍innoDB引擎
innoDB存储引擎
支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。
其特点是行锁设计、支持外键,并支持类似Oracle的非锁定读,即默认读取操作不会产生锁。
从MySQL5.5.8版本开始是默认的存储引擎。
InnoDB存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由InnoDB存储引擎自身来管理。
从MySQL4.1(包括4.1)版本开始,可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中。此外,InnoDB存储引擎支持将裸设备(rowdisk)用于建立其表空间。
InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为REPEATABLE级别,同时使用一种称为netx-keylocking的策略来
避免幻读(phantom)现象的产生。
除此之外,InnoDB存储引擎还提供了插入缓冲(insertbuffer)、二次写(doublewrite)、自适应哈希索引(adaptivehashindex)、预读(readahead)等高性能和高可用的功能。
对于表中数据的存储,InnoDB存储引擎采用了聚集(clustered)的方式,每张表都是按主键的顺序进行存储的,如果没有显式地在表定义时指定主键,
InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。
使用存储引擎
方法1:建表时指定MariaDB[db1]>createtableinnodb_t1(idint,namechar)engine=innodb;MariaDB[db1]>createtableinnodb_t2(idint)engine=innodb;MariaDB[db1]>showcreatetableinnodb_t1;MariaDB[db1]>showcreatetableinnodb_t2;方法2:在配置文件中指定默认的存储引擎/etc/my.cnf[mysqld]default-storage-engine=INNODBinnodb_file_per_table=1查看[root@egondb1]#cd/var/lib/mysql/db1/[root@egondb1]#lsdb.optinnodb_t1.frminnodb_t1.ibdinnodb_t2.frminnodb_t2.ibd
表的增删改查
表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段。
id,name,qq,age称为字段,其余的,一行内容称为一条记录
创建表
createtable表名(字段名1类型[(宽度)约束条件],字段名2类型[(宽度)约束条件],字段名3类型[(宽度)约束条件]);#注意:1.在同一张表中,字段名是不能相同2.宽度和约束条件可选3.字段名和类型是必须的MariaDB[(none)]>createdatabasedb1charsetutf8;MariaDB[(none)]>usedb1;MariaDB[db1]>createtablet1(->idint,->namevarchar(50),->sexenum('male','female'),->ageint(3)->);MariaDB[db1]>showtables;#查看db1库下所有表名
往表中插入数据
insertinto表名(字段1,字段2)values(值1,值2);
MariaDB[db1]>insertintot1values->(1,'egon',18,'male'),->(2,'alex',81,'female')->;
查看表结构
describe表名;查看表结构,可简写为desc表名
修改表结构
语法:1.修改表名ALTERTABLE表名RENAME新表名;2.增加字段ALTERTABLE表名ADD字段名数据类型[完整性约束条件…],ADD字段名数据类型[完整性约束条件…];ALTERTABLE表名ADD字段名数据类型[完整性约束条件…]FIRST;ALTERTABLE表名ADD字段名数据类型[完整性约束条件…]AFTER字段名;3.删除字段ALTERTABLE表名DROP字段名;4.修改字段ALTERTABLE表名MODIFY字段名数据类型[完整性约束条件…];ALTERTABLE表名CHANGE旧字段名新字段名旧数据类型[完整性约束条件…];ALTERTABLE表名CHANGE旧字段名新字段名新数据类型[完整性约束条件…];应用举例
复制表
复制表结构+记录(key不会复制:主键、外键和索引)mysql>createtablenew_serviceselect*fromservice;只复制表结构mysql>select*fromservicewhere1=2;//条件为假,查不到任何记录Emptyset(0.00sec)mysql>createtablenew1_serviceselect*fromservicewhere1=2;QueryOK,0rowsaffected(0.00sec)Records:0Duplicates:0Warnings:0mysql>createtablet4likeemployees;
删除表
DROPTABLE表名;
数据类型
存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的。
mysql常用数据类型
数值类型
1.整数类型
整数类型:TINYINTSMALLINTMEDIUMINTINTBIGINT
作用:存储年龄,等级,id,各种号码等
========================================tinyint[(m)][unsigned][zerofill]小整数,数据类型用于保存一些范围的整数数值范围:有符号:-128~127无符号:0~255PS:MySQL中无布尔值,使用tinyint(1)构造。========================================int[(m)][unsigned][zerofill]整数,数据类型用于保存一些范围的整数数值范围:有符号:-2147483648~2147483647无符号:0~4294967295========================================bigint[(m)][unsigned][zerofill]大整数,数据类型用于保存一些范围的整数数值范围:有符号:-9223372036854775808~9223372036854775807无符号:0~18446744073709551615
其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了。
默认的显示宽度,都是在最大值的基础上加1。
int的存储宽度是4个Bytes,即32个bit,即2**32
无符号最大值为:4294967296-1
有符号最大值:2147483648-1
有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的。
最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok。
2.浮点型
定点数类型DEC等同于DECIMAL
浮点类型:FLOATDOUBLE
作用:存储薪资、身高、体重、体质参数等。
2.日期类型
DATETIMEDATETIMETIMESTAMPYEAR
datetime与timestamp的区别
3.字符类型
测试前了解两个函数
length:查看字节数char_length:查看字符数
1.char填充空格来满足固定长度,但是在查询时却会很不要脸地删除尾部的空格(装作自己好像没有浪费过空间一样),然后修改sql_mode让其现出原形
即使将SQL_MODE设置为PAD_CHAR_TO_FULL_LENGTH也一样,,但这不适用于like
mysql>CREATETABLEnames(mynameCHAR(10));QueryOK,0rowsaffected(0.03sec)mysql>INSERTINTOnamesVALUES('Monty');QueryOK,1rowaffected(0.00sec)mysql>SELECTmyname='Monty',myname='Monty'FROMnames;+------------------+--------------------+|myname='Monty'|myname='Monty'|+------------------+--------------------+|1|1|+------------------+--------------------+rowinset(0.00sec)mysql>SELECTmynameLIKE'Monty',mynameLIKE'Monty'FROMnames;+---------------------+-----------------------+|mynameLIKE'Monty'|mynameLIKE'Monty'|+---------------------+-----------------------+|1|0|+---------------------+-----------------------+rowinset(0.00sec)总结
#常用字符串系列:char与varchar注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡#其他字符串系列(效率:char>varchar>text)TEXT系列TINYTEXTTEXTMEDIUMTEXTLONGTEXTBLOB系列TINYBLOBBLOBMEDIUMBLOBLONGBLOBBINARY系列BINARYVARBINARYtext:text数据类型用于保存变长的大字符串,可以组多到65535(2**161)个字符。mediumtext:ATEXTcolumnwithamaximumlengthof16,777,215(2**241)characters.longtext:ATEXTcolumnwithamaximumlengthof4,294,967,295or4GB(2**321)characters.
4.枚举类型与集合类型
字段的值只能在给定范围中选择,如单选框,多选框
enum单选只能在给定的范围内选一个值,如性别sex男male/女female
set多选在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
MariaDB[db1]>createtableconsumer(->namevarchar(50),->sexenum('male','female'),->levelenum('vip1','vip2','vip3','vip4','vip5'),#在指定范围内,多选一->hobbyset('play','music','read','study')#在指定范围内,多选多->);MariaDB[db1]>insertintoconsumervalues->('egon','male','vip5','read,study'),->('alex','female','vip1','girl');MariaDB[db1]>select*fromconsumer;+------+--------+-------+------------+|name|sex|level|hobby|+------+--------+-------+------------+|egon|male|vip5|read,study||alex|female|vip1||+------+--------+-------+------------+
完整性约束
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致性
主要分为:
PRIMARYKEY(PK)标识该字段为该表的主键,可以唯一的标识记录FOREIGNKEY(FK)标识该字段为该表的外键NOTNULL标识该字段不能为空UNIQUEKEY(UK)标识该字段的值是唯一的AUTO_INCREMENT标识该字段的值自动增长(整数类型,而且为主键)DEFAULT为该字段设置默认值UNSIGNED无符号ZEROFILL使用0填充说明:
1.是否允许为空,默认NULL,可设置NOTNULL,字段不允许为空,必须赋值2.字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值sexenum('male','female')notnulldefault'male'ageintunsignedNOTNULLdefault20必须为正值(无符号)不允许为空默认是203.是否是key主键primarykey外键foreignkey索引(index,unique...)
notnull与default
是否可空,null表示空,非字符串notnull-不可空null-可空
默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值createtabletb1(nidintnotnulldefalut2,numintnotnull)
unique
============设置唯一约束UNIQUE===============方法一:createtabledepartment1(idint,namevarchar(20)unique,commentvarchar(100));方法二:createtabledepartment2(idint,namevarchar(20),commentvarchar(100),constraintuk_nameunique(name));mysql>insertintodepartment1values(1,'IT','技术');QueryOK,1rowaffected(0.00sec)mysql>insertintodepartment1values(1,'IT','技术');ERROR1062(23000):Duplicateentry'IT'forkey'name'当某一个字段设置为notnullunique就相当于设置了一个主键
mysql>createtablet1(idintnotnullunique);QueryOK,0rowsaffected(0.02sec)mysql>desct1;+-------+---------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-------+---------+------+-----+---------+-------+|id|int(11)|NO|PRI|NULL||+-------+---------+------+-----+---------+-------+rowinset(0.00sec)notnull+unique的化学反应
联合唯一:联合唯一就是联合的多个字段加在一起不能是相同的
createtableservice(idintprimarykeyauto_increment,namevarchar(20),hostvarchar(15)notnull,portintnotnull,unique(host,port)#联合唯一);mysql>insertintoservicevalues->(1,'nginx','192.168.0.10',80),->(2,'haproxy','192.168.0.20',80),->(3,'mysql','192.168.0.30',3306)->;QueryOK,3rowsaffected(0.01sec)Records:3Duplicates:0Warnings:0mysql>insertintoservice(name,host,port)values('nginx','192.168.0.10',80);ERROR1062(23000):Duplicateentry'192.168.0.10-80'forkey'host'联合唯一primarykeyprimarykey字段的值不为空且唯一
一个表中可以:
单列做主键多列做主键(复合主键)
但一个表内只能有一个主键primarykey
约束字段为自动增长,被约束的字段必须同时被key约束
清空表:
deletefromt1;#如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
truncatetablet1;数据量大,删除速度比上一条快,且直接从零开始。
foreignkey
一快速理解foreignkey
员工信息表有三个字段:工号姓名部门
公司有3个部门,但是有1个亿的员工,那意味着部门这个字段需要重复存储,部门名字越长,越浪费
解决方法:
我们完全可以定义一个部门表
然后让员工信息表关联该表,如何关联,即foreignkey
#表类型必须是innodb存储引擎,且被关联的字段,即references指定的另外一个表的字段,必须保证唯一createtabledepartment(idintprimarykey,namevarchar(20)notnull)engine=innodb;#dpt_id外键,关联父表(department主键id),同步更新,同步删除createtableemployee(idintprimarykey,namevarchar(20)notnull,dpt_idint,foreignkey(dpt_id)referencesdepartment(id)ondeletecascade#删除同步onupdatecascade#修改同步)engine=innodb;二如何找两张表的关系
分析步骤:#1、先站在左表的角度去找是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreignkey右表一个字段(通常是id)#2、再站在右表的角度去找是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreignkey左表一个字段(通常是id)#3、总结:#多对一:如果只有步骤1成立,则是左表多对一右表如果只有步骤2成立,则是右表多对一左表#多对多如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系#一对一:如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreignkey右表的基础上,将左表的外键字段设置成unique即可
三建立表之间的关系
一对多或称为多对一
三张表:出版社,作者信息,书
一对多(或多对一):一个出版社可以出版多本书
关联方式:foreignkey
=====================多对一=====================createtablepress(idintprimarykeyauto_increment,namevarchar(20));createtablebook(idintprimarykeyauto_increment,namevarchar(20),press_idintnotnull,foreignkey(press_id)referencespress(id)ondeletecascadeonupdatecascade);insertintopress(name)values('北京工业地雷出版社'),('人民音乐不好听出版社'),('知识产权没有用出版社');insertintobook(name,press_id)values('九阳神功',1),('九阴真经',2),('九阴白骨爪',2),('独孤九剑',3),('降龙十巴掌',2),('葵花宝典',3);
多对多
多对多:一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多关联方式:foreignkey+一张新的表
=====================多对多=====================createtableauthor(idintprimarykeyauto_increment,namevarchar(20));#这张表就存放作者表与书表的关系,即查询二者的关系查这表就可以了createtableauthor2book(idintnotnulluniqueauto_increment,author_idintnotnull,book_idintnotnull,constraintfk_authorforeignkey(author_id)referencesauthor(id)ondeletecascadeonupdatecascade,constraintfk_bookforeignkey(book_id)referencesbook(id)ondeletecascadeonupdatecascade,primarykey(author_id,book_id));#插入四个作者,id依次排开insertintoauthor(name)values('egon'),('alex'),('yuanhao'),('wpq');#每个作者与自己的代表作如下egon:九阳神功九阴真经九阴白骨爪独孤九剑降龙十巴掌葵花宝典alex:九阳神功葵花宝典yuanhao:独孤九剑降龙十巴掌葵花宝典wpq:九阳神功insertintoauthor2book(author_id,book_id)values(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(2,1),(2,6),(3,4),(3,5),(3,6),(4,1);单张表:用户表+相亲关系表,相当于:用户表+相亲关系表+用户表
多张表:用户表+用户与主机关系表+主机表
中间那一张存放关系的表,对外关联的字段可以联合唯一
一对一
两张表:学生表和客户表
一对一:一个学生是一个客户,一个客户有可能变成一个学校,即一对一的关系
关联方式:foreignkey+unique
#一定是student来foreignkey表customer,这样就保证了:#1学生一定是一个客户,#2客户不一定是学生,但有可能成为一个学生createtablecustomer(idintprimarykeyauto_increment,namevarchar(20)notnull,qqvarchar(10)notnull,phonechar(16)notnull);createtablestudent(idintprimarykeyauto_increment,class_namevarchar(20)notnull,customer_idintunique,#该字段一定要是唯一的foreignkey(customer_id)referencescustomer(id)#外键的字段一定要保证uniqueondeletecascadeonupdatecascade);#增加客户insertintocustomer(name,qq,phone)values('李飞机','31811231',13811341220),('王大炮','123123123',15213146809),('守榴弹','283818181',1867141331),('吴坦克','283818181',1851143312),('赢火箭','888818181',1861243314),('战地雷','112312312',18811431230);#增加学生insertintostudent(class_name,customer_id)values('脱产3班',3),('周末19期',4),('周末19期',5);
数据操作
数据的增删改
MySQL数据操作:DML
========================================================
在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括