MySQL简单操作.docx
- 文档编号:7879996
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:14
- 大小:54KB
MySQL简单操作.docx
《MySQL简单操作.docx》由会员分享,可在线阅读,更多相关《MySQL简单操作.docx(14页珍藏版)》请在冰豆网上搜索。
MySQL简单操作
MySQL数据库
数据的所有存储、检索和管理是由数据库软件—DBMS(数据库管理系统)完成的,MySQL是一种DBMS。
DBMS分为两类1)基于共享文件系统的DBMS(例如MicrosoftAccess和FileMaker)2)基于客户端-服务器的数据库(例如MySQL,Oracle,MicrosoftSQLServer),服务器部分负责数据访问和处理。
MySQL数据库文件:
数据文件:
.myd
索引文件:
.MYI
表定义文件:
.frm
1、创建新的数据库:
createdatabase数据库名;
createdatabaseStudent
2、给数据库Student付权限:
grantselect,insert,update,delete,create,drop,alteron数据库名.*to数据库名@localhostidentifiedby'Password';--Password是创建这个数据库时自己设置的登录密码
grantselect,insert,update,delete,create,drop,alteronStudent.*tostudent@localhostidentifiedby'Password';
3、setpasswordfor'数据库名'@'localhost'=old_password('密码');
setpasswordfor'Student'@'localhost'=old_password('1234');
依次执行3个命令完成数据库创建。
注意:
中文“密码”和“数据库”是户自己需要设置的。
查看现有数据库
mysql>showdatabases;
创建数据库(假如数据库名为Student)
mysql>createdatabaseStudent;
--删除数据库(假如数据库名为Student)
--mysql>dropdatabaseStudent;
使用数据库(假如使用数据库Student)
mysql>useStudent;
执行完使用数据库命令后,就可以对该数据库进行创建、修改、插入、删除表等操作
数据类型:
数值类型
类型
大小
范围(无符号)
用途
int(integer)
4字节
-2^31~2^31-1
整数值
float
4字节
-2.23E308~2.23E308
单精度浮点数值
double
8字节
双精度浮点数值
decimal
decimal(4,2)表示这个数长度为4位,有两个小数位,最大值99.99
依赖于M(这是数长度)和D(小数位数)的值
小数值(比float,double能存更多位的小数)
字符串类型
MySQL提供了8个基本的字符串类型,可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。
类型
大小
用途
char
0-255字节
定长字符串
varchar
0-255字节
变长字符串
text
0-65535字节
长文本数据
mediumblob
0-16777215字节
二进制形式的中等长度文本数据
mediumtext
0-16777215字节
中等长度文本数据
logngblob
0-4294967295字节
二进制形式的极大文本数据
longtext
0-4294967295字节
极大文本数据
CHAR和VARCHAR类型
CHAR类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。
这个大小修饰符的范围从0-255。
比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补。
CHAR和VARCHGAR不同之处在于MuSQL数据库处理这个数据的方式:
CHAR把这个大小视为值的大小,不长度不足的情况下就用空格补足。
而VARCHAR类型把它视为最大值并且只使用存储字符串实际需要的长度(增加一个额外字节来存储字符串本身的长度)来存储值。
所以短于指示器长度的VARCHAR类型不会被空格填补,但长于指示器的值仍然会被截短。
使用VARCHAR类型可以大大地节约磁盘空间、提高存储效率。
例如:
把name:
Bob设置为char类型char(10),存在数据库占磁盘:
Bob_______,
存成varchar(10)占磁盘:
Bob。
如果名字为AAAAABBBBBcc长度为12,存到数据库里面只能存为AAAAABBBBB.
TEXT和BLOB类型
对于字段长度要求超过255个的情况下,MySQL提供了TEXT和BLOB两种类型。
根据存储数据的大小,它们都有不同的子类型。
这些大型的数据用于存储文本块或图像、声音文件等二进制数据类型。
TEXT和BLOB类型在分类和比较上存在区别。
BLOB类型区分大小写,而TEXT不区分大小写。
大小修饰符不用于各种BLOB和TEXT子类型。
比指定类型支持的最大范围大的值将被自动截短。
日期和时间类型
在处理日期和时间类型的值时,MySQL带有5个不同的数据类型可供选择。
类型
大小
(字节)
范围
格式
用途
date
3
1000-01-01/9999-12-31
YYYY-MM-DD
日期值
time
3
'00:
00:
00'/'24:
00:
00'
HH:
MM:
SS
时间值或持续时间
year
1
1901/2155
YYYY
年份值
datetime
8
1000-01-0100:
00:
00
/9999-12-3123:
59:
59
YYYY-MM-DDHH:
MM:
SS
混合日期和时间值
timestamp
8
1970-01-0100:
00:
00/2037年某时
YYYYMMDDHHMMSS
混合日期和时间值,时间戳
DATE、TIME和TEAR类型
MySQL用date和tear类型存储简单的日期值,使用time类型存储时间值。
这些类型可以描述为字符串或不带分隔符的整数序列。
如果描述为字符串,DATE类型的值应该使用连字号作为分隔符分开,而TIME类型的值应该使用冒号作为分隔符分开。
需要注意的是,没有冒号分隔符的time类型值,将会被MySQL理解为持续的时间,而不是时间戳。
MySQL试图将2个数字的年份转换为4个数字的值。
把在00-69范围内的值转换到2000-2069范围内。
把70-99范围内的值转换到1970-1979之内。
如果MySQL自动转换后的值并不符合我们的需要,请输入4个数字表示的年份。
DATEYIME和TIMESTAMP类型
除了日期和时间数据类型,MySQL还支持DATEYIME和TIMESTAMP这两种混合类型。
它们可以把日期和时间作为单个的值进行存储。
这两种类型通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。
如果我们对TIMESTAMP类型的字段没有明确赋值,或是被赋与了null值。
MySQL会自动使用系统当前的日期和时间来填充它。
复合类型
MySQL还支持两种复合数据类型ENUM和SET,它们扩展了SQL规范。
虽然这些类型在技术上是字符串类型,但是可以被视为不同的数据类型。
一个ENUM类型只允许从一个集合中取得一个值;而SET类型允许从一个集合中取得任意多个值。
ENUM类型
ENUM类型因为只允许在集合中取得一个值,有点类似于单选项。
在处理相互排拆的数据时容易让人理解,比如人类的性别。
ENUM类型在系统内部可以存储为数字,并且从1开始用数字做索引。
一个ENUM类型最多可以包含65536个元素,其中一个元素被MySQL保留,用来存储错误信息,这个错误值用索引0或者一个空字符串表示。
SET类型
SET类型与ENUM类型相似但不相同。
SET类型可以从预定义的集合中取得任意数量的值。
并且与ENUM类型相同的是任何试图在SET类型字段中插入非预定义的值都会使MySQL插入一个空字符串。
如果插入一个即有合法的元素又有非法的元素的记录,MySQL将会保留合法的元素,除去非法的元素。
一个SET类型最多可以包含64项元素。
在SET元素中值被存储为一个分离的“位”序列,这些“位”表示与它相对应的元素。
“位”是创建有序元素集合的一种简单而有效的方式。
并且它还去除了重复的元素,所以SET类型中不可能包含两个相同的元素。
希望从SET类型字段中找出非法的记录只需查找包含空字符串或二进制值为0的行。
创建数据库
采用以下数据库标准:
创建一个学生信息数据库Student,
其中包含学生信息表info,成绩表score,选课表select,班级表class。
学生信息表info
StuId
Name
ClassId
Birthday
phone
Address
1001
张三
1101
1992.02.03
15500
青岛
1002
李四
1101
1991.12.31
15501
济南
1003
王五
1102
2000.02.29
15502
莱芜
建表语句:
createtable表名(列名数据类型,列名数据类型,列名数据类型)
createtableinfo
(
StuIdintnotnullauto_increment,Namevarchar(20)notnull,
ClassIdintnull,
Birthdaydatenull,
Phonevarchar(5)notnull,
Addressvarchar(30)notnull,
primarykey(StuId)
)
--auto_increment:
自增长。
例添加学生学号时会自动检测表中最大的值,并+1附给新添加的学生。
设置生日时数据类型为timestamp默认值为系统当前时间。
Birthdaytimestampnotnulldefaultnow()
primarykey():
主键,标识具有唯一标识的行的值。
在一个表中不能有两行相同的主键值,被定义为主键的行不能输入空值(NULL),一张表中只有一列数据作为主键。
注:
NULL就是空值,就是什么都没有,空值不与任何值相等,即null不等于空格,不等于0。
建表时classidnull就是添加学生信息时候,班级编号这一栏可以不写。
notnull的例如学号,就必须写。
添加数据
Insertinto表名(列名1,列名2,…)values(列值1,列值2,…);
往info表中添加数据
1)insertintoinfo(StuId,Name,ClassId,Birthday,phone,Address)
values(1001,’张三’,1101,’1992.02.03’,’15500’,’青岛’)
2)如果添加数据时不会空缺一项,如添加‘李四’信息时把他所有信息都补全,就不用写列名
insertintoinfovalues(1002,’李四’,1101,’1992.02.03’,’15501’,’济南’)
3)王五的生日可以为空,那么添加王五的生日时,可以用null代替。
insertintoinfo(StuId,Name,ClassId,Birthday,phone,Address)
values(1003,’王五’,1102,null,’15502’,’莱芜’)
注:
班级编号是int型,添加数据时不用加单引号’’。
char、varchar类型的数据需要加单引号。
班级表class
ClassId
ClassName
11
理科班
12
理科班
13
文科班
createtableclass
(
ClassIdintnotnull,
ClassNamevarchar(20)notnull,
primarykey(ClassId)
)
向class表添加数据
Insertintoclass(classId,classname)values(11,’理科班’)
Insertintoclass(classId,classname)values(12,’理科班’)
Insertintoclass(classId,classname)values(13,’文科班’)
选课表course
CourseId
CourseName
C01
数学
C02
语文
C03
英语
createtablecourse
(
CourseIdvarchar(10)notnull,
CourseNamevarchar(20)notnull,
primarykey(CourseId)
)
向select表添加数据
Insertintocourse(CourseId,CourseName)values(‘C01’,’数学’)
Insertintocourse(CourseId,CourseName)values(‘C02’,’语文’)
Insertintocourse(CourseId,CourseName)values(‘C03’,’英语’)
成绩表score
CourseId
StuId
Grade
C01
1001
92
C02
1001
90
C03
1001
88
C01
1002
25
C02
1002
C03
1002
58
C01
1003
92
C02
1003
76
C03
1003
84
createtablescore
(
CourseIdcharnotnull,
StuIdintnotnull,
Gradedecimal(5,2)
)
向select表添加数据
Insertintoscore(CourseId,StuId,Grade)values(‘C01’,1001,92)
Insertintoscore(CourseId,StuId,Grade)values(‘C02’,1001,90)
Insertintoscore(CourseId,StuId,Grade)values(‘C03’,1001,88)
Insertintoscore(CourseId,StuId,Grade)values(‘C01’,1002,25)
Insertintoscore(CourseId,StuId,Grade)values(‘C02’,1002,null)
Insertintoscore(CourseId,StuId,Grade)values(‘C03’,1002,58)
Insertintoscore(CourseId,StuId,Grade)values(‘C01’,1003,92)
Insertintoscore(CourseId,StuId,Grade)values(‘C02’,1003,76)
Insertintoscore(CourseId,StuId,Grade)values(‘C03’,1003,84)
更新数据
Update
更新info表中学号1002学生姓名为李斯
updateinfosetname=’李斯’whereStuId=1002;
删除数据
Delete
删除学号为1003学生的信息
deletefrominfowherestuId=1003;
删除整个表中数据:
truncatetable表名。
例:
删除info表中所有数据:
truncatetableinfo;
查询:
1)单表查询:
数据来自于一张表
○查询表中所有信息
select*fromInfo;
○查询所有学生姓名
selectNamefromInfo;
selectNamefromInfolimit2;--查询所有学生姓名,限制显示两行数据,其他的数据不显示
○排序orderby:
查询学生的姓名,学号,电话,按照电话排序
selectStuId,Name,PhonefromInfoorderbyphone;--默认按照电话号码大小升序排列
selectStuId,Name,PhonefromInfoorderbyphoneASC;--asc是升序排列(系统默认)
selectStuId,Name,PhonefromInfoorderbyphoneDESC;--decs是降序排列,按号码由大到小显示信息
○找到年龄最大的学生姓名
selectName,BirthdayfromInfoorderbyBirthdayDESClimit1;--orderby和limit连用的小窍门
○子查询where:
查询张三的个人信息
select*fromInfowhereName=’张三’;
○子查询:
查询李四的生日
selectBirthdayfromInfowhereName=’李四’;
○不匹配查询--<>
查询班级编号不是1102班的学生信息
select*fromInfowhereclassId<>1102
○范围查询between:
从成绩表中找出70-85分的学生学号
selectStuIdfromscorewheregradebetween70and85;
注:
使用between要指定两个值,查询时范围包含这两个值。
Where子句中操作符:
大于>小于<等于=不等于!
=、<>
大于等于>=小于等于<=范围between
○空值NULL查询--找出成绩表中分数为空的课程号和学生学号
SelectCourseId,StuIdfromscorewheregradeisnull;
○where组合查询--and:
找到课程号为C01并且分数为92的学生学号
selectStuIdfromscorewhereCourseId=’C01’andgrade=92;
○where组合查询--or:
找到课程号为C02或者分数小于60的学生学号
selectStuIdfromscorewhereCourseId=’C01’orgrade<60;
○通配符:
假如info表中有:
张三,张华,张三丰,张二丫
(1)%:
%能匹配0-多个字符
select*frominfowhereNamelike’张%’;
能找出所有姓‘张’的学生信息
(2)下划线_:
只能匹配一个字符
select*frominfowhereNamelike’张_’;
只能找出张三,张华。
○拼接字段:
使用concat()函数实现---------------注:
函数都要有括号
例如将学号和姓名连接起来:
即***人,学号***。
selectconcat(Name,’,’,stuId)frominfoorderbyname;
查询结果应该是:
+--------------------+
|张三,1001|
|李四,1002|
|王五,1003|
+---------------------+
selectconcat(RTrim(Name),’,’,RTrim(stuId))as‘组合信息’
frominfoorderbyname;
注:
RTrim是去掉姓名和学号后面的空格(参照char和varchar存储不同的那里进行理解)
AS是给‘姓名、学号’连接起来的长字符串起个列名
查询显示为:
+--------------------+
|组合信息|
张三,1001
李四,1002
王五,1003
○分组数据groupby
统计每门课有多少人考试
selectCourseId,count(*)as‘考试人数’fromscoregroupbyCourseId;
(图1)
注:
途中count(*)应该显示为:
考试人数。
我用的Oracle这个功能没法这么用。
一般groupby与orderby连用,因为groupby只是分组,需要orderby按照一定顺序排序。
selectCourseId,count(*)fromscore
groupbyCourseId
orderbycourseid;
(注意与图1的不同)
(图2)
2)多表查询
数据存在不同的表中,例如要查询张三所在班级名称,只能根据Info表中学生姓名name‘张三’找到其所在班级的班级编号classId,根据classId从class表中查到班级名称className。
查询学生姓名,学号及所在班级名称。
selectstuId,Name,classnamefromclass,infowhereinfo.classid=class.classid;
内联结innerjoin||外联结是outerjoin用法和innerjoin一样
selectstuid,name,classnamefrominfoinnerjoinclassoninfo.classid=class.classid;
通过内联结查询张三的学号,班级信息
selectstuid,name,classnamefrominfoinnerjoinclassoninfo.classid=class.classidwherename='张三';
(两个表中所有信息都能查)
select*frominfoinnerjoinclassoninfo.classid=class.classidwherename='张三';
三个表内联结举例:
查询李四的语文成绩。
题目分析:
李四存在info表中,根据李四学号stuId能从score表中(score表也存了学号)找到李四所有考试成绩(grade)。
根据courseName=’’语文找course表中courseId。
两个条件决定了找到的成绩是唯一的。
selectinfo.stuid,name,coursename,gradefrom
infoinnerjoinscoreoninfo.stuid=score.stuid
innerjoincourseonscore.courseid=course.coursei
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MySQL 简单 操作