MySql教程

mysql学习1

本文主要是介绍mysql学习1,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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语句的而己过插入表中。
查询语句11、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
查询语句21、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%';
%(百分号通配符):表示任何字符出现任意次数
__(下划线通配符):只匹配单个字符
转义符
spacer.gif
spacer.gif
正则表达式
关键字: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 

spacer.gif

使用游标创建游标: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.最重要的规则是,每条规则在某些条件都会被打破


字符串类型

数据类型类型存储需求范围用途
数值类型tinyint1字节有符号:-128,127
无符号:0,255
小整数值

smallint2字节有符号:-32768,32767
无符号:0,65535
大整数值

mediumint3字节有符号:-8388608,8388607
无符号:0,16777215
大整数值

int4字节有符号:-2147483648,2147483647
无符号:0,4294967295
大整数值

bigint8字节有符号:-9223372036854775808,9223372036854775807
无符号:0,18446744073709551615
极大整数值

float4字节
单精度,浮点数值

double8字节
双精度,浮点数值

decimal

小数值
日期和时间
类型
date3字节1000-01-01/9999-12-31
格式:yyyy-mm-dd
日期值

time3字节格式:hh:mm:ss时间值或持续时间

year1字节1901/2155
格式:yyyy
年份值

datetime8字节格式:yyyy-mm-dd hh:mm:ss
混合日期和时间值

timestamp4字节
时间戳
字符串类型char0-255字节
定长字符串,固定长度,当数据不够长度时,用空格占位

varchar0-65535字节
变长字符串

tinyblob0-255字节
不超过255个字符的二进制字符串

tinytext0-255字节
短文本字符串

blob0-65535字节
二进制形式的长文本数据

text0-65535字节
长文本数据

mediumblob0-16777215字节
二进制形式的中等长度文本数据

mediumtext
0-16777215字节
中等长度文本数据

longblob0-4294967295字节
二进制形式的极大文本数据

longtext0-4294967295字节
极大文本数据
注意:blob是二进制大对象,可以容纳可变数量的数据

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));

锁的概念、概念2

全局锁对整个数据库进行加锁。mysql提供全局加锁的方法,命令:flush  tables  with   read  lock
当整个数据处于只读状态时,可以用这个命令
以下命令行不通:数据更新命令(增删改)、数据定义语句(包括建表、修改表结构等)、更新事务的提交语句
表级锁有两种:表锁、元数据锁(meta  data  lock,mdl)
表锁语法: lock  table...read/write;用‘unlock  table’释放锁
事务锁(mdl)mdl锁不需要显示使用,在访问表时自动加上
在语句执行开始时申请, 语句结束后并不会马上释放,而是等到整个事务提交后再释放
行锁在引擎层由各引擎实现。但不是所有引擎都支持
目前只innodb支持,myisam只支持到表级锁

spacer.gif

mysql学习网站:
https://zhuanlan.zhihu.com/p/384476228

MySQL_基础+高级篇- 数据库 -sql -mysql教程_mysql视频_mysql入门_尚硅谷_哔哩哔哩_bilibili

练习题:https://zhuanlan.zhihu.com/p/38354000

      


这篇关于mysql学习1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!