数据库概述02(完整性约束)

完整性约束

DBMS为了保证存储的数据都是完整有效的,避免存放垃圾数据,所以提供针对插入的数据进行检查。
开发人员指定对应的规则,由DBMS负责检查,如果试图插入不合法的数据,则会自动报错,拒绝插入
实际有6种约束,可以分为3大类完整性约束。有些老外的书种提出的是4种【域完整性】
实体完整性,由主键约束实现
参照完整性,由外键约束实现
用户自定义完整性,由其他4种约束实现
实际开发中除了主键约束外,其它约束一概不添加。其他的数据检查一般依赖应用程序实现,为了代码测试方便
1、非空约束,指定列值不允许为空
插入null值有2种情况:直接插入null,或者没有在表上定义default而不插入数据,则默认null
2、默认约束default
一般默认约束经常和非空约束一起使用,当不插入数据时,默认值生效
3、主键约束,又叫做实体完整性,不允许数据重复存储
主键可以唯一标识一行数据,一个表中只能有一个主键,但是主键允许是由多个列构成
主键约束含义是非空、唯一
create table t1(id int not null); --不允许id列值为null
create table t2(id int null); – 允许id列值为null
create table 3(id int);-- 允许id列值为null
create table t1(id int not null default 0); – not null不是必须的
create table t2(id datetime default now()); – 正确的,过去只有timestamp default
current_timestamp

使用InnoDB存储引擎时,如果数据表没有设置主键,那么Innodb会给该表设置一个不可见,长度为6字节的默认主键 row_id。Innodb维护了一个全局的dict_sys.row_id值,这个值,被所有无主键的数据表共同使用,每个无主键的数据表,插入一行数据,都会是当前的dict_sys.row_id的值增加1
其实row_id的值在存储时,数据长度为8字节,只不过Innodb只使用后6个字节。那么row_id的值,写到数据表中时就有一下两个特点:
1.row_id写入表中的值范围,是从0-2^48-1。
2.当row_id的值为2的48次方时,再进行数据插入,那么row_id的后6个字节的值,就全部为0了。也就是说,当row_id的值到了2^48次方-1后,再次插入数据,下一个值就是0,然后开始循环。不过和自定义主键不同的是,row_id标识的主键,没有唯一性约束,当插入数据的row_id值,在表中已经存在的话,那么写入的数据会"悄无声息"覆盖已存在的数据。
表尽可能都要设置主键,主键尽量使用bigint类型,21亿的上限还是有可能达到的,比如魔兽,虽然说row_id上限高达281万亿,但是覆盖数据显然是不可接受的。根据主键是否有业务含义可以分为业务主键和代理主键
4、唯一约束 unique
不允许添加唯一性约束的列出现重复值
可以没有null值约束,而且也不能针对null进行唯一性判定
5、外键约束,又叫做参照完整性
6、检查约束check
create table t1(id int primary key,…); – 单一主键,
create table t2(
id int not null,…
primary key(id) – 注意这里的主键约束允许使用复合主键,多个列构成的主键
);
复合主键中的任一列即使没有添加not null约束,也不允许为null

create table t1(id int unique,name varchar(20));
insert into t1 values(1,‘zhangsan’);
insert into t1(name) values(‘zhao4’);-- id为null
insert into t1(name) values(‘zhao4’);-- id为null,两次null并不会报错
insert into t1 values(1,‘li4’); – 报错
mysql> create table t23(
-> id int,
-> name varchar(32),
-> unique(id,name)); – 多个列的组合不允许重复,单一列允许重复

DDL表操作
创建操作
快速创建一个表和另外一个表的结构相同,只是克隆表结构,不会克隆数据
修改表结构,语法规则为 alter table 表名称 add/drop/modify 列名称 [类型 约束]
修改列的名称
删除表 drop table 表名称
查看当前数据库种的所有表
查看表结构
mysql> create table t24(
-> id boolean default 1,
-> check(id in(1,0)));

create table tb_student(
id bigint primary key auto_increment,
name varchar(10) not null comment ‘说明信息’, – comment用于对表或者列添加说明信息
birth date,
sex boolean default 1,
salary numeric(8,2)
)engine=innodb default charset utf8;

