Mysql笔记.docx
《Mysql笔记.docx》由会员分享,可在线阅读,更多相关《Mysql笔记.docx(23页珍藏版)》请在冰豆网上搜索。
Mysql笔记
安装;基本命令
createtableclass(
stuint,
namevarchar(20),
ageint,
areavarchar(20)
);
库
createdatabase
showdatabases
dropdatabasetest
desctablestest//查看表结构
droptabletest
desctest
renametableatob//重命名表
库名不能改
增
insertintotest
(id,age,name)//指定列
values
(1,10,'zhang3');//单引号
setnamesgbk;//解决字符编码问题
insertintotest
(age,name)
values
(10,'张三');
改
updatetest
setage=111,
name='liujichai'
whereid=3;
列的默认值:
altertabletestaddage3tinyintnotnulldefault0;//取消null
删除
deletefromtest
whereid=2;
altertableydropcolumn列名//删除列
查
selectid,namefromtestwhereid>3;//select,列,where,行
添加列
altertabletestaddage1tinyint(3)zerofill;
createtableclass(
idintprimarykeyauto_increment,
agetinyint
)charsetutf8;
insertintotest
(age,name,age1)
values
(20,'小王',3);
整形
tinyint1字节
smallint2
mediumint3
int4
bigint8
tinyint(M)unsignedzerofill//零填充,无符号
浮点型
float(M,D)//m总位数,d小数位占用4或者8个字节
createtablegoods(
namevarchar(10)notnulldefault'',
pricefloat(6,2)notnulldefault0.00
)charsetutf8;
定点型
altertablegoodsaddmaxfloat(9,2)notnulldefault0.0;
altertablegoodsaddmindecimal(9,2)notnulldefault0.0;//定点型
insertintogoods
(min,max)
values
(12.1111111111,13.222222222);
字符型
createtablestu(
namechar(8)notnulldefault'',//定长,8个UTF-8字符,不够用空格补齐
aihaovarchar(10)notnulldefault''//变长,用1-2个字节来记录占用了多少个字节
)charsetutf8;
速度上,定长速度快char
text型字符不能创建索引
日期类型
date日期
time时间
datetime日期时间类型
year年类型1901-2155
createtabley(
yayear(4)
);
insertintoy//不指定表,默认插入所有列
values
('1901');
year类型,
输入一位
输入两位
‘00-69’表示2000-2069
‘70-99’表示1970-1999
date型
1992-08-12
日期时间日期
createtabled(
dtdata);
time类型hh:
mm:
ss
insertintoy(tm)values('12:
10:
23');
datetime类型1989-05-0614:
32:
05
时间戳
enum枚举型
set集合性
createtablet2(
genderenum('man','girl')
)charsetutf8;
charset
例题:
name:
char(3)
age:
tinyintunsigned
email:
varchar(30)
tel:
char(11)
intro:
varchar(100)
salary:
decimal(7,2)
riqi:
date
createtablewolf(
idintprimarykeyauto_increment,
namechar(3)notnulldefault'',
agetinyintunsignednotnulldefault0,
emailvarchar(30)notnulldefault'',
telchar(11)notnulldefault'',
salarydecimal(7,2)notnulldefault'2000-01-01',
riqidatenotnulldefault'2012-01-01'
)charsetutf8;
增删改查:
案例分析
增:
哪张表,哪列,值
insertintowolf(name,age,email,tel,riqi)
values(---);
主键值不能重复
insertintowolf
(name,age,tel)
values
('张飞',79,'66011123'),
('关羽',88,'66011124'),
('曹操',89,'66011125');//一次可以插入多行
改
updatewolfsetid=2name='wolf'where**//修该多个值
select*fromwolfwhere1;//这个1为逻辑值’真‘
删:
delete只能删除行,alter可以drop列
deletefromwolfwhere**//
查:
安装ecshop保留upload,重命名为ecshop
浏览器输入路径
localhost/ecshop
E:
\MySql\ECSHop\upload
localhost/E:
/MySql/Enviroment/PHPnow-1.5.4/MySQL-5.0.83/data/test
E:
\MySql\Enviroment\PHPnow-1.5.4\MySQL-5.0.83\data\test
列类型
数值型
整形tinyint,smallint,mediumint,intbigint
M,unsigned,zerofill
浮点型定点型float(m,d)unsigned,M精度,d小数位
decimal比float更精确
字符型
char(M)定长型,可存储的字符数
varchar(M),
日期时间类型
year1901-2155,两位数输入法,
dateyy-mm-dd,范围1000-1-1》》9999-12-31
timeHH:
mm:
ss范围-838:
59:
59->838:
59:
59
datetimeYY-MM-DDHH:
ii:
ss1000-01-01
开发中的问题
时间戳,方便计算,格式成不同的样式
建表语句
createtable表名(
列名称列类型【列属性】【默认值】
)engine引擎名charset字符集;
增:
insertinto表名
(列1,列2,列3)
values
(值1,值2,值3);
//如果不声明插入的列,则默认插入所有列
改:
update表名set列1=值1,列2=值2where表达式;//表达式
删:
deletefrom表名where表达式
查:
select*from表明
查询的5种子句:
where条件查询
groupby分组
having筛选
order,by排序
limit限制结果条数
一:
where
select列名from表名where行;
运算符
<小于|=或者<>不等于
in在某集合内between在某范围内
逻辑运算符
NOT或!
逻辑非OR或||逻辑或
AND或&&逻辑与
selectid,namefromwolfwhereidin(4,7,8);
selectid,namefromwolfwhereidbetween1and3;
selectid,name,telfromwolfwhereid>=6||id=1;
selectid,name,telfromwolfwhereid>2&&id<5;
select*fromwolfwhereid!
=4&&id!
=5;
select*fromwolfwhereidnotin(4,5);
模糊查询
select*fromwolfwherenamelike'te%';
通配符:
%任意字符
_单个字符
二:
groupby
max:
求最大min:
求最小sum:
求总和avg:
求平均count:
求总行数
selectmax(id)fromwolf;
selectid,name,max(price)fromwolfgroupbyage;//分组
selectid,name,count(*)fromwolfgroupbyage;//统计重复的行
要把列名当作变量名来看——
#selectid,price-age,namefromwolf;
#selectid,name,sum(age*price)fromwolfgroupbyage;//分别统计各个分组内的信息
selectid,name,market_price-shop_priceasshengfromgoods;
三:
having(筛选)
select*,age-idasttfromwolfwhereclass='A'havinttt>10//统计A类,
select*,sum(age)ashkfromwolfgroupbyclasshavinghk>30;//
查询两门及两门以上不及格同学的平均分
selectname,count
select姓名,avg(分数)fromstugroupby姓名;//列名不要用单引号,会出错
select*,sum(分数<60)fromstugroupby姓名;
select*,sum(分数<60)asgk,avg(分数)fromstugroupby姓名havinggk>=2
四:
orderby
select*,agefromwolforderbyage;
select*fromwolfwhereclass='A'orderbyage;//默认升序排列,
select*fromwolfwhereclass='A'orderbyagedesc;//desc说明,用倒叙排列
select*fromwolfwhereclass='A'orderbyageasc;//指明升序排列
select*fromwolfwhereclass='A'orderbyage,iddesc;//第一排序标准,第二排序标准
五:
limit
取价格最高的三个商品
limit放在最后有限制的作用,limit[offset],[N]//偏移量,取出条目
select*fromwolforderbyagedesclimit3,3;//排序向后偏移3位,取三个数
六i:
附加:
物种子句的使用陷阱
组内排序和组代表排序
如果有多种语句,按where,groupby,having,orderby,limit顺序写,否则语法错误
createtablegoodslikewolf;//表的列复制
insertintogoodsselect*fromwolforderbyagedesc;//内容的传递
truncategoods//清空表
良好的理解模型
where表达式,把表达式放在行中,看表达式是否为真
列,理解成变量,可以运算
取出结果,可以理解成一张临时表
select*,agefromwolfgroupbyclassorderbyagedesc;//错误,代表进行排序
selectid,name,max(age)fromwolfgroupbyclass;
七.子查询
where型子查询
from型子查询
exsts型子查询
1.where型(把内层的查询结果作为外层查询的比较条件)
select*fromwolforderbyagedesclimit1;//求最大age
selectid,name,classfromwolfwhereage=(selectmax(age)fromwolf);
2.from型:
把内层的查询结果当成临时表,供外层再次查询
selectid,name,agefromwolfwhereagein(selectmax(age)fromwolfgroupbyclass);
selectmax(id),agefrom(selectid,name,agefromwolfwhereagein(selectmax(age)fromwolfgroupbyclass))astmp;//把()内当作一张表
select姓名,count(*)fromstuwhere'分数'<60groupby姓名;
select姓名from(select姓名,count(*)asgkfromstuwhere'分数'<60groupby姓名havinggk>=2)astmp;
3.exists型把外层的查询结果拿到内层,看内层是否成立
mysql>selectid,name,agefromwolfwhereexists(select*fromwolfwhereage>
20);
链接:
union
一.selectunion用法union联合
合并查询结果
链接查询
左链接
右链接
内链接
列的增加与删除与修改
select*fromwolfwhereage>60orage<30;
select*fromwolfwhereage>60unionselect*fromwolfwhereage<30;//功能一样
union语法要求:
两次查询的列数一致(只要求列数一致)
union用的时候会自动合并重复的行(完全相同)
unionall;
如果union后句有orderby或limit用括号,否则会出错(句一)union(句2)
orderby,limit放在最后表示,及对最终结果做排序
在子句中orderby配合limit使用才有意义
createtableta(
idchar
(1),
numint
);
createtabletb(
idchar
(1),
numint
);
insertintota
values
('a',5),
('b',10),
('c',15),
('d',10);
insertintotb
values
('b',5),
('c',10),
('d',20),
('e',99);
mysql>selectid,numfrom(select*fromtaunionselect*fromtb)astmpgroupbyid;
union用的时候会自动合并重复的行
mysql>select*fromtaunionallselect*fromtb;//同样的行也会显示
mysql>(select*fromwolfwhereclass='A'orderbyagedesclimit2)union(select*fromwolforderbyiddesclimit2);
mysql>(select*fromwolfwhereclass='A'orderbyagedesclimit2)union(select*fromwolforderbyiddesclimit2)orderbyid;
mysql>(select*fromwolfwhereclass='A'orderbyagedesclimit2)union(select*fromwolforderbyiddesclimit2)orderbyiddesclimit2;
在子句中orderby配合limit使用才有意义,如果orderby不配合limit使用,会被语法分析器分析时去掉
二.链接查询
左链接右链接
集合set集合的特性:
无序性、唯一性、
理论上讲:
不可能存在完全相同的两个行,但是表中可以有完全相同的两行
因为,表内部有一个rowid(不可能重复)
select*fromta,tb;//ta和tb的排列组合
1.连接接上表
2.连接条件onjoin
如果字段名重复,添加表前缀
selectta.id,ta.numfromtbleftjointaonta.id=tb.id;
createtableboy(
namechar(3),
flowerchar(5)
);
insertintoboy
values
('林书豪','玫瑰'),
('刘翔','桃花'),
('周杰伦','茉莉花'),
('犀利哥','荷花');
('刘德华','狗尾巴花');
createtablegirl(
namechar(3),
flowerchar(5)
);
insertintogirl
values
('艾薇儿','玫瑰'),
('居里','桃花'),
('芙蓉','茉莉花'),
('凤姐','茉莉花'),
('林志玲','荷花');
找女友的活动
selectboy.*,girl.*fromboyleftjoingirlonboy.flower=girl.flower;
左链接:
以左表为准,去右表中找匹配数据,找不到用null补齐
右链接:
以右表为准,去左表中找匹配数据,找不到用null补齐
boyleftjiongirl<===>girlrightjoinboy;
推荐使用左链接代替使用右链接
三:
内链接(排除单身)
查询左右表都有的数据
selectboy.*,girl.*fromboyinnerjoingirlonboy.flower=girl.flower;
左链接和右链接的交集(内链接)
左链接和右链接的并集(mysql不能)外链接
三表链接查询
selectboy.*,girl.*from
boyinnerjoingirlonboy.flower=girl.flowerleftjoinwolfwolf.id=tb.id
(有共同项目,才能链接)
createtablem(
midintprimarykeyauto_increment,
hidint,
gidint,
mresvarchar(5),
matimedate
)charsetutf8;
insertintom
(hid,gid,mres,matime)
values
(1,2,'2:
0','2006-05-21'),
(2,3,'1:
2','2006-06-21'),
(3,1,'2:
5','2006-06-25'),
(2,1,'3:
2','2006-07-21');
createtablet(
tidint,
tnamevarchar(10)
)charsetutf8;
insertintot
values
(1,'国安'),
(2,'申花'),
(3,'传智');
t
+------+-------+
|tid|tname|
+------+-------+
|1|国安|
|2|申花|
|3|传智|
+------+-------+
m
+-----+------+------+------+------------+
|mid|hid|gid|mres|matime|
+-----+------+------+------+------------+
|1|1|2|2:
0|2006-05-21|
|2|2|3|1:
2|2006-06-21|
|3|3|1|2:
5|2006-06-25|
|4|2|1|3:
2|2006-07-21|
+-----+------+------+------+------------+
selecthid,mres,gid,matimefromm;
selecthid,tname,mres,gid,matimefrommleftjointonm.hid=t.tid;
selecthid,t1.tnameashname,mres,gid,t2.tnameasgname,matime
from
mleftjointast1
onm.hid=t1.tid
leftjointast2
onm.gid=t2.tid
wherematimebetween'2006-06-01'and'2006-07-01';
附加:
列的增加和修改
charset=utf8/gbk/
增加的列默认在最后面
一:
增加列
可以用after声明在哪一列后面
altertableboyaddagetinyintun