完整Mysql燕十八学习笔记
MySQL学习笔记
MySQL学习笔记(1)1,数据库管理概论(1)关系型数据模型:特性是利用表(Table)来呈现数据,将表视为一个集合。
以关系型数据模型为基础的数据库称为关系型数据库(Relational DataBase,RDB)。
在RDB中有许多表。
表由行(Row)及字段(Column)组成,每一行有时称为一笔记录(record),每一行的字段中,都分别存储着值(Value)。
每一个字段都会有一个字段名称(Field Name)。
这个表也称为关系(Relation),行称为群组(Tupple),字段名称称为属性(Attribute)。
(2)表中拥有特别意义的字段称为键(Key)。
主键(Primary Key):字段内容接不相同,可以用来指出表中的每一行。
候选键(Condidate Key):有资格成为主键的字段。
连接键(Concatenated Key):一个以上的字段组合而称为主键。
外部键(Foreign Key):一个表的字段与另一个表产生关联,但是这个字段不是主键。
(3)关联的类型一对一:两个表之间存在一对一的关联一对多或多对一多对多:难以维护,不建议使用(4)集合运算与关系运算集合运算:并(Union)、差(Difference)、交(Intersection)、笛卡尔积(Cartesian Product)关系运算:选取(Select):取出与条件相符合的行(Row)投影(Project):取出与条件相符合的字段(field)结合(Join):以共同的字段为中介,让多个表结合起来,建立一个新表。
先执行笛卡尔积,再进行选取除法(Division):选取被除数表中有除数表字段值的行,并且去除公共部分2,SQL概述(1)目前的SQL标准:SQL92。
多数数据库软件使用不具有兼容性的扩展版本,Oracle:PL/SQL,微软:T-SQLSQL是关系型数据库专用语言,非过程语言。
语句末尾要有分号“;”注释以两个负号“--”开始,直到行结束。
完整Mysql燕十八学习笔记
Mysql 三大列类型1. 数值型整型Tinyint 、Smallint、Mediumint 、Int、Bigint小数型Float(D,M),Decimal(D,M)2. 字符串型Char(M)Varchar(M)Text 文本类型3. 日期时间类型Date 日期Time 时间Datetime 时间类型Year年类型一.整型列的字节与存储范围从数学上讨论tinyint ,建表时既能足够存放,又不浪费空间。
即:(1). 占据空间(2). 存储范围通过占用字节和所存范围分关系合理的选择类型例:Tinyint经测试,Tinyint 的默认为有符号-128~127之间,当越界时自动取相应 的边界值。
若要存0~255无符号时:列的可选属性:Tinyin t (M ) un sig ned zerofill.M :宽度(在0填充的时候才有意义)Un sig ned:无符号类型(非负),影响存储范围 Zerofill :0填充(默认无符号)1> insert into test-> (name,age3)-> ualu&s->「赵六'/S');u QIC, 1 row aff©et&d (0.00 soc)箕from t&st;I id I name I age I agel I age2 I age3 I卜--------- + ------------- + --------------- + -------------- + --------------- + ----------------- +rows in at (0.07 SEC)列可以声明默认值,而且推荐声明默认值not null default 0; ysql> alter table test add tinyint(3j not null default 0;uery 0IC, 9 rows affected (0.13 $ec)ecords: 9 Duplicates: 0 Uarnings: O小数型/浮点型、定点型Float(M,D):M代表总位数,D代表小数位(6,2)为例:-9999.99 ->9999.99 12345G789一一一一张张张张李张李王制LLuNi NULLLLuNLLJNI NULL NULLLLuN三四三四五六6NULL NULL I NULL ILLuNNULL | 2G0 | NULL | NULL !NULL I 0 I NULL I NULL |NULL I NULL I 127 I NULL Iy$ql> t M from 七。
布尔教育-mysql
燕十八 主讲
itbool 燕十八 精品PHP教程
—高端PHP培训 实战专家!
5.1.3 整型列案例练习
为下列变量用选一种合理的存储列 ü 班级同学们的年龄 ü 乌龟的年龄 ü 中国的社保登记号 ü 新浪微博的主键
燕十八 主讲
往哪张表添加行? 给哪几列添加值? 分别是什么值?
往薪资登记表 姓名,公司,工资3列添加值 分 燕十八 精品PHP教程
—高端PHP培训 实战专家!
4.2 增删改查 之增 insert 语法
燕十八 主讲 INSERT INTO 表名(列1,…… 列n) VALUES(值 1,…… 值 n);
允许不写,如果不写,则默认插入所有列 见下例:
INSERT INTO 表名 VALUES(值 1,…… 值 n); VALUES 对应的值的输入顺序与表中字段顺序一致
itbool 燕十八 精品PHP教程
—高端PHP培训 实战专家!
4.3 增删改查 之改 update 图解
燕十八 主讲
update 表名 set 列1 = 新值1, 列2 = 新值2 where expr
燕十八 主讲
itbool 燕十八 精品PHP教程
—高端PHP培训 实战专家! 1:认识数据库&mysql(2)
燕十八 主讲
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。 在2008年1月16号被Sun公司收购。而2009年,SUN又被Oracle收购. 对于Mysql的前途,没有任何人抱乐观的态度. 目前 MySQL被广泛地应用在Internet上的中小型网站中。 由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点, 许多中小型网站为了降低网 站总体拥有成本而选择了MySQL作为网站数据 库。
《快速念咒:MySQL入门指南与进阶实战》笔记
《快速念咒:MySQL入门指南与进阶实战》阅读记录1. 第一章数据库基础在开始学习MySQL之前,了解一些数据库的基础知识是非常重要的。
数据库是一个用于存储和管理数据的计算机软件系统,它允许用户通过关键字或特定的查询语言来检索、更新和管理数据。
在数据库中,数据是以表格的形式进行组织的,每个表格都包含了一组相关的数据项,这些数据项被称为记录。
表(Table):表是数据库中存储数据的基本单位。
每个表都有一个唯一的名称,并由行(Row)和列(Column)组成。
每一行代表一个数据记录,每一列代表一个特定的数据属性。
字段(Field):字段是表中的一列,代表了数据的一种属性。
每个字段都有一个唯一的名称和一个数据类型,用于定义该字段可以存储的数据种类。
主键(Primary Key):主键是表中的一个特殊字段,用于唯一标识表中的每一行记录。
主键的值必须是唯一的,且不能为NULL。
外键(Foreign Key):外键是一个表中的字段,它的值引用了另一个表的主键值。
外键用于建立两个表之间的联系,确保引用完整性。
索引(Index):索引是一种数据库优化技术,用于提高查询性能。
通过创建索引,数据库可以更快地定位到表中的特定记录,而不必扫描整个表。
SQL(Structured Query Language):SQL是用于与数据库进行交互的编程语言。
它包括用于数据查询、插入、更新和删除的操作符和语法结构。
理解这些基本概念是学习MySQL的前提。
通过掌握SQL语言的基本语法和操作,你将能够有效地管理和操作数据库中的数据。
在接下来的章节中,我们将深入探讨MySQL的具体应用,包括如何创建和管理数据库、表、以及如何执行复杂的查询操作。
2. 第二章数据库设计《快速念咒:MySQL入门指南与进阶实战》是一本全面介绍MySQL 数据库的书籍,其中第二章详细阐述了数据库设计的基础知识和实践技巧。
在这一章节中,作者首先介绍了数据库设计的基本概念和目标,包括数据模型、实体关系模型(ER模型)等,并解释了如何通过这些模型来描述现实世界中的数据和业务逻辑。
读书笔记Mysql是怎样运行的
读书笔记Mysql是怎样运⾏的| Mysql是怎样运⾏的⼀、mysql基本知识1. 查看表的基本信息show table status使⽤show table status like tableName可以查看指定表的基本信息,包括存储引擎,⾏格式等2. MySQL数据类型的⼤⼩tinyint1字节int,integer4字节bigint8字节float4字节double8字节varchar(n)表⽰n个字符,⽆论汉字和英⽂,Mysql都能存⼊n个字符,仅是实际字节长度有所区别char(n),定长,表⽰该列占⽤n个字符,根据不同的字符集,实际占⽤字节⼤⼩不⼀样对于定长字符集如ascii,char(n)固定占⽤n个字节,如果实际数据不⾜n个字节,会在末尾补上空字符(0x00)对于变长字符集如utf8(1~3),gbk(1~2),也会在变长字段长度列表中存储该列的长度3. update的⼤致流程⼆、InnoDB记录存储结构InnoDB中数据的存储是在磁盘上的,⽽数据处理的过程则在内存中.InnoDB将数据划分为若⼲个页,以页作为磁盘和内存之间交互的基本单位,InnoDb中页的⼤⼩⼀般为16KB拓展阅读:1. InnoDB⾏格式1-1. InnoDB中的⾏格式类别1. compact,version 5.6 默认使⽤2. redundant,3. dynamic,version 5.7默认使⽤4. compressed1-2. 如何指定⾏格式CREATE TABLE 表名 (列的信息) ROW_FORMAT=⾏格式名称ALTER TABLE 表名 ROW_FORMAT=⾏格式名称1-3. 各种⾏格式的区别1-3-1. compact⾏格式compact⾏格式的内容:变长字段⻓度列表+ NULL列表+ 记录头信息+ 列值1-3-1-1. 变长字段⻓度列表在mysql中,变长字段中存储多少字节的数据是不固定的,所以在存储时,需要将这些数据占⽤的字节数也存起来,所以这些变长字段占⽤的存储空间分为两部分:1.真正的数据内容2.字段的长度在compact⾏格式中,把所有变长字段的真实数据占⽤的字节长度都存放在记录的开头部位,从⽽形成⼀个变长字段长度列表,各变长字段数据占⽤的字节数按照列的顺序逆序存放.注意,如果某个变长字段内容为null,是不会放⼊这个列表中的,⽽是放在了NULL列表中.字段的长度⽤1或2个字节表⽰,具体规则如下:当字段最⼤长度 <= 255字节时⽤⼀个字节表⽰字段最⼤长度 > 255,但实际使⽤字节 <= 127,也使⽤1个字节表⽰其他情况使⽤2个字节表⽰1-3-1-2. NULL列表存储每条记录中允许为NULL的字段,将实际为NULL的字段⽤1表⽰,实际不为NULL的字段⽤0表⽰,也是逆序存放,每个允许为NULL的列⽤⼀个位来表⽰,如果记录中所有的列都不允许为null,则null列表就不存在.MySQL规定NULL值列表必须⽤整数个字节的位表⽰,如果使⽤的⼆进制位个数不是整数个字节,则在字节的⾼位补0.1-3-1-3. compact记录头信息5字节记录头信息由5个字节组成,也就是40个⼆进制位名称⼤⼩(bit)描述预留位11没有使⽤预留位21没有使⽤delete_mask1表⽰该记录是否被删除min_rec_mask1B+树的每层⾮叶⼦节点中的最⼩记录都会添加该标记n_owned4表⽰当前页⽬录中拥有的记录数heap_no13表⽰当前记录在本⻚中的位置,因为页中会⾃动记录最⼩记录和最⼤记录,分别放在第0位和第1位,所以⽤户添加的记录在页中的位置是从2开始的record_type3表⽰当前记录的类型,0表⽰普通记录,1表⽰B+数⾮叶⼦节点记录,2表⽰最⼩记录,3表⽰最⼤记录next_record16表⽰从当前记录的真实数据到下⼀条记录的真实数据的地址偏移量1-3-1-4. 列值MySQL⾃动添加的隐藏列MySQL会为每个记录添加⼀些隐藏列,如DB_ROW_ID,DB_TRX_ID,DB_ROLL_POINTER,具体情况如下:列名是否必须占⽤空间描述row_id否6字节⾏ID,当我们创建的表中没有明确指定主键,且表中没有unique修饰的列时,会⾃动创建这个列,⽤来唯⼀标识⼀条记录transaction_id是6字节事务IDroll_pointer是7字节回滚指针列名是否必须占⽤空间描述⾏溢出数据在compact和redundant⾏格式中,对于占⽤存储空间⾮常⼤的列,在记录的真实数据处只会存储该列的⼀部分数据,把剩余的数据分散存储在⼏个其他的页中,然后记录的真实数据处⽤20个字节存储指向这些页的地址,dynamic⾏格式对于⾮常⼤的数据,会把它的全部数据存储到其他页中,然后在记录的真实数据处存储这些页的地址1-3-2. redundant⾏格式redundant⾏格式是MySQL5.0之前⽤的⼀种⾏格式,字段长度偏移列表+ 记录头信息+ 列值1-3-2-1. 字段长度偏移列表redundant⾏格式会把记录中所有列的长度信息都按照逆序存储到字段长度偏移列表中.⽽且存储长度的⽅式是采⽤相邻数值的差值来计算各个列值得长度1-3-2-2. redundant记录头信息6字节与compact⾏格式的记录头信息对⽐来看,有两处不同:1. redundant⾏格式多了n_field和1byte_offs_flagn_field:表⽰记录中列的数量1byte_offs_flag:标记字段长度偏移列表中的偏移量是使⽤1字节还是2字节表⽰的2. redundant⾏格式没有record_type属性1-3-2-3. redundant中null的处理如果变长数据类型的列值为null,则在字段长度偏移列表中记录偏移量为0即可,也就是会重复上⼀个偏移量的值,不⽤占⽤记录的真实数据部分如果存储null值的字段是char(M)数据类型的,则占⽤记录的真实数据部分,并把该字段对应的数据使⽤0x00字节填充.1-3-2-4. 列值和compact类似1-3-3. dynamic⾏格式和compressed⾏格式这两种⾏格式类似于compact⾏格式,只不过在处理⾏溢出数据时有点不⼀样,它们把该列的所有字节都存储到其他页上,只在记录的真实数据处存储其他页的地址,另外compressed⾏格式会采⽤压缩算法对页⾯进⾏压缩.2. InnoDB数据页结构2-1. 常见的数据页类型1. 存放表空间头部信息的页2. 存放insert buffer信息的页3. 存放inode信息的页4. 存放undo⽇志信息的页5. 存放记录的页(索引页)2-2. 索引页2-2-1. 索引页结构名称中⽂名占⽤空间简单描述File Header⽂件头部38字节页的⼀些通⽤信息(上⼀页,下⼀页等) Page Header页⾯头部56字节数据页专有的⼀些信息Infinum + Supremun最⼩记录和最⼤记录26字节两个虚拟的⾏记录User Records⽤户记录动态改变实际存储的⾏记录内容Free Space空间空间动态改变页中尚未使⽤的空间Page Directory页⽬录动态改变页中的某些记录的相对位置File Trailer⽂件尾部8字节校验页是否完整2-2-1-1. File Header⽂件头部38字节⽂件头部的组成部分名称占⽤空间(字节)描述fil_page_space_or_chksum4页的校验和fil_page_offset4页号fil_page_prev4上⼀页的页号fil_page_next4下⼀页的页号fil_page_lsn8页被最后修改时对应的⽇志序列位置(Log Sequence Number)fil_page_type2当前页的类型fil_page_file_flush_lsn8仅在系统表空间的⼀个页中定义,代表⽂件⾄少被刷新到了对应的lsn值fil_page_arch_log_no_or_space_id4页属于哪个表空间名称占⽤空间(字节)描述fil_page_type当前页的类型:类型名称⼗六进制描述fil_page_type_allocated0x0000最新分配,还没使⽤fil_page_undo_log0x0002Undo⽇志⻚fil_page_inode0x0003段信息节点fil_page_ibuf_free_list0x0004Insert Buffer空闲列表fil_page_ibuf_bitmap0x0005Insert Buffer位图fil_page_type_sys0x0006系统页fil_page_type_trx_sys0x0007事务系统数据fil_page_type_fsp_hdr0x0008表空间头部信息fil_page_type_xdes0x0009扩展描述页fil_page_type_blob0x000A blob页fil_page_index0x45BF索引页,也就是我们所说的数据页2-2-2. Page Header页⾯头部56字节名称占⽤空间(字节)描述page_n_dir_slots2本页中页⽬录的数量page_heap_top2还未使⽤的空间的最⼩地址,也就是说从该地址之后就是Free Spacepage_n_heap2本页中记录的数据(包括最⼩和最⼤记录以及被标记为删除的记录)page_free2第⼀个被标记为删除的记录地址(各个已删除的记录通过next_record也会组成⼀个单链表,这个单链表中的记录可以被重新利⽤)page_garbage2已删除记录占⽤的字节数page_last_insert2最后插⼊记录的位置page_derection2记录插⼊的⽅向page_n_direction2⼀个⽅向连续插⼊的记录数量page_n_recs2该页中记录的数量(不包括最⼩和最⼤记录以及被标记为删除的记录)page_max_trx_id8修改当前页的最⼤事务ID,该值仅在⼆级索引中定义page_level2当前页在B+树中所处的层级page_index_id8索引ID,表⽰当前页属于哪个索引page_btr_seg_leaf10B+树叶⼦段的头部信息,仅在B+树的Root页定义page_btr_seg_top10B+树⾮叶⼦段的头部信息,仅在B+树的Root页定义2-2-2-1. 页⽬录Page Derectory页⽬录的作⽤页⽬录将页中记录按顺序划分为⼏组,并在页⽬录中记录每组的中的最⼤值,这样就可以通过⼆分查找法快速定位要查找⽬标所在的组,然后遍历该组中数据即可查到.页⽬录的划分规则对于最⼩记录所在的分组只能有⼀条记录,最⼤记录所在的分组可有有1~8条记录,其他分组中可以有4~8条记录.⼀开始数据页中只有最⼩纪录和最⼤记录两个记录,它们分属于两个分组之后每插⼊⼀条记录,都会从⻚⽬录中找到主键值⽐本记录的 主键值⼤并且差值最⼩的槽,然后把该槽对应的记录的 n_owned值加1,表⽰本组内⼜添加了⼀条记录,直到该组中 的记录数等于8个在⼀个组中的记录数等于8个后再插⼊⼀条记录时,会将组中 的记录拆分成两个组,⼀个组中4条记录,另⼀个5条记录。
mysql笔记-第6天
第六天一,回顾1.外键: 关联关系(表与表之间: 表中字段指向另外一张表的主键)外键条件: 字段类型必须一致, 存储引擎必须为innodb外键约束:子表约束: 不能插入父表不存在的记录父表约束: 三种约束模式(district, cascade,set null), on delete set null on update cascade2.联合查询: union, 多表合并和单表不同查询条件联合查询使用order by: select语句必须使用括号; 还必须配合limit3.子查询: 查询语句中有查询语句分类: 按位置(from,where和exists), 按返回结果(用途):标量, 列,行和表4.视图: view节省SQL语句; 安全性控制视图本质: 虚拟表, 有结构无数据视图数据操作: 多表只能改, 单表可以增删改(增删有条件限制)视图算法: undefined未定义, temptable临时表和merge合并5.文件备份与还原文件备份: 存储引擎(myisam适用)单表数据备份: 只能备份数据SQL备份: 备份的是SQL指令(mysqldump.exe客户端备份)增量备份: 备份系统日志文件需求: 有一张银行账户表, 有A用户给B用户转账: A账户先减少, B账户增加. 但是A操作完之后断电了.解决方案: A减少钱, 但是不要立即修改数据表, B收到钱之后, 同时修改数据表.二,事务安全事务: transaction, 一系列要发生的连续的操作事务安全: 一种保护连续操作同时满足(实现)的一种机制事务安全的意义: 保证数据操作的完整性(存储引擎必须为innodb ,另一个可以用事务的是BDB但它收费)(事务操作只针对数据进行操作,若在事务内进行删表创表创数据库等操作,会先commit然后执行)1.事务操作事务操作分为两种: 自动事务(默认的), 手动事务①手动事务: 操作流程(data目录下的ib_logfile文件是日志文件)a.开启事务: 告诉系统以下所有的操作(写)不要直接写入到数据表, 先存放到事务日志Start transaction;(试:已经开启事务了,中途再Start transaction; ,相当于先commit再开启)(试:开启事务后,执行的查询语句,返回的是start transaction那一刻的数据经过日志内存的写操作语句加工后的结果,这时候提交事务后再查询的真实结果不一定就是这个)(试:某人开启事务的时候,对其他人的操作没有影响,其他人也可以操作数据库; 这个人开启事务的作用只是把开启事务后的写操作写入日志文件,相当于把日志内的所有操作数据的语句绑到一起再用commit提交或用rollback清空而已,把有可能不连续的操作连续起来而已)b.进行事务操作: 一系列操作李四账户减少张三账户增加c.关闭事务: 选择性的将日志文件中操作的结果保存到数据表(同步)或者直接清空事务日志(原来操作全部清空) ( 试:这两个命令都会退出事务,但commit会提交日志rollback会取消日志)1>提交事务: 同步数据表(操作成功): commit;2>回滚事务: 直接清空日志表(操作失败): rollback;2.事务原理事务操作原理: 事务开启之后, 所有的操作都会临时保存到事务日志, 事务日志只有在得到commit命令才会同步到数据表,其他任何情况都会清空(rollback, 断电, 断开连接)3.回滚点回滚点: 在某个成功的操作完成之后, 后续的操作有可能成功有可能失败, 但是不管成功还是失败,前面操作都已经成功: 可以在当前成功的位置, 设置一个点: 可以供后续失败操作返回到该位置, 而不是返回所有操作, 这个点称之为回滚点.设置回滚点语法: savepoint 回滚点名字;回到回滚点语法: rollback to 回滚点名字; (rollback to不会退出事务,但rollback会退出事务)2.自动事务处理(事务操作只针对数据进行操作,若关闭自动事务处理,再内进行删表创表创数据库等操作,会先commit再执行,帮你提交之前的操作;但之后的数据操作还是要commit 才能生效)在mysql中: 默认的都是自动事务处理, 用户操作完会立即同步到数据表中.自动事务: 系统通过autocommit变量控制Show variables like ‘autocommit’;关闭自动提交: set autocommit = off/0;再次直接写操作自动关闭之后,需要手动来选择处理: commit提交, rollback回滚注意: 通常都会使用自动事务4.事务特性事务有四大特性: ACIDA: Atomic原子性, 事务的整个操作是一个整体, 不可分割,要么全部成功,要么全部失败;C: Consistency, 一致性, 事务操作的前后, 数据表中的数据没有变化I: Isolation, 隔离性, 多方事务操作是相互隔离不受影响的.D: Durability, 持久性, 数据一旦提交, 不可改变,永久的改变数据表数据5.锁机制: innodb默认是行锁, 但是如果在事务操作的过程中, 没有使用到索引,那么系统会自动全表检索数据, 自动升级为表锁(事务内用索引定位的作写操作的时候,它会通过索引自动定位到那一条;但不用索引的话,他会全表搜索,查找所有记录;若行被锁住,别人用非索引定位没被锁住的行的话,会全表搜索会卡主,但别人用索引定位没被锁住的行时,不会被锁住)行锁: 只有当前行被锁住, 别的用户不能操作表锁: 整张表被锁住, 别的用户都不能操作三,变量变量分为两种: 系统变量和自定义变量1.系统变量系统定义好的变量: 大部分的时候用户根本不需要使用系统变量: 系统变量是用来控制服务器的表现的: 如autocommit, auto_increment_increment等①查看系统变量Show variables; -- 查看所有系统变量②查看具体变量值: 任何一个有数据返回的内容都是由select查看(试: 用select和show都可以查看变量值,只不过show查看列出的是所有变量,需要用like筛选;select查看是直接跟变量名,查看系统变量需要加两个@)Select @@变量名;③修改系统变量修改系统变量分为两种方式: 会话级别和全局级别a.会话级别: 临时修改, 当前客户端当次连接有效Set 变量名= 值;/Set @@变量名= 值;b.全局级别: 一次修改,永久生效(对所有客户端都生效,但必须重启会话才能生效)如果对方(其他)客户端当前已经连上服务器,那么当次修改无效,要退出重新登录才会生效Set global 变量名= 值; (这里不能加@@,加了报错)2.自定义变量①定义变量:系统为了区分系统变量, 规定用户自定义变量必须使用一个@符号Set @变量名= 值;②查看自定义变量:也是类似系统变量查看Select @变量名; (试:以上所有用set修改变量的方法和用select查看变量的方法,都可跟多个变量,用逗号隔开)3.在mysql中, “=”会默认的当做比较符号处理(很多地方), mysql为了区分比较和赋值的概念: 重新定义了一个新的的赋值符号: :=4.Mysql允许从数据表中获取数据,然后赋值给变量: 两种方式①方案1: 边赋值,变查看结果Select @变量名:= 字段名from 数据源; -- 从字段中取值赋值给变量名, 如果使用=会变成比较(若不用:=而用=,会把=号当比较符号, 把@变量名=字段名当成一个字段,下面的数据是他们比较的值,0或1 ; 若用:=,会每到一列就赋值一次然后显示.显示完了之后该变量的值为最后一行的那个字段的值)②方案2: 只有赋值不看结果: 要求很严格: 数据记录最多只允许获取一条: mysql不支持数组Select 字段列表from 表名into 变量列表; (字段列表和变量列表数量必须一致,记录只允许一条)所有自定义的变量都是会话级别: 当前客户端当次连接有效所有自定义变量不区分数据库(用户级别)四,触发器触发器: trigger, 事先为某张表绑定好一段代码,当表中的某些内容发生改变的时候(增删改)系统会自动触发代码,执行.触发器: 事件类型, 触发时间, 触发对象事件类型: 增删改, 三种类型insert,delete和update(试:在一个表上做3个触发器,分别为after的增删改,若你用一条insert或delete或update语句插入或删除或改动了多条数据,动了几条,他们就会触发对应的触发器几次,没成功不触发; 若没有唯一键或主键冲突的时候,replace和insert的作用一样,触发器行为也一样)(试:有主键冲突情况下Replace的触发行为,完全等价于先delete再insert,哪怕replace的新数据与原表中需要替换的旧数据一模一样,也相当于先删旧的再添新的;一条sql语句replace多条记录,等价于把该条sql语句拆分成多条sql语句运行的效果!!!)(replace操作在唯一键或主键冲突时永远相当于先删再添,如果表中有多个字段都有唯一键,你要插入的一条数据跟表中的多条记录都冲突了,那么会先把那多条记录删掉,再把新数据添进表中,完成后delete触发器触发多次,inset触发器触发一次!)(用insert into…on duplecate key update…: 在主键和唯一键冲突时,运行了更新操作的话,就会update触发器触发一次;没冲突运行了插入操作就会insert触发器触发一次)(若某条增删改语句加了触发器,当你运行增删改的时候,本身的增删改是没问题的,但他即将触发的事件因为某种原因(如超范围或唯一键约束等)运行不了,那么那个增删改也不能运行,触发事件也不会发生,可以这么理解,触发导火线和将触发的事件,要不就都发生要不就都不发生)触发时间: 前后: before和after (和上面3种的组合方式一共有6种)触发对象: 表中的每一条记录(针对行)一张表中只能拥有一种触发时间的一种类型的触发器: 最多一张表能有6个触发器1.创建触发器在mysql高级结构中: 没有大括号, 都是用对应的字符符号代替触发器基本语法:①-- 临时修改语句结束符(试:这是会话级别)Delimiter 自定义符号-- 后续代码中只有碰到自定义符号才算结束(这条语句没有结束符)②--创建触发器(试: 把触发器装在某个表上,触发后的执行语句不能对这个表进行操作,因为此表触发了触发器,触发器内容没执行完的时候就被锁住了)(试:触发器触发后的执行语句不能是查询操作,因为触发触发后不允许有返回值,触发器触发后的执行语句也不能是删表操作)Create trigger 触发器名字触发时间事件类型on 表名for each rowBegin -- 代表左大括号: 开始……-- 里面就是触发器的内容: 每行内容都必须使用语句结束符: 分号End -- 代表右带括号: 结束自定义符号-- 语句结束符③-- 将临时修改修正过来Delimiter ;2.查看触发器查看所有触发器或者模糊匹配Show triggers [like ‘pattern’];可以查看触发器创建语句Show create trigger 触发器名字; (试:这只能查看当前数据库的索引触发器)所有的触发器都会保存一张表中: Information_schema.triggers3.使用触发器触发器: 不需要手动调用, 而是当某种情况发生时会自动触发.(订单里面插入记录之后)4.修改触发器&删除触发器触发器不能修改,只能先删除,后新增.Drop trigger 触发器名字;5.触发器记录触发器记录: 不管触发器是否触发了,只要当某种操作准备执行, 系统就会将当前要操作的记录的当前状态和即将执行之后新的状态给分别保留下来, 供触发器使用: 其中, 要操作的当前状态保存到old中, 操作之后的可能形态保存给new.Old代表的是旧记录,new代表的是新记录删除的时候是没有new的; 插入的时候是没有oldOld和new都是代表记录本身: 任何一条记录除了有数据, 还有字段名字.使用方式: old.字段名/ new.字段名(new代表的是假设发生之后的结果)查看触发器的效果如果触发器内部只有一条要执行的SQL指令, 可以省略大括号(begin和end)Create trigger 触发器名字触发时间事件类型on 表名for each rowSQL指令;触发器: 可以很好的协调表内部的数据处理顺序和关系. 但是从PHP角度出发, 触发器会增加数据库维护的难度, 所以较少使用触发器.五,代码执行结构(if-then-else和while好像都只能在procedure或是function里用??)代码执行结构有三种: 顺序结构, 分支结构和循环结构1.分支结构分支结构: 事先准备多个代码块, 按照条件选择性执行某段代码.在mysql中只有if分支基本语法If 条件判断then……;-- 满足条件要执行的代码;[Else……; ] -- 不满足条件要执行的代码;End if;触发器结合if分支: 判断商品库存是否足够,不够不能生成订单. mysql内没有专门的语句的阻止某条sql语句的发生,所以可以在不希望某条语句发生的触发器内if后面跟一条语法错误的语句,暴力终止,触发器内的语句执行不了了,那么原来触发触发器的语句也就执行不了了.(试:下例其实也可以直接把库存的类型改成int signed,就不需要加这种验证了)效果2.循环结构循环结构: 某段代码在指定条件执行重复执行. While循环(没有for循环) (还有个循环叫loop,跟while是一样的,所以只讲一个)①语法结构:While 条件判断do……;-- 满足条件要执行的代码……;-- 变更循环条件End while;②循环控制: 在循环内部进行循环判断和控制Mysql中没有对应continue和break. 但是有替代品.Iterate: 迭代, 类似continue, 后面的代码不执行, 循环重新来过Leave: 离开, 类似break,整个循环接收使用方式: Itrate/leave 循环名字;③定义循环名字:循环名字:while 条件do……; -- 循环体……;-- 循环控制Leave/iterate 循环名字;End while;六,函数函数: 将一段代码块封装到一个结构中, 在需要执行代码块的时候, 调用结构执行即可.(代码复用) 函数分为两类: 系统函数和自定义函数1.系统函数系统定义好的函数, 直接调用即可.任何函数都有返回值, 因此函数的调用是通过select调用.Mysql中,字符串的基本操作单位(最常见的是字符)怎么查看操作手册:打开操作手册在左边的目录里选中要查询的大类,再点击一下右边的正文处ctrl+f输入查询内容查询常用系统函数:Substring: 字符串截取(字符为单位)char_length: 字符长度Length: 字节长度Instr: 判断字符串是否在某个具体的字符串中存在, 存在返回位置,不存在返回0;(位置都是从1开始)Lpad: 左填充, 将字符串按照某个指定的填充方式,填充到指定长度(字符)(填就从左边开始填; 不够原始长度也是从左边开始读,读到指定长度为止)(Rpad:右填充) (填也是从左边开始填,不够原始长度也是读从左边开始读到指定长度)Insert: 替换,找到目标位置,指定长度的字符串,替换成目标字符串Strcmp: compare,字符串比较(区不区分大小写跟校对集有关,默认的校对集不区分大小写) (类似java中String的compareTo方法,但小返回-1,大返回1,等于返回0)2.自定义函数(试: 只对当前数据库有效,只要不删永久有效,非会话级别) (试:函数体内写select查询语句输出会报错,但用于赋值不会报错)(试:函数内不能增删表,不然报错;函数可以对某表内的数据进行写操作;但函数内不能有查询后的输出语句,可以有查询后的赋值语句!!)(试:函数不能什么都不加,直接调用,如: Function(); )(调用函数的时候中途报错退出函数的话,报错之前的代码有效!!!)函数要素: 函数名, 参数列表(形参和实参), 返回值, 函数体(作用域)①创建函数:创建语法: (这里也是,如果函数里只有一条语句,则begin和end可以省略不写) (自定义函数必须有返回值)Delimiter 结束符Create function 函数名([形参列表]) returns 数据类型-- 规定要返回的数据类型Begin……;-- 函数体……;-- 返回值: return 类型(指定数据类型);End结束符Delimiter ;定义函数自定义函数与系统函数的调用方式是一样: select 函数名([实参列表]);②查看函数查看所有函数: show function status [like ‘pattern’];查看函数的创建语句: show create function 函数名;③修改函数&删除函数函数只能先删除后新增,不能修改.Drop function 函数名;④函数参数参数分为两种: 定义时的参数叫形参, 调用时的参数叫实参(实参可以是数值也可以是变量)形参: 要求必须指定数据类型Function 函数名(形参名字字段类型) returns 数据类型在函数内部使用@定义的变量在函数外部也可以访问,在函数外部@定义的全局变量函数内也能使用,但类型不兼容的全局变量赋值给局部变量,在函数调用的时候会报错④作用域Mysql中的作用域与js中的作用域完全一样(任何变量只要你要修改,就要用set关键字)全局变量可以在任何地方使用; 局部变量只能在函数内部使用.全局变量: 使用set关键字定义, 使用@符号标志(跨数据库也能使用)局部变量: 使用declare关键字声明, 没有@符号: 所有的局部变量的声明,必须在函数体开始之前七,存储过程存储过程简称过程,procedure, 是一种用来处理数据的方式.存储过程是一种没有返回值的函数.(存储过程与函数不同,他里面可以放查询语句,里面也可以增删表,也可以增删数据库) (存储过程只对当前数据库有效,非会话级别)(调用存储过程,执行的中途报错退出了的话.错误之前的代码有效!!!)1.创建过程Delimiter 结束符Create procedure 过程名字([参数列表])Begin……; -- 过程体End结束符Delimiter ;2.查看过程函数的查看方式完全适用于过程: 关键字换成procedure 查看所有过程: show procedure status [like ‘pattern’];查看过程创建语句: show create procedure 过程名;3.调用过程过程没有返回值: select是不能访问的.过程有一个专门的调用关键字: call4.修改过程&删除过程过程只能先删除,后新增Drop procedure 过程名;5.过程参数函数的参数需要数据类型指定, 过程比函数更严格.过程还有自己的类型限定: 三种类型In: 数据只是从外部传入给内部使用(值传递): 可以是数值也可以是变量Out: 只允许过程内部使用(不用外部数据), 给外部使用的.(引用传递: 外部的数据会被先清空才会进入到内部): 只能是变量Inout: 外部可以在内部使用,内部修改也可以给外部使用: 典型的引用传递: 只能传变量①基本使用Create procedure 过程名(in 形参名字数据类型, out 形参名字数据类型, inout 形参名字数据类型)调用: out和inout类型的参数必须传入变量,而不能是数值正确调用: 传入变量存储过程对于变量的操作(返回)是滞后的: 是在存储过程调用结束的时候,才会重新将内部修改的值赋值给外部传入的全局变量.测试: 传入数据1,2,3: 说明局部变量与全局变量无关最后: 在存储过程调用结束之后, 系统会将局部变量重复返回给全局变量(out和inout)。
燕十八公益讲堂-mysql
zixue.it 燕十八 精品PHP教程
—精品PHP公开课 免费 直播! 7.4 select 5种子句 之order排序
燕十八 主讲
Order by 排序功能 按一个或多个字段对查询结果进行排序 用法:order by col1,col2,col3 知识点的运用场合描述 各种排序场合,如新闻按点击量排序, 商品按价格排序等 默认排序:升续排列
having与where异同点 having与where类似,可筛选数据 where后的表达式怎么写,having就怎么写
燕十八 主讲
where针对表中的列发挥作用,查询数据 having针对查询结果中的列发挥作用,筛选数据
zixue.it 燕十八 精品PHP教程
—精品PHP公开课 免费 直播!
燕十八 7.3 select 5种子句 之having练习(1) 主讲
燕十八 主讲
zixue.it 燕十八 精品PHP教程
—精品PHP公开课 免费 直播! 7 select 5种子句介绍 Where 条件查询 group by 分组 having 筛选 order by 排序 limit 限制结果条数
燕十八 主讲
zixue.it 燕十八 精品PHP教程
—精品PHP公开课 免费 直播! 7.1 select 5种子句 之where介绍
允许不写,如果不写,则默认插入所有列 见下例:
INSERT INTO 表名 VALUES(值 1,…… 值 n); VALUES 对应的值的输入顺序与表中字段顺序一致
zixue.it 燕十八 精品PHP教程
—精品PHP公开课 免费 直播! 4.3 增删改查 之改 update 图解
燕十八 主讲
update 表名 set 列1 = 新值1, 列2 = 新值2, where expr
Mysql笔记(附Mysql基础书pdf版)
Mysql笔记(附Mysql基础书pdf版)资料数据库篇SHOW DATABASES; //显⽰数据库系统中已经存在的数据库CREATE DATABASE 数据库名; //创建数据库DROP DATABASE 数据库名; //删除数据库表篇注:在使⽤操作表语句前,⾸先要使⽤USE语句选择数据库。
选择数据库语句的基本格式为“USE 数据库名”。
否则会报错,1046;CREATE TABLE 表名 ( 属性名数据类型 [完整性约束条件],属性名数据类型 [完整性约束条件],属性名数据类型);表名不能为SQL语句的关键字,⼀个表可以有多个属性。
定义时,字母⼤⼩写均可,各属性之间⽤逗号隔开,最后⼀个属性不需要加逗号。
主键主键有唯⼀值单字段主键属性名数据类型 primary key //创建主键,写在属性名数据类型后⾯;多字段主键primary key(属性名 1,属性名2,属性名n)两者的组合可以确定唯⼀的⼀条记录;外键外键不⼀定必须为⽗表的主键,但必须是唯⼀性索引,主键约束和唯⼀性约束都是唯⼀性索引;外键可以为空值;设置外键的基本语法规则如下:CONSTRAINT 外键别名 FOREIGN KEY(属性 1.1,属性1.2,属性1.n)REFERENCES 表名(属性2.1,属性2.2,属性2.n)其中,“外键别名”参数是为外键的代号;“属性1”参数列表是⼦表中设置的外键;“表名”参数是指⽗表的名称;“属性2”参数列表是⽗表的主键。
设置表的⾮空约束设置表的唯⼀性约束设置表的属性值⾃动增加查看表结构DESCRIBE 表名; // 查看表基本结构语句,可缩写为desc 表名SHOW CREATE TABLE 表名; //查看表详细结构语句(包含存储引擎、字符编码)删除表DROP TABLE 表名;//删除没有被关联的普通表删除⽗表需要先将外键删除,然后才能去删除⽗表。
字段篇//通过ALTER TABLE语句ALTER TABLE 旧表名 RENAME [TO] 新表名;//修改表名 TO参数是可选参数,是否在语句中出现不会影响语句的执⾏。
MySql学习笔记
MySql学习笔记MySql学习笔记MySql概述:MySql是一个种关联数据库管理系统,所谓关联数据库就是将数据保存在不同的表中,而不是将所有数据放在一个大的仓库中。
这样就增加了速度与提高了灵活性。
并且MySql软件是一个开放源码软件。
注意,MySql所支持的TimeStamp的最大范围的问题,在32位机器上,支持的取值范围是年份最好不要超过2030年,然后如果在64位的机器上,年份可以达到2106年,而对于date、与datetime这两种类型,则没有关系,都可以表示到9999-12-31,所以这一点得注意下;还有,在安装MySql的时候,我们一般都选择Typical(典型安装)就可以了,当然,如果还有其它用途的话,那最好选择Complete(完全安装);在安装过程中,一般的还会让你进行服务器类型的选择,分别有三种服务器类型的选择,(Developer(开发机)、Server Machine(服务器)、Dedicated MySql Server Machine(专用MYSQL服务器)),选择哪种类型的服务器,只会对配置向导对内存等有影响,不然其它方面是没有什么影响的;所以,我们如果是开发者,选择开发机就可以啦;然后接下来,还会有数据库使用情况对话框的选择,我们只要按照默认就可以啦;连接与断开服务器:连接:在windows命令提示符下输入类似如下命令集:mysql –h host –u user –p 例如,我在用的时候输入的是:mysql –h localhost –u root –p 然后会提示要你输入用户密码,这个时候,如果你有密码的话,就输入密码敲回车,如果没有密码,直接敲回车,就可以进入到数据库客户端;连接远程主机上的mysql,可以用下面的命令:mysql –h 159.0.45.1 –u root –p 123 断开服务器:在进入客户端后,你可以直接输入quit然后回车就可以了;下面就数据库相关命令进行相关说明Alter table test add(address varchar(50) not null default …xm?,email varchar(20) not null);将表中某个字段的名字修改或者修改其对应的相关属性的时候,要用change对其进行操作; Alter table test change email email varchar(20) not null default …zz?;//不修改字段名Alter table test change email Email varchar(30) not null;//修改字段名称删除表中字段:Alter table test drop email;//删除单个字段Alter table test drop address,drop email;//删除多列可以用Drop来取消主键与外键等,例如:Alter table test drop foreign key fk_symbol; 删除索引:Drop index index_name on table_name; 例如:drop index t on test;向表中插入记录:注意,当插入表中的记录并不是所有的字段的时候,应该要在前面列出字段名称才行,不然会报错;Insert into test(name) values(…ltx?);Insert into test values(1,?ltx?);也可以向表中同时插入多列值,如:Insert into test(name) va lues(…ltx?),(…hhy?),(…xf?);删除表中记录:Delete from test;//删除表中所有记录;Delete from test where id=1;//删除表中特定条件下的记录;当要从一个表或者多个表当中查询出一些字段然后把这些字段又要插入到另一个表当中的时候,可以用insert …..select语法;Insert into testt(name) (select name from test where id=4);从文件中读取行插入数据表中,可以用Load data infile语句;Load data infile …test.txt? into table test;可以用Describe语法进行获取有关列的信息;Describe test;//可以查看test表的所有信息,包括对应列字段的数据类型等;MySql事务处理相关语法;开始一项新的事务:start transaction或者begin transaction 提交事务:commit事务回滚:rollbackset autocommit true|false 语句可以禁用或启用默认的autocommit模式,只可用于当前连接; 例子:Start transaction;Update person set name=?LJB? where id=1;Commit | rollback;数据库管理语句修改用户密码:以root用户为例,则可以写成下面的;mysql –u root –p 旧密码–password 新密码Mysql –u root –password 123;//将root用户的密码修改成123,由于root 用户开始的时候,是没有密码的,所以-p旧密码就省略了;例如修改一个有密码的用户密码:mysql –u ltx –p 123 –password 456;增加一个用户test1,密码为abc,让他可以在任何时候主机上登陆,并对所有数据库有查询、插入、修改、删除的权限。
燕十八公益讲堂mysql.ppt
zixue.it 燕十八 精品PHP教程
2:mysql连接
mysql服务器
MySQL客户端
mysql是服务器, 因此,满足myqsl 通信规范 的工具都可以 做客户端
zixue.it 燕十八 精品PHP教程
3:入门语句
1.连接服务器 2.查看所有库 3.创建库 4.删除库 5.选择数据库 6.查看表 7.创建简单表 8.删除表 9.改表名 10.清空表
5.1.4 浮点型与定点型
float(M,D) decimal(M,D) 6,2
M: 精度 (总位数,不包含点) D: 标度 (小数位)
float M<=24时占4个字节,大于时占8个 decimal的存储空间变长,注意范围不要选 过大
float:浮点型 decimal:定点型 decimal更精确
zixue.it 燕十八 精品PHP教程
5:详解列类型 之3大列类型
1.数值型(整型列,浮点型列). 2.字符型列 3.日期/时间类型
zixue.it 燕十八 精品PHP教程
5.1.1 整型列存储范围与所占空间
zixue.it 燕十八 精品PHP教程
5.1.2 整型列的可选属性
tinyint(M) unsigned zerofill
delete from 表名 where expr
你要删哪张表的数据? 你要删掉哪些行?
zixue.it 燕十八 精品PHP教程
4.5 增删改查 之查 select 语法
√ √ √
select 列1,列2,..列n from 表名 where expr
查哪张表的数据? 你要选择哪些列来查询? 要选择哪些行?
zixue.it 燕十八 精品PHP教程
MySQL数据库知识点整理
MySQL数据库知识点整理1. Mysql 的存储引擎,myisam和innodb的区别?数据表类型有哪些?答:主要区别: 1)InnoDB⽀持事务,MyISAM不⽀持,对于InnoDB每⼀条SQL语⾔都默认封装成事务,⾃动提交,这样会影响速度,所以最好把多条SQL语⾔放在begin和commit之间,组成⼀个事务; 2)InnoDB⽀持外键,⽽MyISAM不⽀持。
对⼀个包含外键的InnoDB表转为MYISAM会失败; 3) InnoDB是聚集索引,数据⽂件是和索引绑在⼀起的,必须要有主键,通过主键索引效率很⾼。
但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。
因此,主键不应该过⼤,因为主键太⼤,其他索引也都会很⼤。
⽽MyISAM是⾮聚集索引,数据⽂件是分离的,索引保存的是数据⽂件的指针。
主键索引和辅助索引是独⽴的。
4) InnoDB不保存表的具体⾏数,执⾏select count(*) from table时需要全表扫描。
⽽MyISAM⽤⼀个变量保存了整个表的⾏数,执⾏上述语句时只需要读出该变量即可,速度很快; 5)Innodb不⽀持全⽂索引,⽽MyISAM⽀持全⽂索引,查询效率上MyISAM要⾼;概括总结:MyISAM 是⾮事务的存储引擎,适合⽤于频繁查询的应⽤。
表锁,不会出现死锁,适合⼩数据,⼩并发。
innodb是⽀持事务的存储引擎,合于插⼊和更新操作⽐较多的应⽤,设计合理的话是⾏锁(最⼤区别就在锁的级别上),适合⼤数据,⼤并发。
数据表类型有:MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等。
MyISAM:成熟、稳定、易于管理,快速读取。
⼀些功能不⽀持(事务等),表级锁。
InnoDB:⽀持事务、外键等特性、数据⾏锁定。
空间占⽤⼤,不⽀持全⽂索引等。
应⽤场景: 1).MyISAM管理⾮事务表。
它提供⾼速存储和检索,以及全⽂搜索能⼒。
如果应⽤中需要执⾏⼤量的SELECT查询,那么MyISAM是更好的选择。
mysql基础知识笔记总结
mysql基础知识笔记总结创建数据库在与数据进⾏任何其他操作之前,需要创建⼀个数据库。
数据库是数据的容器。
它可以⽤于存储联系⼈,供应商,客户或任何想存储的数据。
在MySQL中,数据库是⽤于存储和操作诸如表,数据库视图,触发器,存储过程等数据的对象的集合。
要在MySQL中创建数据库,请使⽤CREATE DATABASE语句,如下:CREATE DATABASE [IF NOT EXISTS] database_name;SQL我们来更详细地看看CREATE DATABASE语句:CREATE DATABASE语句的后⾯是要创建的数据库名称。
建议数据库名称尽可能是有意义和具有⼀定的描述性。
IF NOT EXISTS是语句的可选⼦句。
IF NOT EXISTS⼦句可防⽌创建数据库服务器中已存在的新数据库的错误。
不能在MySQL数据库服务器中具有相同名称的数据库。
例如,要创建⼀个名称为mytestdb数据库,可以执⾏CREATE DATABASE语句后接数据库名称:mytestdb,如果当前MySQL服务器中没有数据库:mytestdb,则创建成功,如下所⽰:CREATE DATABASE IF NOT EXISTS mytestdb;SQL执⾏此语句后,MySQL返回⼀条消息,通知新数据库是否已成功创建。
显⽰数据库SHOW DATABASES语句显⽰MySQL数据库服务器中的所有数据库。
您可以使⽤SHOW DATABASES语句来查看您要创建的数据库,或者在创建新数据库之前查看数据库服务器上的所有数据库,例如:+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || testdb || yiibaidb |+--------------------+5 rows in set在此MySQL数据库服务器中有6个数据库。
数据库入门培训教程Mysql学习笔记(三)对表数据的增删改查
数据库入门培训教程Mysql学习笔记(三)对表数据的增删改查这一部分是最简单的,也是最麻烦的。
简单是因为其实只包括增删该插四个部分。
大体上看,增加数据、删除数据、修改数据、查询数据都不麻烦啊,我们日常都是常用的。
这个谁不会呢以前在培训机构学myql的时候,我就知道,程序员的成长路程上的一个瓶颈就在于数据库。
如何书写高维护性的ql语句,如何能保持高维护性的同时又保持执行的高效率,这是个难题。
我最近在做一个比较棘手的项目,常常leftjoin5~6张表,扫表10几万,查询速度慢的惊人。
10几万还仅仅是测试数据,等真正的项目上线,数据量可能会达到百万级别。
因此低效率的myql语句,可能程序直接就崩溃了。
因此关于数据这部分的增删改插是最难的,也是至关重要的,一定要学好。
但我们今天仅仅书写最简单的增删该插,后面的博客将会持续深入的去整理相关方面的知识。
增加数据:inertinto表名(字段1,字段2,字段3,字段n)value(值1,值2,值3,值4);这个比较简单。
这是一条通用语句。
可以值inet一条数据,也是inert多条数据。
这个在《Myql学习笔记(二)对表结构的增删改查》的测试ql里面有。
可以参考一下,这里就不重复贴代码了。
注意事项:向char、varchar、te某t以及日期型的字段插入时,字段值要用单引号括起来。
向默认值约束字段插入数据时,字段值可以使用default关键字,表示插入的是该字段的默认值。
插入新纪录时,需要注意表之间的外键约束关系,原则上先给父表插入数据,然后给子表插入数据。
删除数据:删除数据是比较危险的操作,平时在开发测试阶段,可能会用到,但是到了真正的项目上线阶段,是不会有delete权限的。
语法:deletefrom表名where条件;deletefromclaewherecla_no=53;(可以继续用《Myql学习笔记(二)对表结构的增删改查》中的测试ql);强调一句,删除数据与修改数据,不加条件都是臭流氓。
mysql课本习题答案
mysql课本习题答案《MySQL课本习题答案》在学习MySQL数据库课程时,练习题是非常重要的一部分。
通过完成课本习题,我们可以更好地掌握数据库的基本知识和技能。
下面将为大家提供一些MySQL课本习题的答案,希望能帮助大家更好地理解和掌握数据库知识。
1. 创建一个名为“students”的表,包括学生的ID、姓名、性别和年龄字段。
答案:```sqlCREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(50),gender VARCHAR(10),age INT);```2. 向“students”表中插入一条记录,学生ID为1001,姓名为“张三”,性别为“男”,年龄为20岁。
答案:```sqlINSERT INTO students (id, name, gender, age)VALUES (1001, '张三', '男', 20);```3. 更新“students”表中学生ID为1001的记录,将姓名改为“李四”。
答案:```sqlUPDATE studentsSET name = '李四'WHERE id = 1001;```4. 删除“students”表中学生ID为1001的记录。
答案:```sqlDELETE FROM studentsWHERE id = 1001;```通过以上习题的答案,我们可以看到在MySQL数据库中,通过简单的SQL语句就可以完成对表的创建、插入、更新和删除操作。
这些基本的操作是我们在日常工作中经常会用到的,因此掌握好这些知识是非常重要的。
希望以上MySQL课本习题的答案能够帮助大家更好地理解和掌握数据库知识,也希望大家能够在学习过程中多多练习,加深对数据库的理解和应用能力。
MySQL实战45讲(学习笔记)
MySQL实战45讲(学习笔记)本系列是学习极客时间林晓斌的《MySQL实战45讲》系列的学习笔记。
原⽂链接:https:///column/intro/13901 基础架构:⼀条SQL查询语句是如何执⾏的?https:///fengfeng2861285642/article/details/85131474https:///u014737928/article/details/85060991https:///u012131610/article/details/9005153502 ⽇志系统:⼀条SQL更新语句是如何执⾏的?https:///fengfeng2861285642/article/details/85712388https:///u014737928/article/details/85062279https:///u012131610/article/details/9005278703 事务隔离:为什么改了还看不见?https:///u014737928/article/details/99731828https:///u012131610/article/details/9016857804 深⼊浅出索引(上)https:///u012131610/article/details/9017404105 深⼊浅出索引(下)https:///u012131610/article/details/9017695306 全局锁和表锁:给表加个字段怎么有这么多阻碍?https:///u012131610/article/details/9019993807 ⾏锁功过:怎么减少⾏锁对性能的影响?https:///u012131610/article/details/9020891308 事务到底是隔离的还是不隔离的?https:///u012131610/article/details/9022900309 普通索引和唯⼀索引,应该怎么选择?https:///u012131610/article/details/9026055810 MySQL为什么有时候会选错索引?https:///u012131610/article/details/9027003111 怎么给字符串字段加索引?https:///u012131610/article/details/9039965212 为什么我的MySQL会“抖”⼀下?https:///u012131610/article/details/9043686713 为什么表数据删掉⼀半,表⽂件⼤⼩不变?https:///u012131610/article/details/9059947714 count(*)这么慢,该怎么办?https:///u012131610/article/details/9063344215 答疑⽂章(⼀):⽇志和索引相关问题https:///u012131610/article/details/9256390816 “order by”是怎么⼯作的?https:///u012131610/article/details/9071048517 如何正确地显⽰随机消息?https:///u012131610/article/details/9074652218 为什么这些SQL语句逻辑相同,性能却差异巨⼤?https:///u012131610/article/details/9103878919 为什么只查⼀⾏的语句,也执⾏这么慢?https:///u012131610/article/details/9141115220 幻读是什么,幻读有什么问题?https:///u012131610/article/details/9148902321 为什么我只改⼀⾏的语句,锁这么多?https:///u012131610/article/details/9178131722 MySQL有哪些“饮鸩⽌渴”提⾼性能的⽅法?https:///u012131610/article/details/9296907423 MySQL是怎么保证数据不丢的?https:///u012131610/article/details/9993657224 MySQL是怎么保证主备⼀致的?https:///u012131610/article/details/10000775225 MySQL是怎么保证⾼可⽤的?https:///u012131610/article/details/10003019226 备库为什么会延迟好⼏个⼩时https:///u012131610/article/details/100090270 27 主库出问题了,从库怎么办?https:///u012131610/article/details/100112609 28 读写分离有哪些坑https:///u012131610/article/details/100112952 29 如何判断⼀个数据库是不是出问题?https:///u012131610/article/details/100113348 30 答疑⽂章(⼆):⽤动态的观点看加锁https:///u012131610/article/details/100129983 31 误删数据后除了跑路,还能怎么办?https:///u012131610/article/details/100130039 32 为什么还有kill不掉的语句?https:///u012131610/article/details/100130460 33 查这么多数据,会不会把数据库内存撑爆?https:///u012131610/article/details/97107364 34 到底可不可以使⽤join?https:///u012131610/article/details/93158401 35 join语句怎么优化https:///u012131610/article/details/97240601 36 为什么临时表可以重名https:///u012131610/article/details/97757120 37 什么时候会使⽤内部临时表https:///u012131610/article/details/97884757 38 都说InnoDB好,那还要不要使⽤Memory引擎https:///u012131610/article/details/98028479 39 ⾃增主键为什么不是连续的?https:///u012131610/article/details/98168871 40 insert语句的锁为什么这么多?https:///u012131610/article/details/98937622 41 怎么最快的复制⼀张表https:///u012131610/article/details/99406030 42 grant之后要跟着flsh privileges吗?https:///u012131610/article/details/99539832 43 要不要使⽤分区表https:///u012131610/article/details/99620613 44 答疑(三)https:///u012131610/article/details/99670766 45 ⾃增id⽤完了怎么办?https:///u012131610/article/details/99714097《MySQL实战45讲》1~15讲https:///zxcc1314/article/details/84842650《MySQL实战45讲》16~30讲https:///zxcc1314/article/details/85216128《MySQL实战45讲》31~45讲https:///zxcc1314/article/details/88087028。
mysql数据库基础知识笔记
MySQL是一种关系型数据库管理系统,它使用结构化查询语言(SQL)来进行数据管理和查询。
以下是MySQL数据库的基础知识笔记:
数据库:一组相关数据的集合。
表:存储在数据库中的数据组织形式。
列:表中的一个字段,定义了该列所存储的数据类型。
行:表中的一条记录,由多个列组成。
主键:唯一标识表中每一行的特定列。
外键:一个表中的列,与另一个表中的主键建立连接关系,用于保证数据完整性和减少数据冗余。
索引:为了提高查询效率而创建的数据结构,可以根据索引快速搜索和查找数据。
关系型数据库:以表格形式存储数据,通过关联不同表之间的主键和外键来建立关系。
非关系型数据库:将数据以文档、键值对或图形等方式存储,适用于分布式、非结构化数据场景。
SQL语句:用于对MySQL数据库进行查询、插入、更新和删除操作的编程语言,包括SELECT、INSERT、UPDATE、DELETE等命令。
Mysqlsql语句自动拼接方法
<?php/*燕⼗⼋公益PHP培训课堂地址:YY频道88354001学习社区:www.zixue.it */class Mysql{//拼接sql语句public function autoExecute($data='',$table,$mode = "insert",$where = "where 1 limit 1"){//insert 和 update 语句需要传⼊数组判断if(is_array($data)){//Update语句的拼接if($mode == "update"){$sql="update $table set ";foreach($data as$key=>$val){$sql.=$key ." = "."'$val'".',';}//循环后语句是$sql updata $table set filed1 = value1,filed2=value2,filed3=values3,$sql=substr(trim($sql),0,-1).' '.$where;//先将sql语句的⾸位空格去掉,然后将后⾯的','给去掉拼接$where条件return$this->query($sql);}//insert 语句的拼接,默认是insert$sql = $mode . " into ".$table ." ( " . implode(',',array_keys($data));$sql.=" ) value "."('".implode("','",array_values($data))."')";return$this->query($sql);}else{//delete 语句的拼接//当语句为delete时候,此时$data传⼊是表名,$table传⼊的是delete $mode传⼊是where条件if($table = 'delete'){$sql="delete from ".$data.' '.$mode;$this->query($sql);return$this->affected_rows();}else{return false;}}}//query⽅法public function query($sql){$res = mysql_query($sql);return$res;}}//+++++++++++++++⾃动拼接sql语句使⽤⽅法+++++++++++++++++++//$mysql = new Mysql();//insert 语句$data=array('username'=>'demo','password'=>'admin');$mysql->autoExecute($data,'user表');//updata 语句$where = "where id > 10;";$mysql->autoExecute($data,'user表','update',$where);//delete 语句$mysql->autoExecute('user表','delete',$where);。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Mysql 三大列类型1. 数值型整型Tinyint 、Smallint、Mediumint 、Int、Bigint小数型Float(D,M),Decimal(D,M)2. 字符串型Char(M)Varchar(M)Text 文本类型3. 日期时间类型Date 日期Time 时间Datetime 时间类型Year年类型一.整型列的字节与存储范围从数学上讨论tinyint ,建表时既能足够存放,又不浪费空间。
即:(1). 占据空间(2). 存储范围通过占用字节和所存范围分关系合理的选择类型例:Tinyint经测试,Tinyint 的默认为有符号-128~127之间,当越界时自动取相应 的边界值。
若要存0~255无符号时:列的可选属性:Tinyin t (M ) un sig ned zerofill.M :宽度(在0填充的时候才有意义)Un sig ned:无符号类型(非负),影响存储范围 Zerofill :0填充(默认无符号)1> insert into test-> (name,age3)-> ualu&s->「赵六'/S');u QIC, 1 row aff©et&d (0.00 soc)箕from t&st;I id I name I age I agel I age2 I age3 I卜--------- + ------------- + --------------- + -------------- + --------------- + ----------------- +rows in at (0.07 SEC)列可以声明默认值,而且推荐声明默认值not null default 0; ysql> alter table test add tinyint(3j not null default 0;uery 0IC, 9 rows affected (0.13 $ec)ecords: 9 Duplicates: 0 Uarnings: O小数型/浮点型、定点型Float(M,D):M代表总位数,D代表小数位(6,2)为例:-9999.99 ->9999.99 12345G789一一一一张张张张李张李王制LLuNi NULLLLuNLLJNI NULL NULLLLuN三四三四五六6NULL NULL I NULL ILLuNNULL | 2G0 | NULL | NULL !NULL I 0 I NULL I NULL |NULL I NULL I 127 I NULL Iy$ql> t M from 七。
兮七;------ - -------------------------- + ----- ------I id I name I age I agel I age2 I age3 I age4 II 25 I NULL I I 127 INULL II -128 I NULL I I 127 INULL II -100 | NULL I I NULLI 200 II NULL I 0 I I NULL INULL II NULL I NULL INULL I NULL I NULLI NULL I NULL INULL I NULL I NULLI NULL I NULL INULL I NULL I NULLI NULL I127 I NULL I NULL I00005 INULL I 06305 I123456T89三三三_:一四三四五六张张张张李张李王赵Decimal(D,M):忙瀨宽度” 芳顶UA 毎煦字再孟网小说2押呱左右』Char :定长,char (M ),M 代表宽度,即:可容纳的字符数 0<二M<=255 Varchar :变长,0<二M<=65535约2W —6W 个字符受字符集影响) Text 文本串,(约2W —6W 个字符受字符集影响)区别在哪呢?char 定长:M 个字符,如果存的小于 M 个字符,实占M 个字符 varchar : M 个字符,存的小于 M 个字符,设为 N , N<M ,实占N 个字符I Null I Key I Default I Extra I+ ------------------- + ----------------- + ------------------------------ + ------------------------ 4I nam^ I varthar(10) I NO I price I floatfG,2) I NO I bigprice I decimal(9?2) I NO IdecipriceI decimal(9,2)I NOI 0.00I 6.06 I 0,0G4 row© in set (0.01 see)my$ql> insert into t©st2-> (name,bigprice ,decipric^) -> glues-> (■自行车 * , 11234567.23' , ' 1 23H567.23 ");Query OK, 1 row affected (0.0G sec) mysql> select 箕 FROM test2; I name I 自行车I price I bigprice I deciprice It ------------------- + --------------------------------- H -------- -------- - -------------- +I o.00 I 1I23H567.23 I 123«67.23 I1 row in set (G.00 G @C )字符型列myoql> d&oc test2; I Field粪韭0 0\D\0<(™ (血r塑如畢不髒M'l'■学7?内莖用空培补齐)因此,char定长若存空格,读取时会丢失。
而变长不会^HiChar利用率小于等于100%,而varchar永远小于100%, 1-2个字节用于标志实存字符长度。
Char(M)如何占据M个字符宽度?答:如果实际存储内容不足M个,贝S后面加空格补齐,取出来的时候再把后面的空格去掉,(所以如果内容后面有空格,将会被清除)选择原则:1. 空间利用效率(M固定选Char)2. 速度速度上:定长速度快些,四. 日期时间列类型忙瀨宽度”芳顶UA毎煦字再孟网小说2押呱左右』Date日期Time时间Datatime 时间类型Year年类型1. Year类型:1个字节表示1901-2155年【0000年表示错误时】如果输入两位,“ 00--69”表示2000—2069,如果输入两位“ 70--99”表示1970—1999如果记得麻烦,输入四位就行了、2. Date类型:典型格式,1992-08-12 1000-01-01' ‘9999-12-313. Time类型,典型格式hh:mm:ss -838:59:59’ ‘+838:59:59’4. Datetime 典型格式:'989-05-06 12:23:34'‘000-01-01 00:00:00' 9999-12-31 23:59:59'、卜 \ 、、八注意:在开发中很少使用日期时间类型来表示一个需要精确到秒的列,原因:虽然日期时间类型能够精确到秒,而且方便查看。
但是计算不便。
用时间戳来表示。
面试1:当表示性别时,可用1或0表示男女,如,可能会问到为什么不用enum枚举,原因:enum不符合关系型数据库设计理念,而且字节上不比tinyint少。
实例:增删改查之案例过程分析用户注册表单收集,提交数据,注册页面收集到表单的数据后,形成insert语句,user表插入该条数据,用户注册完成前台用户中心,用户新昵称,根据新昵称和用户id,形成update语句,完成昵称修改管理后台点击会员列表,此时,网页形成select语句,查询出所有会员的数据,完成会员的查看管理员后台选中某用户并且删除,捕捉此用户的id,根据用户id形成相应的delete语句执行delete语句,完成用户的删除阶段总结(一)列类型的概念数值型整型tinyint smallint mediumint int bigint整型的unsigned代表无符号,zerofill代表0填充,M代表宽度(在0填充)浮点型/定点型float(M,D) unsigned M 精度,即总位数,D 代表小数位decimal比float更精确。
字符型Char(M)定长,可存储的字符数,M<=255Varchar(M)变长,可存储的字节数,M<=65535Char与varchar的不同点Char(M),实占M个字符,不够M个右侧补空格,取出时,在去除右侧空格,导致右侧真有空格时会丢失。
Varchar(M),有1-2 个字节来标记真实的长度,日期时间型Year 1901-2155,如果输2位,‘00-69'之间+2000,‘70-99'之间+1900Date YYYY-M M-D D范围在1000-01-01 9999-12-31Time HH :ii:ss 范围在-838:59:59 838:59:59Datetime YY-MM-DD HH:ii:ss 1000-01-01 00:00:00 9999-12-31 23:59:59开发中的一个问题—精确到秒的时间表示方式,不是用datetime,而是用int来表示时间戳用时间戳方便计算,而且方便格式化成不同的显示样式。
建表语句Create table 表明(列名称,列类型[列属性][默认值],)engine 引擎名charset 字符集增:insert答:往哪张表增,增那几列,各为什么值?Insert into 表名(列1,列2,..列N)Values(值1,值 2..值N)** 如果不声明插入的列,则默认插入所有列。
改:update答:修改哪张表,修改那几列,修改成什么值?在哪几行上生效?Update 表名Set列1 = 值1,列2 = 值2,列N =值NWhere 表达式;删:delete删除哪张表的数据,删除哪些行?Delete from 表名Where 表达式查:select * from 表名查询的五种语句:where,group,having,order by,limit 一.Where 条件查询比较运算符1. In <值1,值2,值3…..值N>,等于1 N任意一个。