create table 新表名称 like 已经存在的旧表名称;
create table 新表名称 as
select id emp_no,name emp_name from 克隆表的名称
where 1=2;
alter table tb_student add class_name varchar(20) default ‘软件19’; – 新增列
alter table tb_student drop column salary; – 删除指定列
alter table tb_student modify class_name int; – 修改列定义时,要求已经存在的数据必须符合规则,否则修改失败。modify一般用于修改列的数据类型和长度,但是如果有数据则必须和目标类型匹配,否则修改失败

1 alter table 表名称 change 旧有列名称 新列名称 类型 约束;
drop table tb_student;
drop table if exists tb_student;

show tables;
show tables from sys;

查看创建表的sql语句
其它操作
重命名表 RENAME TABLE emp TO myemp;
ALTER table dept RENAME [TO] detail_dept;
清空表
TRUNCATE TABLE语句:删除表中所有的数据、释放表的存储空间
TRUNCATE TABLE detail_dept; TRUNCATE语句不能回滚,而使用 DELETE 语句删除数据,可以回滚
阿里开发规范:
【参考】TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE无事务且不触发 TRIGGER,有可能造成事故,故不建议在开发代码中使用此语句。
说明:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。

MySQL运算符
MySQL运算符主要包括3大类:比较运算符、算术运算符、逻辑运算符
算术运算符
加+、减-、乘*、除/、求余%
特殊操作
mysql> select 1+2;
±----+
| 1+2 |
±----+
| 3 |
±----+
1 row in set (0.00 sec)
mysql> select 1/2;
±-------+
| 1/2 |
±-------+
| 0.5000 |
±-------+
1 row in set (0.00 sec)
mysql> select 5%2;
±-----+
| 5%2 |
±-----+
| 1 |
±-----+
1 row in set (0.00 sec)

mysql> select ‘5a’+2;
±-------+
| ‘5a’+2 |
±-------+
| 7 |
±-------+
1 row in set, 1 warning (0.00 sec)
mysql> select ‘a5’+2;
±-------+
| ‘a5’+2 |
±-------+
| 2 |
±-------+
1 row in set, 1 warning (0.00 sec)
mysql> select 123.45%2.52;
±------------+
| 123.45%2.52 |

运算符 语法 说明
= a=b 如果参与计算的两个操作数相等则为true,否则false
!=或者<> a!=b或者a<>b 如果两个操作数不相等则true[1],否则false[0]
< a

a>b 如果a大于b则true
<= a<=b 小于等于
= a>=b 大于等于
比较运算符
in或者not in
in用于判断某个列的取值是否为指定的值,使用in运算符时指定的值是离散的数据,不是连续值
select * from tb_student where age in(18,28,15)含义是 age=18 or age=28 or age=15
select * from tb_student where age not in(18,28,15)含义是 age!=18 and age!=28 and
age!=15
查询孙权、黄盖、张三以及李四同学的成绩值
– 查询张三以及李四同学的成绩
select score from tb_student where name=‘张三’ or name=‘李四’
select score from tb_stuent where name in(‘张三’,‘李四’) – in中的数据个数没有限制
between/and
用于判断数据是否在指定的范围内,连续值
查询成绩及格并且不属于优秀的所有学生信息
±------------+
| 2.49 |
±------------+
1 row in set (0.00 sec)
mysql> select -123.45%2.52;
±-------------+
| -123.45%2.52 |
±-------------+
| -2.49 |
±-------------+
1 row in set (0.00 sec)

– 写法1:使用条件拼接
select * from tb_student where score>=60 and score<=85;
– 写法2
select * from tb_student where score between 60 and 85;
–如果需要的是不在指定范围内部
select * from tb_student where score not between 50 and 85;

