(1)名字可以由当前字符集中的任何字母数字字符组成,下划线(_)和美元符($)也可以
(2)名字最长为64个字符
(1)行:字段
1.字段名最长可达64个字符
2.字段名可包含中文、英文字母、数字、下划线(_)、井字符(#)、货币符($)及at符(@)
3.同一个表中,各个字段的名称绝对不能重复
4.字段名可以用中文
(2)列:数据记录
(1)字符型(一个汉字两个字符)
char(n):固定长度字符串
varchar(n):长度可变字符串
(2)日期类型
date:日期(年月日)
datetime:精确到毫秒 时间(年月日时分秒)
smalldatetime:精确到秒
(3)数值型(MySQL没有double型)
int
float
decimal:对精度要求较高
(1)实体完整性
1.能够唯一标识表中的每一条记录
2.实现方式:主键、唯一键、标识列
(2)域完整性
1.表中特定列数据的有效性,确保不会输入无效的值
2.实现方式:数据类型、默认值、检查约束、非空值
(3)参照完整性
1.维护表间数据的有效性、完整性
2.实现方式:建立外键关联另一个表的主键
(4)自定义完整性
1.根据业务处理流程定义的特定业务规则
2.实现方式:储存过程、触发器、规则
(1)主键(primary key):要求主键列数据唯一,并且不能为空
(2)唯一约束(unique):要求该列数据唯一,允许为空,但只能出现一个空值
(3)检查约束(check):某列取值范围限制、格式限制等
(4)默认约束(default):某列的默认值
(5)外键(foreign key):用于两表间建立关系,需要指定引用主表的哪列
*主键与唯一性约束的区别
1.主键所在的列不允许有空值,唯一约束所在的列允许有一个空值
2.每个表中只可以有一个主键,但可以有多个唯一键
a. primary key(相当于默认为not null)
b. not null/null
c. unique(默认约束)
例:pricr money default 0.01
d. default
e. auto_increment(指定设置字段的值自动增加)
(1)主键约束:primary key
语法格式:[constraint] <约束名> primary key(约束名)
primary key(书号,书店编号,销售日期),
(2)外键约束:foreign key
语法格式:[constraint] <约束名> foreign key(<外键>) references <被参照表(主键)>
(3)唯一性约束:unique
语法格式:[constraint] <约束名> unique(<字段名>)
例:idcard char(18) unique null
(4)检查约束:check(条件表达式)
语法格式:[constraint] <约束名> chack (条件表达式)
例:chksex check (sex in('男','女'))
Phone char(8) check (phone like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
sex char(10) check(sex='male' or sex='female') default 'male',
例:create table sc(
sno char(10) primary key,
con varchar(5) not null,
degree float check (degree>=0 and degree<=100),
foreign key(con) references course(cno)
);
create table student(student_no char(10) primary key comment '学号',
student_name char(10) not null comment '姓名',
student_contact char(11) not null comment '学生联系方式' check(student_contact rlike '[0-1][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),
class_no int comment '学生班级',
foreign key(class_no) references classes(class_no));
1. 在定义基本表语句时,NOT NULL参数的作用是什么?
答:数据库字段属性,使用NOT NULL后该字段不接受NULL值。如果你想在表中插入数据时,NOT NULL的字段必须赋值,可以是空值,但是不能为NULL。
2. 主键可以建立在“值为NULL”的列上吗?
答:不可以,规定主键的值不能为空
语法结构:
create table <表明>(
<字段1> <数据类型1> [<列级完整性约束条件1>]
[,<字段2> <数据类型2> [<列级完整性约束条件2>]] [,...]
[,<表级完整性约束1>]
[,<表级完整性约束2>] [,...]
);
说明:<>:必选项
[ ]:可选项
例:create table teaching
(con char(5) not null,
ton varcher(4) not null,
cterm tinyint,
foreign key (cno) references coures (cno),
foreign key (tno) references coures (ton)
);
语法格式:
describe <表名>;
desc <表名>;
语法格式:
show create table <表名>;
语法格式:alter table <表名>{
[add <新字段名> <数据类型> [<列级完整性约束条件>][first|after 已存在的字段名] ]
|[modify <字段名1> <新数据类型> [<列级完整性约束条件>] [first|after 字段名2]]
|[change <旧字段名> <新字段名> <新数据类型>]
|[drop <字段名> | <完整性约束名>]
|[rename [to] <新表名>]
};
例:alter table tb_student add familycontacts varchar(8);
alter table tb_student rename to student;
alter table student drop familycontacts ;
语法格式:
create table 新表名 select * from 旧表名
语法格式:
drop table [if exists] <表名1> [,[表名2],...];
*在编写SQL语句时,遵循某种准则可以提高语句的可读性,并且易于编辑,这是很有好处的。
1.SQL语句对大小写不敏感。但是为了提高SQL语句的可读性,子句开头的关键字通常采用大写形式。
2.SQL语句可写成一行或多行,习惯上每个子句占用一行。
3.关键字不能在行于行之间分开,并且很少采用缩写形式
4.SQL语句的结束符为分号“;”,分号必须放在语句中最后一个子句的后面,但可以不在同一行。
1、创建mydb数据库:create database mydb;
2、显示当前的所有数据库:show database
3、删除mydb数据库:drop datdbase mydb;
Mysql -h localhost -r root -p
Create database if not exists mydb;
Show databases;
Use mydb;
Drop database if exists mydb
alter database db_test character set gbk;
Show engines;
Use mydb;
Create database mydb character set gbk(
Cno char(8),
Sname char(10)
);
4、MySQL的数据库文件有几种?扩展名分别是什么?
答:数据文件:.myd 索引文件:.myi 表定义文件:.frm 日志文件:.log
语法格式:insert into <表名>[(列名1,列名2,...)]
values (<常量清单>);
例1:insert into course
values(‘C01’,’数据库’),(‘C02’,’数学’);
例2:insert into student (sno,sname)
values('2002010102','张三');
语法格式:insert into <表名>[(列名1,列名2,...)]<子查询语句>
例:把平均成绩大于80分的学生的学号和平均成绩存入另一个已知的基本表s_grade(SNO,AVG_GRADE)中
1、通过select语句从sc表中查询出平均成绩大于80的学生
2、通过insert命令将这些数据移入新表s_grade中
insert into s_grade(sno,avg_grade)
select sno,avg(degree)
from sc
group by sno
having avg(degree)>80
group by 分组 having 条件
order by 排序 desc(降序)
语法格式:update <表名>
set <列名1>=<表达式1>[,<列名2>=<表达式2>][,...]
[where<条件表达式>];
set命令:给字段赋新值
例1:update student
set ssex='女',sdept='软件系'
where sname='张丽';
例2:update sc
set degree=600
where degree<60;
例3:update sc
set degree=0
where sno in(select sno from student where sdept='计算机工程系');
语法格式:delete [from] <表名>
[where<条件表达式>];
例1:delete from student
//where sno='2005030301';
例2:delete from sc;
例3:delet from sc
where sno in(select sno from student where sdept='计算机工程系');
*delete语句只能删除一个基本表中的数据记录,但是,在where语句中条件表达式可以来自几个表的复合条件
思考题:
1. 现有某学生办理退学,要求删除学生信息管理数据库中该生的数据记录,两表间存在主从关系,请回答应先删除主表的记录还是子表的记录?并说明原因。
答:先删除子表记录在删除主表记录。因为子表与主表一一对应,删除主表记录时,需要先把子表对应的记录删除,否则无法删除