DB(database):数据库,存储数据的仓库,保存了一系列有组织的数据
DBMS:数据库管理系统,数控库是通过DBMS创建和操作的容器
DDL:用来定义创建数据库对象,数据库、表、列(creat,alter,drop)
DML:用来对数据库中表的记录进行更新(insert ,delete,update)
DQL:用来查询查询数据库中表的记录(select)
DCL:用来定义数据库的访问权限和安全级别、创建用户
启动mysql服务 | net start mysql |
关闭mysql服务 | net stop mysql |
登录数据库 | mysql -u(用户名) root -p(用户密码) mysql -h(主机名) -p(端口号) -u(用户名) -p(密码) ---这是连接远程服务器 |
退出登录 | exit或ctrl+c |
查看数据库版本 | select version(); |
创建数据库 | create database 数据库名; |
查看数据库 | show databases; |
查看某个数据库的定义信息 | show create database 数据库名; |
删除某个数据库 | drop database 数据库名; |
使用或切换某个数据库 | use 数据库名; -- user的表,它包含所有用户的账号 |
查看当前库的所有表 | show tables; |
查看其他库的所有表 | show tables from 库名; |
查询表结构 | desc 表名; |
查看当前正在使用的数据 | select database(): |
查看服务器版本 | mysql -V(直接在cmd查询) |
管理用户:添加用户 | create user '用户名'@'主机名' identified by '密码'; |
管理用户:删除用户 | drop user '用户名'@'主机名’; |
修改用户密码: | update user set password =password('新密码') where user ='用户名'; |
权限管理:查询权限 | show grants for '用户名'@'主机名'; |
授予权限 | grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'; |
撤销权限 | revoke 权限列表 on 数据库名.表名 from'用户名'@'主机名'; --grant和revoke,控制访问权限整个服务器,使用 grant/revoke all 控制整个数据库,on database.* |
sql运行顺序:select子句最后运行,其他子句按照书写顺序运行。先查找属于张表、条件、显示语句
workbench中注释:单行注释 '#'或'-- '、多行注释 /*....*/
功能 | 语句 | 备注 |
创建表 (create) | create table 表名( 列名1 数据类型(长度)约束, #id int(10 ) primary key,id名称,其中primary key为唯一主键 列名2 数据类型, ... 列名n 数据类型); | 如果仅想在一个表不存在的时创建它,应该在表名后给出 if not exists 为创建由多个列组成的主键,应该在‘primary key’中由逗号分隔 auto_increment:自增长,并且每个表只允许一个存在,而且它必须被索引(如,通过使它成为主键) 引擎类型:engine=innoDB(默认引擎),engine=mylsam,engine=memory(引擎区别) innoDB:是一个可靠的事务处理引擎 memory:在功能上等同于myisam,但由于数据存在内存中,速度快 myisam:是一个性能极高的引擎,支持全文本搜索,不支持事务处理 |
修改表 (alter) | 1、alter table 表名 add 列名 类型(长度)约束;-----------增加一个字段 eg: alter table student add sdec varchar(20); 2、alter table 表名 modify 列名 类型(长度)约束;------------修改表修改列的类型 eg: alter table sort modify sname varchar(50) not null; 3、alter table 表名 change 旧列名 新列名 类型(长度)约束;---------------修改表修改列名 eg: alter table sort change sname snamename varchar(30); 4、alter table 表名 drop 列名;----------------修改表删除列 eg: alter table sort drop sname; 5、rename table 表名1 to 表名2;----------------------重命名表 eg:rename table sort to test; 6、alter table 表名 character set 字符集;--------------修改表的字符集 eg: alter table test character set sort; | alter table语句,是更改表结构 使用alter table时,需要给出更改的表名、所做更改的列表 alter table一种常见用途是定义外键 |
删除表 | 删除表:drop table 表名; | drop、truncate、delete的区别 |
插入语句 | 1、insert into 表名 values (列值1,列值2,列值3...); 2、insert into 表名 (列名1,列名2...) values (列值1,列值2...); 3、insert into 表名 (列值1,列值2,列值3...), (列值1,列值2,列值3...), (列值1,列值2,列值3...); | |
插入检索出 的数据 | eg: insert into customer( cust_id,cust_contact,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country) select cust_id,cust_contact,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country from custnew; | 可以利用它将一条select语句的而己过插入表中。 |
查询语句1 | 1、select * from 表名; 2、select 列名1,列名2,列名3... from 表名; 3、select */列名 from 表名 order by 列名 asc/desc; 4、select */列名 from 表名 order by 列名1 asc/desc,列名2 asc/desc; 5、select */列名 from 表名 where 条件; | order by where group by having |
查询语句2 | 1、select 列名/聚合函数 from 表名 where 条件 group by 列名 order by 列名/别名/聚合函数 asc/desc; 2、select 列名/聚合函数 from 表名 where 条件 group by 列名 having 子句 order by 列名/别名/聚合函数 asc/desc; 3、select * /列名 from 表名 limit(偏移量);-->限制查询结果的记录条数 4、select * /列名 from 表名 limit 数据1,数据2; | 1、limit使用时,必须位于 order by 之后 2、order by 必须位于 where之后 3、 (limit 数据1,数据2) --> 还有另外一种用法,如下: limit 数据1 offset 数据2 |
只查询不同的值 distinct | select distinct 列值 from 表名; select distinct 列值1,列值2... from 表名------distinct用在多列,会将列组合,当组合的数据重复的数据删除 | 只能在select中使用、不能过滤null 只能用于count(),不能用于count(*) |
空值检查 | select */列名 from 表名 where 列名 is null ; ifnull(字段,0): 判断某字段或表达式是否为null,如果为null,返回指定的值,否则返回原本的值 isnull(字段): 判断某字段或表达式是否为null,如果是,则返回1,否则返回0 | null(无值),任何值与null联用,都为null is null 为空值 is not null 不为空值 |
数据过滤 | and、or 例子:select 列名1,列名2 from 表名 where (列名1=数值1 or 列名1=数值2)and 列名2=数值3; | and、or一起使用时,优先计算的是and |
in 操作符 | select */列名 from 表名 where 列名 not in/in(数据1,数据2...) order by 列名/别名/聚合函数 asc/desc; | in 操作符的功能与 or操作符功能一样 in 用户查询同一个列的多个列值,等价于多个or |
like通配符 | like代指模糊查询 例子:select */列名 from 表名 where 列名 like '%1%'; | %(百分号通配符):表示任何字符出现任意次数 __(下划线通配符):只匹配单个字符 转义符 |
正则表达式 | 关键字:regexp eg: select 列名 from 表名 where 列名 regexp '1000' order by 列名; 语法:regexp '列值1 | 列值2' (与or语句类似) regexp '[ ] ton' (另一种形式的or语句) regexp '[a-z] ton' (匹配任意字母字符) regexp' \\'(匹配特殊字符):\\- 表示查找- 、\\. 表示查找. ...等等 | 正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较 正则表达式不区分大小写,可使用’binary‘作为关键字 (eg: where name regexd binary'jatTD.0') 注意:like匹配的是整个串,regexp匹配的是子串 |
创建计算字段 | 计算字段:是运行时在select语句内建立的 拼接字段:concat(列名1,列名2...) 例子1:select concat(列名1,列名2...)from 表名 order by 列名; 例子2:select concat(列名1,列名2...) as 别名 from 表名; 删除空格:rtrim(列名/字符串) 使用别名: 1、as:为表取别名 (表名 as 别名)、为列取别名(列名 as 列别名) 2、空格:直接在表/列名,空格后增加别名;= 在sql中能行 算术运算符:+、-、*、/(与空值null运算,结果还是空值) | concat:在select语句中,使用该函数来拼接两个列(mysql使用) mysql支持:rtrim(删除数据右侧多余空格来整理数据)、ltrim(左)、trim(左右),并且格式一样 |
运算符 | 比较运算符:=、<>、>、<、!=、>=、<= 逻辑运算符:not、and、between...and、or、in | between ...and 不要任意调换顺序 |
文本处理函数 | upper、lower、replace替代 left、right、length、locate soundex substring(参数1,参数2,参数3):参数1(要截取的列或字符串)、参数2(如果为正数则表示从1开始,根据整数位置开始往后截取,如果为负数,则表示从倒数第几个开始截取)、参数3(要截取的字符的个数) | upper():将文本转成大写 length():返回串的长度 locate():找出串的一个子串 lower():将串转换成小写 soundex():返回串的soundex值 substring():返回串的字符,截取并返回 instr():返回子串第一次出现的索引,如果找不到则返回0 left/right():返回串左/右侧的字符 |
日期和时间处理函数 | adddate(): 增加一个日期(天、周等) addtime(): 增加一个时间(时、分等) curdate(): 返回当前日期 curtime(): 返回当前时间 date(): 返回日期时间的日期部分 datediff(): 计算两个日期之差 date_add(): 高度灵活的日期运算函数 date_format(): 返回一个格式化的日期或时间串 day(): 返回一个日期的天数部分 dayofweek(): 对于一个日期,返回对应的星期几 hour(): 返回一个时间的小时部分 minute(): 返回一个时间的分钟部分 month(): 返回一个时间的月份部分 now(): 返回当前的日和时间 second(): 返回一个时间的秒部分 time(): 返回一个日期时间的时间部分 year(): 返回一个日期时间的年份部分 | 例子:select 列名1,列名2... from 表名 where date(列名)='2002-11-12'; 例子:select 列名1,列名2... from 表名 where date(列名) between '2000-11-11'and '2002-11-11'; 查询年龄(精确到月份):timestampdiff(month,出生日期,now())/12 |
数值处理函数 | abs(): 返回一个数的绝对值 cos(): 返回一个角度的余弦 exp(): 返回一个数的指数值 mod(): 返回除操作的余数 pi(): 返回圆周率 rand(): 返回一个随机数 sin(): 返回一个角度的正弦 sqrt(): 返回一个数的平方根 tan(): 返回一个角度的正切 | |
聚集函数 | avg(): 返回某列的平均值 count(): 返回某列的行数 max(): 返回某列的最大值 min(): 返回某列的最小值 sum(): 返回某列之和 | 例子:select avg(列名) as 别名 from 表名 count(*):对表中行的数目进行计算,不管表中的列时空值还是非空值 count(列名):对特定列中的行进行计数 |
汇合数据 | 聚集不同值:对于聚集函数中,对所有的行执行计算;只包含不同的值,指定distinct 组合聚集函数:涉及多个聚集函数 | 取别名:在指定别名以包含某个聚集函数的结果时,不建议使用表中的实际列名 |
数据分组 (group by) | 1.子句可以包含任意数目的列 2.如果在group by子句中嵌套了分组,数据将在最后规定的分组上进行汇总 3.列出的每个列都必须时检索列或有效表达式(不能是聚集函数) | 1.group by 位于 where 之后,order by之间 2.使用rollup、with rollup的关键字,可以得到每个分组以及每个分组汇总级别(针对每个分组)的值 |
过滤分组 (having) | 过滤的是基于分组聚集值而不是特定行值的 | where 条件不能在分组后使用 where过滤的是指定行而不是分组 |
分组和排序 (区别看右侧) | order by 1.排序的产生的输出 2.任意列都可以使用(甚至非选择的列也可以使用) 3.不一定需要 | group by 1.分组行,但输出的可能不是分组的顺序 2.只可以使用选择的列或表达式列,而且必须使用每个选择列表达式 3.如果与聚集函数一起使用列(或表达式),则必须使用 |
select子句顺序 | 子句 说明 是否必须使用 select 要返回的列或表达式 是 from 从中检索数据的表 仅在从表选择数据时使用 where 行级过滤 否 group by 分组说明 仅在按组计算聚集时使用 having 组级过滤 否 order by 输出排序顺序 否 limit 要检索的行数 否 | |
子查询 | 相关子查询:涉及到外部查询的子查询,任何时候只要列名可能在多个表存在,就必须使用语法(表名.列名) 例子:select one_name,one_state( select count(*) from two where one.one_id= two.two_id) as two from one order by one_name | 子查询:即嵌套在其他查询中的查询,查询时时从里向外查询,对于能嵌套的子查询数据没有限制,但为了性能不能嵌套太多 |
联结表 | 联结时一种机制,用来在一条select语句中关联表,使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行 内部联结:目前为止所用的联结称为‘等值联结’,它基于两个表之间的相等测试。并且使用‘inner join’,在使用这种语法的时候,联结条件使用‘on’ eg: select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id=products.vend_id; 联结多个表:可以联结的表的数目没有限制,并且规则也基本相同,首先列出所有表,然后定义表之间的关系 | 联结表时应保证所有联结都有where子句,否则mysql将返回比想要的数据多得多的数据 联结多个表例子:select prod_name,vend_name,prod_price,quantity from orderitems,products,vendors where products.vend_id=vendors.vend_id and orderitems.prod_id=products.prod_id and order_num='2005'; |
高级联结1 | 自联结:通常作为外部语句来替代从相同表中检索数据时使用的子查询语句。 自然联结:标准联结返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。 外部联结:许多联结将一个表中的行与另一个表中的行相关联,但有时候会需要包含没有关联行的那些行。‘outer join’,联结条件使用‘on’ eg:select customers.cust_id,orders.order_num from customers left/right outer join orders on customers.cust_id =orders.cust_id; | 别名除了用于列名和计算字段外,还允许给表起别名。 表别名只在查询执行中使用 在使用‘outer join’语法时,必须使用‘right’或‘left’关键字指定包括起所有行的表 |
高级联结2 | 使用联结和联结条件 1.注意所使用的联结类型 2.保证使用正确的联结条件,否则将返回不正确的数据 3.应该总是提供联结条件,否则会出现笛卡儿积 4.在一个联结中可以包含多个表 | case、排名函数 |
组合查询1 | union:可以用‘union’操作符来组合数条sql查询,使用方式(在各条语句之间放上关键字union) 1.union必须由两条或两条以上的select组成,语句之间用关键字union分割 2.union中的每个查询必须包含相同的列、表达式或聚集函数 3.列数据类型必须兼容,类型不必完全相同,但必须时dbms可以隐含的转换的类型 格式:select查询语句 union select查询语句 union 查询语句.... | 组合查询使用前提: 1.在单个查询中从不同表返回类似结构的数据 2.对单个表执行多个查询,按单个查询返回数据 在使用union时,不取消重复的行时,使用‘union all’ |
组合查询-排序 | select语句输出用order by子句排序,在用union组合查询时,只能使用一条order by子句,必须出现在最后一条select语句之后 | |
索引 | 索引用于快速找出在某个列中有一特定值的行,不使用索引,mysql必须从第一条开始读完整个表,直到找出相关的行。如果表中有一个索引,mysql能够快速到达一个位置去搜索数据文件 索引的存储类型:btree、hash myisam和innodb存储引擎:只支持btree索引 ,也就是默认使用btree memory和heap存储引擎:支持btree、hash 1、单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引 1.1普通索引(index):mysql中基本索引类型,没有限制,允许在定义索引的列中插入重复值和空值 1.2唯一索引(unique idex一般写成 unique key):索引列中的值必须是唯一的,但允许为空值 1.3主键索引:是一种特殊的唯一索引,不允许有空值 2、组合索引:在表中多个字段组合上创建索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合 3、全文索引:只有在myisam引擎上才能使用,只能在char、varchar、text类型字段上使用全文索引 4、空间索引:是对空间数据类型的字段建立的索引,mysql中的空间数据类型有四种,geometry、point、linestring、polygon。创建空间索引时,使用spatial关键字。在引擎为myisam时,创建空间索引的列必须将其声明为not null | |
索引与键 | 键(key):有两重意义,一是约束作用,二是索引 键包括:primary key,unique key,foreign key等。一是约束,二是在此key上建立索引 | |
全文本搜索 | 为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。 索引后,select 可以与 match()、against()一起使用以实际执行搜索 1.不要在导入数据时使用fulltext 2.match()指定被搜索的列,against()指定要使用的搜索表达式 3.全文本搜索的一个重要部分就是对结果排序,较高等级的行先返回 eg;select note_text from a where match(note_text) against('rabbit'); | 并非所有引擎都支持全文搜索,MyISAM数据库引擎中支持全文本搜索 创建表时启用全文搜索,creat table语句接受fulltext子句 eg:creat table a( note_id int not null auto_increment, prod_id char(10) not null, note_date datetime not null, note_text text null, primary key(not_id), fulltext(note_text) )engine=myisam; |
更新和删除数据 | 更新(update):update 表名 set 列名1=该列新值,列名2=该列新值,列名3=该列新值... where 条件; update语句中可以使用子查询 update中,为了删除某个列的值,可以设置它null(前提是表定义允许null值): update 表名 set 列名=null where 列名=列值; | update:更新表中特定的行,更新所有行 没有where子句时,会将整个表格都更新 ignore关键字:在更新多行,更新中发现错误,也能继续进行更新 格式:update ignore 表名.... |
删除数据 | 删除(delete):delete from 表名 where 条件; delete删除整行而不是删除列,为了删除指定的列,需要使用update 如果想从表中删除所有行,可以使用‘truncate table’语句 | delete:删除表中特定的行,删除所有行 delete删除的是表的内容,而不是表本身 使用前,保证表中有主键 |
使用视图 | 视图:是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询 创建视图:create view 表名 as select查询语句 查看创建视图:show create view viewname; 删除视图:drop view viewname; 更新视图:可以drop 在create,也可以create orreplace view | 视图的另外一个常见用途是重新格式化检索出的数据 注:如果视图有以下操作,则不能进行视图的更新:分组(group by、having)、联结、子查询、并、聚集函数、distinct、导出(计算)列 视图一般用于检索(select)、而不是用于更新(insert、update、delete) |
使用存储过程 | 存储过程简单来讲,就是为以后的使用而保存的一条或多条mysql语句的集合 执行存储过程:call 存储名(); 创建存储过程:create procedure 存储名(参数列表) begin 过程体 end; --参数列表:[in/out/inout] 参数名称 参数类型 --用来限定存储过程体,过程体本身仅是一个简单的select语句 删除存储过程:drop procedure 存储名 if exists; 关键字out指出相应的参数用来从存储过程传出一个值(返回给调用者),in(传递给存储过程)、out(从存储过程中传出)、inout(对存储过程的传入和传出),存储过程的代码位于begin和end语句中 显示检索的信息:select @变量名; 在存储过程中声明变量的格式是:declare +变量名+变量类型(数据库变量类型)+defaultvalue,变量的周期在begin到end之间,变量赋值一定要使用set开头 | 在很多场景中,需要将多个表的数据处理,来产生新的我们需要的数据。这些多个表的数据并不能通过连接等查询方式给出,只能通过判断和循环才能产生。这个时候,就可以利用存储过程来实现。 mysql称存储过程的执行为‘调用’ 变量名都必须以@开始 参数:in、out、inout in:表示该变量只能在过程体内使用 out:表示该变量只能在过程体外使用 inout:表示在过程体内和体外使用 全局变量以@开头,无需声明 |
存储过程语法 | 前置条件:在begin和end之间执行 1.分支格式:if 条件 then 执行语句 end if if 条件 then 执行语句1 else 执行语句2 end if 2.循环:while 条件 to 执行语句; 条件改变语句; end if | |
使用游标 | 创建游标:declare 打开/关闭游标:open/close cursor | 游标:需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。游标是一个存储在mysql服务器上的数据库查询,只能用于存储过程和(函数) |
使用触发器 | 触发器是mysql响应一下任意语句而自动执行的一条mysql语句(或位于begin和end语句之间的一组语句)delete 、insert、update 创建触发器时,需要给出4条信息:唯一的触发器名、触发器关联的表、触发器应该响应的活动、触发器何时执行(处理前或后) 创建触发器:create trigger 表名;删除触发器:drop trigger 触发器(触发器不能更新或覆盖) 1.insert 触发器:可引用一个名为new的虚拟表,访问被插入的行;在before insert触发器中,new中的值也可以被更新 2.delete 触发器:可引用一个名为old的虚拟表,访问被删除的行;old中的值只读,不能更新 3.update 触发器:引用一个old的虚拟表访问以前的(update语句前)的值,引用一个名为new的虚拟表访问新更新的值。在before update触发器中,new中的值可以被更新;old的值只读,不能更新 | 触发器是一种特殊的存储过程 触发器:需要在某个表发生更改的时自动处理 触发器:保持每个数据库的触发器名唯一、并且只有表支持触发器、视图不支持、临时表也不支持;每个表每个事件每次只允许一个触发器,一个表最多支持6个触发器 |
管理事务处理 | 并非所有引擎都支持事务处理。事务处理是一种机制,用来管理必须成批执行的mysql操作,以保证数据库不包括不完整的操作结果。 事务:一组sql语句 回退:撤销指定sql语句的过程 提交(commit):将未存储的sql语句结果写入数据库表 保留点(savepoint):事务处理中先设置临时占位符,你可以对它发布回退 事务的开始:start transaction rollback(回退):只能在一个事务处理内使用,在执行一条start transaction命令后(不能回退create或drop操作) 更改默认的提交行为:set autocommit=0 | 当commit或rollback语句执行后,事务会自动关闭;只有简单的事务处理才能这样做 保留点可以多设置一点,保留点在事务完成后后自动释放,也可以用release save point释放 |
全球化和本地化 | 字符集:为字母和符号的集合 编码:为某个字符集成员的内部表示 校对:为规定字符如何比较的指令 show character set 显示所有可用的字符集以及每个字符集的描述和默认校对 show collation 查看所支持校对的完整列表 | |
安全管理 | 在日常mysql操作时,不要使用root mysql的用户账号和信息存储在名为mysql的数据库中 | |
数据库维护 | mysql数据必须经常备份,使用命令行实用程序MySQLdump转储所有数据库内容到某个外部文件 可用命令行实用程序mysqlhotcopy从一个数据库复制所有数据(并非所有数据库引擎都支持这个实用程序) 可以使用mysql的backup table 或select into outfile转储所有数据到某个外部文件。这两条语句都接收将要创建的系统文件名,此系统文件必须不存在,否则会出错,数据可以用restore table来复原 analyze table用来检查表键是否正确; check table用来针对许多问题对表进行检查 --help 显示帮助,一个选项列表 --safe-mode装载减去某些最佳配置的服务器 --verbose 显示全文本信息 --version 显示版本信息 | 为了保证所有数据被写到磁盘(包括索引数据),可能需要在进行备份前使用flush tables语句 日志: 错误日志:位于data目录中,日志名称通常为‘hostname.err’ 查询日志:位于data目录中,日志名称通常为‘hostname.log’ 二进制日志:位于data目录中,日志名称通常为‘hostname-bin’ 缓慢查询日志:位于data目录中,日志名称通常为‘hostname-slow.log’ |
改善性能 | 1.首先,mysql与所有dbms一样具有特定的硬件建议 2.关键的生产dbms应该运行在自己的专用服务器上 3.mysql使用一系列的默认设置预先配置的,这些设置开始通常是很好的,一段时间后需要调整内存分配、缓冲区大小等 4.mysql是一个多用户多线程的dbms,换言之,它经常同时执行多个任务,如果这些任务中的某一个执行缓慢,则所有请求都会执行缓慢。如果遇到显著的性能不良,可使用show processlist显示所有的活动进程 5.最重要的规则是,每条规则在某些条件都会被打破 |
数据类型 | 类型 | 存储需求 | 范围 | 用途 |
数值类型 | tinyint | 1字节 | 有符号:-128,127 无符号:0,255 | 小整数值 |
smallint | 2字节 | 有符号:-32768,32767 无符号:0,65535 | 大整数值 | |
mediumint | 3字节 | 有符号:-8388608,8388607 无符号:0,16777215 | 大整数值 | |
int | 4字节 | 有符号:-2147483648,2147483647 无符号:0,4294967295 | 大整数值 | |
bigint | 8字节 | 有符号:-9223372036854775808,9223372036854775807 无符号:0,18446744073709551615 | 极大整数值 | |
float | 4字节 | 单精度,浮点数值 | ||
double | 8字节 | 双精度,浮点数值 | ||
decimal | 小数值 | |||
日期和时间 类型 | date | 3字节 | 1000-01-01/9999-12-31 格式:yyyy-mm-dd | 日期值 |
time | 3字节 | 格式:hh:mm:ss | 时间值或持续时间 | |
year | 1字节 | 1901/2155 格式:yyyy | 年份值 | |
datetime | 8字节 | 格式:yyyy-mm-dd hh:mm:ss | 混合日期和时间值 | |
timestamp | 4字节 | 时间戳 | ||
字符串类型 | char | 0-255字节 | 定长字符串,固定长度,当数据不够长度时,用空格占位 | |
varchar | 0-65535字节 | 变长字符串 | ||
tinyblob | 0-255字节 | 不超过255个字符的二进制字符串 | ||
tinytext | 0-255字节 | 短文本字符串 | ||
blob | 0-65535字节 | 二进制形式的长文本数据 | ||
text | 0-65535字节 | 长文本数据 | ||
mediumblob | 0-16777215字节 | 二进制形式的中等长度文本数据 | ||
mediumtext | 0-16777215字节 | 中等长度文本数据 | ||
longblob | 0-4294967295字节 | 二进制形式的极大文本数据 | ||
longtext | 0-4294967295字节 | 极大文本数据 |
UTF-8:一个汉字=3字节、一个英文字符=1字节
GBK:一个汉字=2字节
字节:字节byte并非是计算机存储的最小单位,还有比字节byte更小的单位,也就是位(bit),一个位就代表一个0或1,8个位组成一个字节,一般字节用大写的B来表示,位用小写的b来表示。
1B=8b、1KB=1024B、1MB=1024KB,1GB=1024MB,1TB=1024GB
笛卡儿积:由没有联结条件的表关系返回的结果成为笛卡儿积。检索出来的行的数目将是第一个表中的行数乘以第二表中的行数
约束 | 作用 |
主键约束 (primary key) | 1.非空且唯一 2.一张表只能有一个字段为主键 3.主键就是表中记录的唯一标识 |
自动增长 (auto_increment) | 概念:如果某一列是数值类型的,使用auto_increment 可以来完成值的自动增长 创建表时,添加主键约束,并完成主键自动增长 |
非空约束 (not null) | 被限定值之后,该值不能为空 |
唯一约束 (unique) | 值不能重复,一个表中可以有多个 |
外键 (foreign key) | 1.外键为某个表中的一列,它包含另一个表的主键值(注:外键不能跨引擎) 2.让表与表产生关系,从而保证数据的正确性 3.创建表时,可以添加外键 关键词:constraint约束 references关联 foreign key声明外键 语法:create table 表名( .....外键列 constraint 外键名称 foreign key(外键列名称) references 主表名称(主表列名)); 语法:删除外键(alter table 表名 drop foreign key 外键名称;) 添加外键(alter table 表名 constraint 外键名称 foreign key 外键字段名称 references 主表名称(主表列名); 示例: create table department( id int primary key auto_increment, dep_name varchar(20), dep_location varchar(20)); create table employee( id int primary key auto_increment, name varchar(20), age int, dep_id int constraint emp_dapt_id_fk foreign key(dep_id) references department(id)); |
全局锁 | 对整个数据库进行加锁。mysql提供全局加锁的方法,命令:flush tables with read lock 当整个数据处于只读状态时,可以用这个命令 以下命令行不通:数据更新命令(增删改)、数据定义语句(包括建表、修改表结构等)、更新事务的提交语句 |
表级锁 | 有两种:表锁、元数据锁(meta data lock,mdl) 表锁语法: lock table...read/write;用‘unlock table’释放锁 |
事务锁(mdl) | mdl锁不需要显示使用,在访问表时自动加上 在语句执行开始时申请, 语句结束后并不会马上释放,而是等到整个事务提交后再释放 |
行锁 | 在引擎层由各引擎实现。但不是所有引擎都支持 目前只innodb支持,myisam只支持到表级锁 |
MySQL_基础+高级篇- 数据库 -sql -mysql教程_mysql视频_mysql入门_尚硅谷_哔哩哔哩_bilibili
练习题:https://zhuanlan.zhihu.com/p/38354000