语法 说明
&&或者and a and b或者a&&b 逻辑与,如果参与计算的两个操作数为true,否则false
|| 或者or a or b或者a||b 逻辑或,如果参与计算的双反,只要一方为false,则返回false
not或者! not a或者!a 逻辑非,如果操作数为false则结果为true
like/not like
主要针对字符串类型数据进行模糊查询,通配符_和%
查询不姓张的同学
regexp是在mysql中针对字符串类型进行正则式进行判断,not regexp
<=> 如果两数相同为true,即使是null
is null/is not null
判断是否为空,为空则返回true
逻辑运算符
练习题
样例数据表
查询全体学员的姓名及其出生年份
查询李姓学员的姓名及其出生年份
查询年龄在18-23岁之间的学生姓名、系别和年龄
1 select * from tb_student where name not like ‘张%’
create table if not exists tb_student(
id bigint not null auto_increment,
name varchar(32) not null,
age int default 16,
sex boolean default 1,
dept varchar(32),
primary key(id)
) engine=innodb default charset utf8;
– 插入测试数据
insert into tb_student values(null,‘小胖’,18,1,‘软工’),(null,‘东方’,16,0,‘机
壳’),(null,‘仗义’,19,1,‘大数据’);

select name, 2022-age as birth_year from tb_student;
select name, 2022-age as birth_year from tb_student where name like ‘李%’;
查询年龄不在18-23岁之间的学生姓名、系别和年龄
查询软工、机壳和大数据系的所有学生姓名和性别
查询既不是软工、机壳,也不是大数据系的所有学生姓名和性别
查询张xx学生的姓名和年龄
查询名字中有方的学生信息
查询age确定的学生信息
注意=null或者!=null都是错误的,应该使用is null或者is not null
查询性别不确定的学生信息
查询学生所在的系别信息
distinct自动去除重复值,all显示所有数据
查询系别和学生年龄信息
select name,dept,age from tb_student where age>=18 and age<=23 – 注意两头相等
select name,dept,age from tb_student where age between 18 and 23 --小值在前
select name,dept,age from tb_student where age in(18,23,22,20,21,19)

select name,dept,age from tb_student where age<18 or age>23;
select name,dept,age from tb_student where age not between 18 and 23;

select name,sex from tb_student where dept in(‘软工’,‘机壳’,‘大数据’);
select name,sex from tb_student where dept=‘软工’ or dept=‘机壳’ or dept=‘大数
据’;

select name,sex from tb_student where dept not in(‘软工’,‘机壳’,‘大数据’);
select name,sex from tb_student where dept!=‘软工’ and dept!=‘机壳’ and
dept!=‘大数据’;

select name,age from tb_student where name like ‘张__’;
select name,age from tb_student where name like ‘张%’ and length(name)=3; –
length针对中文的处理为获取其中所占字节数,不是字符数

1 select * from tb_student where name like ‘%方%’;
1 select * from tb_student where age is not null;
1 select * from tb_student where sex is null;
select all dept from tb_student; – all不会去除重复值,默认all
select distinct dept from tb_student;

mysql> select * from tb_student;
±—±-------±-----±-----±-------+

问题:如果auto_increment到达上限时MySQL是如何处理的
auto_increment默认从1开始,上限取决于列的数据类型。如果表中id列已经有指定的值,则max(id)+1
如果删除数据后,数据库系统仍旧会记录已经生成过的数据,不会从新开始,而是在以前的基础上继续
加1
| id | name | age | sex | dept |
±—±-------±-----±-----±-------+
| 1 | 小胖 | 18 | 1 | 软工 |
| 2 | 东方 | 16 | 0 | 机壳 |
| 3 | 仗义 | 19 | 1 | 大数据 |
| 4 | 张骞 | 16 | 1 | 软工 |
| 5 | 张小骞 | 16 | 1 | 软工 |
±—±-------±-----±-----±-------+
5 rows in set (0.00 sec)
试图取消软工 16这条数据的重复
– 语法错误
mysql> select distinct dept,distinct age from tb_student;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use
near ‘distinct age from tb_student’ at line 1
–正确的写法
select distinct dept,age from tb_student;

create table t1(
id int primary key auto_increment,
name varchar(20)
);
insert into t1 values(2147483646,‘zhangsan’);
insert into t1(name) values(‘lisi’);
mysql> select * from t1;
±-----------±---------+
| id | name |
±-----------±---------+
| 2147483646 | zhangsan |
| 2147483647 | lisi |
±-----------±---------+
2 rows in set (0.00 sec)
insert into t1(name) values(‘wangwu’);
ERROR 1062 (23000): Duplicate entry ‘2147483647’ for key ‘PRIMARY’ – 意思是
再次生成了最大的int值2147483647作为主键,此时主键冲突

