前言:这篇送给那些想要学会数据库,但又不想花太多时间的同学们。看了这篇数据库知识,轻轻松松搞定它!用不同的工具操作数据库命令可能会有小小的不同,我用的是系统自带的cmd。(凡是数据库名称,数据表名称若有对不上的地方,不重要!!!替换成你自己的数据库名称,数据表名称即可!)
命令大小写都可以!!! 命令中间的或者后面的标点符号都是英文符号!
1、数据库的创建,删除,显示,使用。
(1)创建数据库:
create database 数据库名;
例如:create database test;
(如果之前没创建过数据库,就会显示Empty set
)
(2)删除数据库:drop database 数据库名;
例如:create database text;
(3)显示所有的数据库:show databases;
(4)使用数据库(选中某个数据库进行操作):use 数据库名;
例如:use test;
(若要对某个数据库进行操作,那么创建完数据库,或者对某数据库进行操作前必须执行这一步!)
2、数据表的创建,删除,显示。
(1)创建数据表:
create table 数据表名(
名称1 类型(大小)(其他属性:主键,是否可以为空,汉语显示等等),
名称2 类型(大小)(其他属性:主键,是否可以为空,汉语显示等等),
······
名称n 类型(大小)(其他属性:主键,是否可以为空,汉语显示等等),
);
例:create table mingzhu(
name varchar(20),
author varchar(20),
sex char(5));
(2)删除数据表:drop table 数据表名;
例如:drop table mingzhu6;
(3)显示所有的数据表:show tables;
(4)显示数据表的结构:describe 数据表名;
例如:describe mingzhu;
3、数据表的增,删,查,改。
(1)增:
insert into 数据表名 values('name1','author1','sex1');
(根据定义字段的类型输入对应类型的值)例如:insert into mingzhu values ('红楼梦','曹雪芹','男');
insert into mingzhu values('hongloumeng','caoxueqin','nan');
注意: 创建数据表时应该在后面加上:default charset=utf8
,否则将中文插进去会是乱码!
例如:
(2)删: 删除数据表里的数据:delete from 数据表名 where 表的一个字段="字段的内容";
例如:delete from mingzhu1 where name="红楼梦";
(3)查: 查看数据表的全部信息:select * from 数据表名;
例如:select * from mingzhu;
根据某一字段查询相应的内容:select 要查询的字段 from 数据表名 where 字段="该字段的内容";
例如:select name from mingzhu1 where author="罗贯中";
(4)改: 修改数据表里的数据:update 数据表名 set 字段="要修改后的样子" where 另一个字段="能根据这个来定位要修改的字段";
例如:update mingzhu1 set author="wuchengen" where name="西游记";
4、MySQL中常用的数据类型:
MySQL支持多种类型,大致可分为三类:数值,日期/时间和字符串(字符)类型。
(1)字符串数据类型:
1.char(n)和varchar(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m*3个字节。
2.同时char和varchar最大的区别就在于char不管实际value都会占用n个字符的空间,而varchar只会占用实际字符应该占用的空间+1,并且实际空间+1<=n。
3.超过char和varchar的n设置后,字符串会被截断。
4.char的上限为255字节,varchar的上限65535字节,text的上限为65535。
5.char在存储的时候会截断尾部的空格,varchar和text不会。
6.varchar会使用1-3个字节来存储长度,text不会。
(2)数值数据类型:
整型:
浮点型:
日期和时间数据类型:
其他类型:
1.enum(“member1″, “member2″, … “member65535″) enum数据类型就是定义了一种枚举,最多包含65535个不同的成员。当定义了一个enum的列时,该列的值限制为列定义中声明的值。如果列声明包含NULL属性,则NULL将被认为是一个有效值,并且是默认值。如果声明了NOT NULL,则列表的第一个成员是默认值。
2.set(“member”, “member2″, … “member64″) set数据类型为指定一组预定义值中的零个或多个值提供了一种方法,这组值最多包括64个成员。值的选择限制为列定义中声明的值。
5、MySQL建表约束:primary key
(1)主键约束:它能够唯一确定一张表中的一条记录,也就是我们通过给某个字段加约束,就可以使得该字段不重复且不为空。
例如:假如你设置一张表中的字段name为主键,那么你就不能插入相同的name的内容,且插入的name不能为空,若你非要背道而驰,那就会报错喽。(有两种设置主键的方法!)
下面设置的是联合主键,只要id和name重合时不一样就不会出现错误。即:id一样,name不一样,id不一样,name一样都是正确的。只有id一样且name一样才会出错。
(2)自增约束:和主键约束一起用,可以顺序的插入数据。
再插入一个:
修改表结构:添加主键,可以:alter table 数据表名 add primary key(字段);
例如:alter table mingzhu5 add primary key(id);
删除主键:例如:alter table mingzhu5 drop primary key;
还可以添加:使用modify修改字段,添加约束。例如:alter table mingzhu5 modify id int primary key;
(3)唯一约束:约束修饰的字段的值不能重复。与主键约束的区别是:唯一约束可以为空。通过:
alter table mingzhu5 add unique(name)
添加唯一约束。也可以在建表的时候添加,和主键约束相似。
create table mingzhu5(
id int unique,
name varchar(30),
author varchar(30))default charset=utf8;
或者:
create table mingzhu5(
id int,
name varchar(30),
author varchar(30),
unique(id,name) //这种的可以使多个字段是唯一约束,只要组合在一起不重复就OK
)default charset=utf8;
删除唯一约束:例如:
alter table mingzhu5 drop index name;
,modify添加约束:alter table mingzhu5 modify name varchar(30) unique;
总结:
1、建表的时候就可以添加约束,两种。。。
2、可以使用alter。。。add。。。添加约束
3、可以使用alter。。。modify。。。添加约束
4、删除约束:alter。。。drop。。。
(4)非空约束:修饰的字段不能为空。建表的时候在字段后面直接加上 not null 就好。
(5)默认约束:当我们插入字段值的时候,如果没有传值,就会使用默认值。
可以设置默认值。默认值设置完毕,如果没有传入其他的值,则会显示默认值,如果传的有值,就会显示传入的值。
也可以用alter。。。add。。。//alter。。。modify。。。添加默认值。
(6)外键约束:涉及到两个表(主表,副表)
显示新建的两个数据表:
插入四个班级:
结论:1、主表classes中没有的数据值,在副表中,是不可以使用的;
2、主表中的记录被副表引用,是不可以删除的。
6、数据库的三大范式
(1)第一范式(1NF):数据表中的所有字段都是不可分割的原子值。
字段值还可以拆分的,就不满足第一范式,字段设计的越详细不一定就是最好的,要根据实际情况来判断。
(2)第二范式(2NF):在满足第一范式的条件下,第二范式要求除主键外的每一列都必须完全依赖主键。如果出现不完全依赖的情况,只可能出现在联合主键的情况下。
举例:设计一个订单表:当出现以下问题时需要拆分表!
(3)第三范式(3NF):在满足第二范式的条件下,除主键列之外的其他列之间不能有传递依赖关系。
7、语句练习
下面的示例语句都是有应用场景的,仅供参考,切忌生搬硬套!!!
(1)查询学生表的所有记录:
select * from students;
(2)查询students表中的所有记录的sname,sex和class列:select sname,sex,class from students;
(3)查询教师所有的单位即不重复的depart列:select distinct depart from teacher;
(distinc:排除重复)
(4)查询score表中成绩在60到80之间的所有记录:select * from score where degree between 60 and 80;
||select * from score where degree>60 and degree<80;
(5)查询score表中成绩为85,86或88的记录(同一个字段用in):select * from score where degree in(85,86,88);
(6)查询student表中“95031”班或性别为“女”的同学记录(不同的字段用or):select * from student where class='95031' or sex='女';
(7)以class降序查询student表的所有记录:select * from student order by class desc;
//降序;select * from student order by class asc;
//升序默认(asc:也可不写)
(8)以cno升序,degree降序查询score表的所有记录:select * from score order by cno asc,degree desc;
//先按照cno升序,遇到相同的cno,再根据degree降序
(9)查询“95031”班的学生人数:select count(*) from student where class='95031';
(10)查询score表中的最高分的学生学号和课程号(子查询或者排序):
子查询:select sno,cno from score where degree=(select max(degree) from score);
|| ①select max(degree) from score;
②select sno,cno from score where degree=max(degree);
排序:select sno,cno,degree from score order by degree;
//默认的升序排列,最后一个就是最大的
(11)查询score表中至少有2名学生选修的并以3开头的课程的平均分数:
select cno,avg(degree) from score group by cno having count(cno)>=2 and cno like '3%';
(12)查询学号为108,101的同学同年出生的所有学生的sno,sname和sbirthday列:select * from student where sno in (108,101);
select year(sbirthday) from student where sno in (108,101);
//year()截取年份,month()截取月份