mysql学习总结.docx
- 文档编号:30320612
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:51
- 大小:1.55MB
mysql学习总结.docx
《mysql学习总结.docx》由会员分享,可在线阅读,更多相关《mysql学习总结.docx(51页珍藏版)》请在冰豆网上搜索。
mysql学习总结
mysql学习笔记mysqldump备份备份单独库下面的所有表mysqldump-uuname-ppassworddb>地址+备份文件名称备份某库下的几个表
mysqldump-uuname-ppassworddbtable1table2table3等>地址+备份文件名称备份多个数据库
mysqldump-uuname-ppassword-Bdb1db2>地址+备份文件名称备份所有数据库
mysqldump-uuname-ppassword-A
导出的是建表语句和insert语句
注意:
恢复文件的地址形式如e:
\\library.sql
文件名称后没有分号!
!
!
恢复
1登陆到mysql命令行的状态下库级文件的恢复
mysql>source备份文件地址表级文件的恢复
mysql>use库名
mysql>source备份文件地址
2不登陆的情况下
库级的
mysql-u用户名-p密码<备份文件地址
表级
mysql-u用户名-p密码库名<备份文件地址
mysql模糊查询
like
%-->通配任意字符
_-->通配一个字符练习:
1%-->通配任意字符
2_-->通配一个字符
笛卡尔积与连接查询
连接查询(左连接右连接内连接)
笛卡尔乘积
集合特性:
确定性无序性唯一性
一张表可以看做是一个集合,每行数据相当于集合的一个元素
Union时去掉重复原理就是集合元素的唯一性
rowid
表中存在完全相同的两行是因为表内部存在
进行区分
笛卡尔积
如果a∈A,b∈B
A*B=(a,b);
例如A=(1,2,3,4,5);B=(11,12);
那么A*B
(1,11),(2,11),(3,11),(4,11),(5,11),
(1,12),(2,12),(3,12),(4,12),(5,12);
A有M个元素B有N个元素
那么A*B有M*N个元素
同理
表A有M行表B有N行
那么A*B有M*N行
例如:
tatb两表
笛卡尔积
通过分析可以看出
tb表的abcd每个分别和ta的abc
d组合一遍
左连接
1连上表
2连接条件
例如:
select
good_id,goods.cat_id,goods_name,shop_price
from
goodsleftjoincategory
ongood.cat_id=category.cat_id;
字段名重复那么需要加表前缀,否则会报错;
error1052(23000)column*infieldlistisambiguous最后两行可以看作是一张表。
左连接语法:
select列1,列2,列N
fromtable1leftjointable2ontable1列=table2列;
on后面的条件只要是条件就可以可以不是等于但是常用是等于。
将from后面的当做一个普通表看待。
右连接语法:
select列1,列2,列Nfrom
table1rightjointable2
ontable1列=table2列;
内连接inner
select列1,列2,列Nfrom
table1innerjointable2
ontable1列=table2列;
左连接和右连接
是以左边的表为基准。
通俗的讲,先将左边的表全部显示出来,然后右边的表id与左边表id相同的记录就“拼接”上去,比如说id为1的记录。
如果没有匹配的id,比如说t1中id为2的t2中就没有。
那边就以null显示。
右外连接过程正好相反。
内连接
只有一条记录。
内连接就是只取出符合过滤条件的记录也就是t1.id=t2.id那么符合t1.id=t2.id的记录只有id=1这一条,所以只显示一条。
不像外连接,是将你作为基准的表(左外连接就是左边表为基准,右外连接就是右边表为基准)的所有行都显示出来。
-----------------[以下为网上的一点资料(粘贴的)]----
^^^LEFTJOIN操作用于在任何的FROM子句中,组合来源表的记录。
使用LEFTJOIN运算来创建一个左边外部联接。
左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。
语法:
FROMtable1LEFTJOINtable2ONtable1.field1compoprtable2.field2
说明:
①table1,table2参数用于指定要将记录组合的表的名称。
②field1,field2参数指定被联接的字段的名称。
且这些字段必须有相同的数据类型及包含
相同类型的数据,但它们不需要有相同的名称。
③compopr参数指定关系比较运算符:
"=","<",">","<=",">="或"<>"。
④如果在INNERJOIN操作中要联接包含Memo数据类型或OLEObject数据类型数据的字段,将会发生错误
mysql新的学习模式1通过备份数据库文件查看备份代码学习sql语句!
!
你会发现备份的语句和你原本建表语句是略有不同的更加标准和详细
并且通过其
2备份的语句更加规范文本明白备份原理;
即通过将建表建库inser语句等进行备份并且可以表示文档注释等等。
子查询(完整)
from
把内层的查询结果作为外层查询比较查询
例:
查最新商品(以goods_id最大为最新)
1select*fromgoodswheregoods_id=最大的gooods_id;
2select*fromgoodswheregoods_id=(selectmax(goods_id)fromgoods);where表达式则取出哪一行
表达式在哪一行成立
=,!
=,<,><=,>=in,betweenandor,and,not
having表达式数据在表中,表在硬盘或者内存中以文件的形式存在where就是针对文件发生作用查询结果,也可以看做是一张表,去文件一般临时存在于缓冲区having就是针对查询结果发挥着作用groupby
分组一般和统计函数(sum,avg,min,max)结合使用
orderby
默认是升序的
如果想显示声明升序排列
可用asc来声明
可以"字段名"desc来声明降序排可以用来查询商品等价格以及新旧
注:
可以按照多条件排序,前面的条件优先!
!
orderby列1[asc/desc],列2[asc/desc];
exists
把外层的查询结果代入内层,看内层是否成立
查询商品栏目
select*fromcategorywhereexists(select*fromgoodswheregoods.cat_idcategor.cat_id);
cat_id字段相同需要加上表前缀
limit
在语句的最后起到限制显示结果条目个数limit[offset,][N];
offset表示偏移量(跳过几个)
N表示取出的条目个数
如果offset不写相当于0
#在mysql里表示注释
列操作(增加修改删除列)列操作(增加修改删除列)
创建表单
单描述
增加列
1altertable
名add列声明;
列声明
列名称列类型【列属性】[列默认值]增加的列默认在表的的最后一列
2altertable
名add列声明after列;声明新增的列在原来哪个列后面
3altertable列
名add列声明first;如果放在第一列那么在列声明后加first即可
发现问题
auto_increment的问题
插入id使用auto_increment时要求列声明里列必须被定义为key
修改列altertable列列声明原来:
修改列:
删除列
altertable表名drop列名;
mysqlunion的用法
union的用法(一般用于多张表的union)合并查询结果
将两次或者两次以上的结果合并在一起
要求:
两次查询的列数一致推荐,查询每一列,相对应的列类型是一样的多次sql语句取出的列名可以不一致,此时以取第一个sql的列名为准。
如果不同的语句中取出的行有每个列的值都相同,那么相同的行将被合并成一行(去重复)
如果不想去重复union加上all
创建表格
createtableta
(idchar
(1)defaultnull,
numintnotnulldefault0
)engine=InnoDBcharset=utf8;
insertintota(id,num)values('a',10),('b',20),('c',30),('d',40);
createtabletb
(idchar
(1)defaultnull,
numintnotnulldefault0)engine=InnoDBcharset=utf8;
insertintotb(id,num)values('a',50),('b',60),('c',70),('d',80);
1合并两张表格
2合并两张表单把相同id下的数值sum求和
现问题
使用聚合函数时不许有空格
Sum(num)
Sum(num)
将会把sum识别为表报该数据库下不存在该表单错误
Error1630(42000)
注意:
如果子句里有orderby|limit需要union两边加小括号例如
(selectgood_id,cat_id,goods_name,shop_pricefromgoods_id=wherecat_id
4orderby
shop_pricedesc)union(selectgood_id,cat_id,goods_name,shop_pricefrom
goods_id=wherecat_id=5orderbyshop_pricedesc);
但是容易有误
解决方案
1orderby尽量放在最后使用即岁最终合并后的结果进行排序
(selectgood_id,cat_id,goods_name,shop_pricefromgoods_id=wherecat_id
4)union
(selectgood_id,cat_id,goods_name,shop_pricefromgoods_id=wherecat_id
5orderbyshop_pricedesc;
2每个子语句加上limit
mysql视图视图的定义:
视图就是由查询结果组成的一张虚拟表视图的创建语法:
createview视图名asselect语句;
显示表将会被显示出来
可以看到“表结构”
和视图内容
删除视图语法:
dropview视图名;
视图修改
创建视图的原因:
1、简化查询
2、可以进行权限控制
比如:
可以把商品名称等创建视图,把商品价格等“隐藏”。
把表的权限保留,只把视图提供给别人。
3、大的数据分表时,可以用到数据。
比如:
表的行数大于200万行时,开始变慢,可以把一张表的数据拆成4张表(视图)来存放。
4、可以将多张表合并成一张表(视图)。
结合union.
注意:
1、可以完全把视图当作表看待。
2、视图源于表,如果表的内容改变了,那么视图的内容也会跟着发生改变。
3、视图的增删改也将会影响表,但是视图并不是总是可以增删改的。
视图和表数据是一一对应时,可以修改。
对于视图insert视图必须包含所有表中没有默认值的列。
视图的algorithm(算法)
Algorithm=merge/temptable/undefinedmerge当引用视图时,引用视图的语句和定义视图的语句合并。
意味着,视图只是一个规则,当查询视图时,把查询视图的语句(比如where等)与创建时的语句where子句合并分析,形成一条select语句。
相当于把语句效果叠加。
temptable当引用视图时,根据视图的创建语句,建立一个临时表。
是把根据创建时候的语句瞬间创建临时表,查询视图的语句,从该临时表查询。
undefined未定义自动,让系统帮你选择。
mysql字符集
(CHARACTERSET)和校对集(COLLATE)
字符集(CHARACTERSET)和校对集
(COLLATE)
字符集:
可以设置服务器默认字符集数据库默认字符集表默认字符集甚至到列默认字符集某个级别没有指定,那么继承上级。
mysql4.1及其之后的版本,对字符集的支持分为四个层次:
服务器(server),数据库(database),数据表(table)和连接(connection):
character_set_server:
这是设置服务器使用的字符集character_set_client:
这是设置客户端发送查询使用的字符集
character_set_connection:
这是设置服务器需要将收到的查询串转换成的字符集
character_set_results:
这是设置服务器要将结果数据转换到的字符集,转换后才发送给客户端
整个过程:
-client(如php程序)发送一个查询;
-服务器收到查询,将查询串从character_set_client转换到character_set_connection,然后执行转换后的查询;
-服务器将结果数据转换到character_set_results字符集后发送回客户端。
1、告诉服务器发送的数据是什么类
型的。
character_set_client
2、告诉转换器,
转换什么编码
character_set_connection
3、查询结果用什么编码character_set_results如果三者都是字符集N
那么可以简写为setnamesN;
例如:
客户端字符集和连接字符集
如果connection和服务器的字符集,比client小时,容易丢失数据。
createtable时的charset是服务器的字符编码
校对集:
可以理解为,排序规则等。
一个字符集可能有多种校对集合;
官方文档
1、数据库字符集和校对
CREATEDATABASEdb_name
[[DEFAULT]CHARACTERSETcharset_name]
[[DEFAULT]COLLATEcollation_name]
例如:
CREATEDATABASEdb_name
DEFAULTCHARACTERSETlatin1COLLATElatin1_swedish_ci;
MySQL这样选择数据库字符集和数据库校对规则:
·如果指定了CHARACTERSETX和COLLATEY,那么采用字符集X和校对规则Y。
·如果指定了CHARACTERSETX而没有指定
COLLATEY,那么采用CHARACTERSETX和CHARACTERSETX的默认校对规则。
·否则,采用服务器字符集和服务器校对规则。
2、表字符集和校对每一个表有一个表字符集和一个校对规则,它不能为空。
为指定表字符集和校对规则,CREATETABLE和ALTERTABLE语句有一个可选的子句:
CREATETABLEtbl_name(column_list)
[DEFAULTCHARACTER
SETcharset_name[COLLATEcollation_name]]
ALTERTABLEtbl_name
[DEFAULTCHARACTERSETcharset_name]
[COLLATEcollation_name]
MySQL按照下面的方式选择表字符集和校对规则:
·如果指定了CHARACTERSETX和COLLATEY,那么采用CHARACTERSETX和COLLATEY。
·如果指定了CHARACTERSETX而没有指定COLLATEY,那么采用CHARACTERSETX和CHARACTERSETX的默认校对规则。
·否则,采用服务器字符集和服务器校对规则。
如果在列定义中没有指定列字符集和校对规则,则默认使用表字符集和校对规则。
表字符集和校对规则是MySQL的扩展;在标准SQL中没有。
3、列字符集和校对
每一个“字符”列(即,CHAR、VARCHAR或TEXT类型的列)有一个列字符集和一个列校对规则,它不能为空。
列定义语法有一个可选子句来指定列字符集和校对规则:
col_name{CHAR|VARCHAR|TEXT}(col_length)
[CHARACTER
SETcharset_name[COLLATEcollation_name]]
例如:
CREATETABLETable1
(
column1VARCHAR(5)CHARACTERSETlatin1COLLATElatin1_german1_ci
);
MySQL按照下面的方式选择列字符集和校对规则:
·如果指定了CHARACTERSETX和COLLATEY,那么采用CHARACTERSETX和COLLATEY。
·如果指定了CHARACTERSETX而没有指定COLLATEY,那么采用CHARACTERSETX和CHARACTERSETX的默认校对规则。
·否则,采用表字符集和服务器校对规则。
CHARACTERSET和COLLATE子句是标准的SQL。
示例1:
表和列定义
CREATETABLEt1
(
c1CHAR(10)CHARACTERSETlatin1COLLATElatin1_german1_ci
)DEFAULTCHARACTERSETlatin2COLLATElatin2_bin;在这里我们有一个列使用latin1字符集和latin1_german1_ci校对规则。
是显式的定义,因此简单明了。
需要注意的是,在一个latin2表中存储一个latin1列不会存在问题。
示例2:
表和列定义
CREATETABLEt1
(
c1CHAR(10)CHARACTERSETlatin1
)DEFAULTCHARACTERSETlatin1COLLATElatin1_danish_ci;这次我们有一个列使用latin1字符集和一个默认校对规则。
尽管它显得自然,默认校对规则却不是表级。
相反,因为latin1的默认校对规则总是latin1_swedish_ci,列c1有一个校对规则latin1_swedish_ci(而不是latin1_danish_ci)。
示例3:
表和列定义
CREATETABLEt1
(
c1CHAR(10)
)DEFAULTCHARACTERSETlatin1COLLATElatin1_danish_ci;我们有一个列使用一个默认字符集和一个默认校对规则。
在这种情况下,MySQL查找表级别来确定列字符集和校对规则
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mysql 学习 总结