如果需要重新开始生成连续整数,只能将表中所有数据删除
建议:因为auto_increment生成数据是从1开始,不会出现负整数,所以一般建议使用bigint unsigned
5类聚集函数
聚集函数用于对于一个集合中的数据进行处理,不是一行一行的数据
count统计行数、sum求和、max最大值、min最小值、avg平均值
计数
语法 count([all/distinct] 列名称/*)
获取总学生数
需要统计选修1号课程的学生人数
mysql> delete from t1 where name=‘lisi’; – 2147483647
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
±-----------±---------+
| id | name |
±-----------±---------+
| 2147483646 | zhangsan |
±-----------±---------+
1 row in set (0.00 sec)
mysql> insert into t1(name) values(‘wangwu’); – 2147483647
Query OK, 1 row affected (0.00 sec)

1 truncate table t1; – 删除整表数据,不能使用delete from
select count(*) from tb_student;
select count(1) from tb_student;
select count(distinct dept) from tb_student; – 获取系的个数
mysql> select * from tb_student;
±—±-------±-----±-----±-------+
| id | name | age | sex | dept |
±—±-------±-----±-----±-------+
| 1 | 小胖 | 18 | 1 | 软工 |
| 2 | 东方 | 16 | 0 | 机壳 |
| 3 | 仗义 | 19 | 1 | 大数据 |
| 4 | 张骞 | 16 | 1 | 软工 |
| 5 | 张小骞 | 16 | 1 | 软工 |
| 6 | 从来 | 16 | 1 | NULL |
±—±-------±-----±-----±-------+
6 rows in set (0.00 sec)
select count(dept) from tb_student; – 进行计数统计时,null不参与统计

学生编号 课程编号 成绩
1 3 45
1 3 70
假设选择表中需要记录补考成绩,也就是意味着课程会有重复,则问题1:primary key(cid,sid)就是错误的,由于出现重复计数,则选修人数统计出错
统计值
用于数值类型的列,不要用于其他类型。max min sum avg
max/min可以用于日期类型比较,最新的日期最大
1 select count(*) from tb_choice where cid=1;
1 select count(distinct sid) from tb_choice where cid=1;
ysql> select * from tb_student;
±—±-------±-----±-----±-------+
| id | name | age | sex | dept |
±—±-------±-----±-----±-------+
| 1 | 小胖 | 18 | 1 | 软工 |
| 2 | 东方 | 16 | 0 | 机壳 |
| 3 | 仗义 | 19 | 1 | 大数据 |
| 4 | 张骞 | 16 | 1 | 软工 |
| 5 | 张小骞 | 16 | 1 | 软工 |
| 6 | 从来 | 16 | 1 | NULL |
| 7 | 张展 | 16 | 1 | NULL |
±—±-------±-----±-----±-------+
7 rows in set (0.00 sec)
mysql> select max(age) from tb_student;
±---------+
| max(age) |
±---------+
| 19 |
±---------+
1 row in set (0.00 sec)
mysql> select min(age) from tb_student;
±---------+
| min(age) |
±---------+
| 16 |
±---------+
1 row in set (0.00 sec)
mysql> select avg(age) from tb_student; – null值不参与计算,除非使用空值处理函数
将其转换为确定数值才可以
±---------+
| avg(age) |

查询选修1号课程的学生最高成绩和平均成绩
问题
select count() 、 select count(1) 和 select count(列名称)
列名为主键 count(列名) 比 count(1) 速度快;如果列名不是主键,则 count(1) 比 count(列名)

如果表多个列并且没有主键,则 count(1) 比 count(
) 速度快,如果有主键 `count(主键列名) 速
度最快,如果表中只有一个列 count() 速度最快
count(1) 会统计表中的所有记录数,包括字段为null的记录; count(列名称) 则列为null时不统计
MySQL针对不同的存储引擎进行了优化处理,MyISAM会将表的总行数记录下来,供 count(
) 查
询使用; Innodb则会在扫描表时选择最小的索引成本执行,所以在Innodb中 count(*) 和
count(1) 实质上没有区别,而且执行效率一致,只有 count(列名称) 需要进行null值列的判断,
所以效率低一些
对查询结果分组
可以使用group by子句对查询结果进行分组处理,经常会使用聚集函数
如果不使用分组,聚集函数则用于处理所有查询结果数据
如果使用分组,则分别作用于各个分组查询的结果数据
获取男女生的平均年龄
按照性别进行分组 group by sex ,不同的sex值则放入不同的组中
平均值就是聚集函数,针对一个集合中的数据进行处理
±---------+
| 16.7143 |
±---------+
1 row in set (0.00 sec)
mysql> select sum(age) from tb_student;
±---------+
| sum(age) |
±---------+
| 101 |
±---------+
1 row in set (0.00 sec)

select max(score),avg(score) from tb_choice where cid=1;
mysql> select sum(age),max(age),min(age),avg(age) from tb_student;
±---------±---------±---------±---------+
| sum(age) | max(age) | min(age) | avg(age) |
±---------±---------±---------±---------+
| 101 | 19 | 16 | 16.8333 |
±---------±---------±---------±---------+
1 row in set (0.00 sec)

注意:如果在select之后不在聚集函数中的列名称一定出现在group by之后,否则语法错误
having可以对分组进行条件选择
需要获取人数多余2人的不同性别学生的平均年龄
按照性别分组
要统计的组必须人数多余2人,小于等于2人的分组不进行显示处理
练习题1:查询选修了3门以上课程的学生学号
按照学生学号分组
只处理分组中数据行数大于3的分组,如果分组中数据行数不足3则不处理
练习题2:查询有3门课程是90分以上的学生的学号及90分以上的课程数
需要分组处理的数据必须是90分以上的数据
针对学号进行分组
分组中课程数应该大于等于3门
having和where之间的区别
只有满足条件的数据才会输出显示
最大区别在于:作用的对象不同
where子句用于基表或者视图,从中选择满足条件的元组
having子句用于分组,从多个分组中选择满足条件的分组
排序处理
SQL中可以针对查询结果进行排序
语法 select … from … order by 列名称1 [asc/desc],列名称2 [asc/desc],…
mysql> select sex,avg(age) from tb_student group by sex;
±-----±---------+
| sex | avg(age) |
±-----±---------+
| 1 | 17.0000 |
| 0 | 16.0000 |
| NULL | 16.0000 |
±-----±---------+
3 rows in set (0.00 sec)

1 select sex,avg(age) from tb_student group by sex having count(1)>2;
1 select sid from tb_choice group by sid having count()>3;
select sid, count(
) from tb_choice
where score>=90
group by sid having count(cid) >=3;

排序过程中首先按照列名称1进行排序,如果列1对应值相等时,才按照列名称2对应列值进行排序
注意默认按照指定列的自然序排序,如果需要倒序则使用关键字desc,asc是正序
按照学生年龄从大到小输出学生信息
练习
1 select * from tb_student order by age desc;
mysql> select * from tb_student order by age desc;
±—±-------±-----±-----±-------+
| id | name | age | sex | dept |
±—±-------±-----±-----±-------+
| 3 | 仗义 | 19 | 1 | 大数据 |
| 1 | 小胖 | 18 | 1 | 软工 |
| 2 | 东方 | 16 | 0 | 机壳 |
| 4 | 张骞 | 16 | 1 | 软工 |
| 5 | 张小骞 | 16 | 1 | 软工 |
| 6 | 从来 | 16 | 1 | NULL |
| 8 | 张展 | 16 | 0 | NULL |
±—±-------±-----±-----±-------+
7 rows in set (0.00 sec)
mysql> select * from tb_student order by age;
±—±-------±-----±-----±-------+
| id | name | age | sex | dept |
±—±-------±-----±-----±-------+
| 2 | 东方 | 16 | 0 | 机壳 |
| 4 | 张骞 | 16 | 1 | 软工 |
| 5 | 张小骞 | 16 | 1 | 软工 |
| 6 | 从来 | 16 | 1 | NULL |
| 8 | 张展 | 16 | 0 | NULL |
| 1 | 小胖 | 18 | 1 | 软工 |
| 3 | 仗义 | 19 | 1 | 大数据 |
±—±-------±-----±-----±-------+
7 rows in set (0.00 sec)
mysql> select * from tb_student order by age desc,id desc;
±—±-------±-----±-----±-------+
| id | name | age | sex | dept |
±—±-------±-----±-----±-------+
| 3 | 仗义 | 19 | 1 | 大数据 |
| 1 | 小胖 | 18 | 1 | 软工 |
| 8 | 张展 | 16 | 0 | NULL |
| 6 | 从来 | 16 | 1 | NULL |
| 5 | 张小骞 | 16 | 1 | 软工 |
| 4 | 张骞 | 16 | 1 | 软工 |
| 2 | 东方 | 16 | 0 | 机壳 |
±—±-------±-----±-----±-------+
7 rows in set (0.00 sec)

习题
定义 学生(学生编号,姓名、性别),课程(课程编号、课程名称),选修(学生编号,课程编号,成绩)
数据比较
如果一个表中的数据和另外一个表中的数据相等时,最好保证数据类型一致
作业
请建立数据库scott,并建立如下表和数据
–建立表
create table if not exists tb_student(
id bigint primary key auto_increment,
name varchar(32) not null,
sex boolean default 1
)engine=innodb default charset utf8;
create table if not exists tb_course(
id bigint primary key auto_increment,
title varchar(32) not null
)engine=innodb default charset utf8;
create table if not exists tb_choice(
sid bigint not null, – 如果需要进行数据等值判定时,最好数据类型一致
cid bigint not null,
score numeric(4,1),
primary key(sid,cid)
)engine=innodb default charset utf8;

mysql> select ‘1’=1; – 进行比较时,如果参与比较的一方是数值类型时,字符串会自动转换为
数值进行比较,所以’1a’=1返回为true
±------+
| ‘1’=1 |
±------+
| 1 |
±------+
1 row in set (0.00 sec)
mysql> select ‘a’=‘A’; – 进行字符串比较时,不区分大小写
±--------+
| ‘a’=‘A’ |
±--------+
| 1 |
±--------+
1 row in set (0.00 sec)

–插入数据
写出如下查询语句:
1.选择部门30中的所有员工.
2.列出所有办事员(CLERK)的姓名,编号和部门编号.
3.找出佣金高于薪金的员工.
4.找出佣金高于薪金的60%的员工.
5.找出部门10中所有经理(MANAGER)和部门10中所有办事员(CLERK)的详细资料.
6.获取没有员工的部门信息
7.查询81年入职而且没有补助的员工信息
8.查询各个部门的最高工资、平均工资和总人数
create table emp( --员工
empno int primary key, --员工号
ename varchar(20) , --姓名
job varchar(20), --岗位
mgr int, --上级领导
hiredate date, --参加工作时间
sal numeric(7,2), --薪金
comm numeric(7,2), --津贴
deptno int --部门号
);

insert into emp values (7369,‘SMITH’,‘CLERK’,7902,‘1980-12-17’,800,null,20);
insert into emp values (7499,‘ALLEN’,‘SALESMAN’,7698,‘1981-02-
20’,1600,300,30);
insert into emp values (7521,‘WARD’,‘SALESMAN’,7698,‘1981-02-
22’,1250,500,30);
insert into emp values (7566,‘JONES’,‘MANAGER’,7839,‘1981-04-
02’,2975,null,20);
insert into emp values (7654,‘MARTIN’,‘SALESMAN’,7698,‘1981-09-
28’,1250,1400,30);
insert into emp values (7698,‘BLAKE’,‘MANAGER’,7839,‘1981-05-
01’,2850,null,30);
insert into emp values (7782,‘CLARK’,‘MANAGER’,7839,‘1981-06-
09’,2450,null,10);
insert into emp values (7788,‘SCOTT’,‘ANALYST’,7566,‘1987-04-
19’,3000,null,20);
insert into emp values (7839,‘KING’,‘PRESIDENT’,null,‘1981-11-
17’,5000,null,10);
insert into emp values (7844,‘TURNER’,‘SALESMAN’,7698,‘1981-09-
08’,1500,0,30);
insert into emp values (7876,‘ADAMS’,‘CLERK’,7788,‘1987-05-
23’,1100,null,20);
insert into emp values (7900,‘JAMES’,‘CLERK’,7698,‘1981-12-03’,950,null,30);
insert into emp values (7902,‘FORD’,‘ANALYST’,7566,‘1981-12-
03’,3000,null,20);
insert into emp values (7934,‘MILLER’,‘CLERK’,7782,‘1982-01-
23’,1300,null,10);

你可能感兴趣的:(MySql,数据库,java,sql)