以下是我为了自己学方便建的笔记,都是在其他博主的主页下看到的,自学笔记,有不对的可以指出
表结构如下:
create table dept(
id int unsigned primary key auto_increment,
// ID列为无符号整型,该列值不可以为空,并不可以重复,而且自增。
deptno mediumint unsigned not null default 0,
//deptno列为无符号中等大小整数,该值不可以为空,没有数据传入时则使用默认值0来设置该字段
dname varchar(20) not null default "",
//dname列为字符型,长度设定为20位,该值不可以为空,没有数据传入时使用默认值空来设置该字段
loc varchar(13) not null default ""
//dname列为字符型,长度设定为13位,该值不可以为空,没有数据传入时使用默认值空来设置该字段
)engine=MyISAM default charset=utf8;
//ENGINE=INNODB 表示将数据库的引擎设置为MyISAM ,DEFAULT CHARSET=utf8表示设置数据库的默认字符集为utf8
create table emp(
id int unsigned primary key auto_increment,
empno mediumint unsigned not null default 0,/*编号*/
ename varchar(20) not null default "",/*姓名*/
job varchar(9) not null default "",/*工作*/
mgr mediumint unsigned not null default 0,/*上级编号*/
hiredate date not null,/*入职时间*/
sal decimal(7,2) not null, /*薪水*/
//sal列为7位数字型,两位小数点,不可以为空
comm decimal(7,2) not null,/*红利*/
deptno mediumint unsigned not null default 0/*部门编号*/
)engine=MyISAM default charset=utf8;
CREATE TABLE salgrade( /*工资级别表*/
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
losal DECIMAL(17,2) NOT NULL,
hisal DECIMAL(17,2) NOT NULL
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);
Ps:
PRIMAPY是主键的意思,表示定义的该列值在表中是唯一的意思,不可以有重复。
UNSIGNED是无符号的意思,代表该字段没有正负。
AUTO_INCREMENT可以理解为自动递增的意思,每增加一条记录,值会自动加1。(例如在上面的例子中,ID列每增加一条记录,便会从100自增) 。
自增长字段必须是整数
一张表最多只能有一个自增长
TINYINT:一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255
SMALLINT:一个小整数。有符号的范围是-32768到32767,无符号的范围是0到65535
MEDIUMINT:一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215
INT:一个正常大小整数。有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295
BIGINT:一个大整数。有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615
至于类型后面的数值,该这样理解,比如:
tinyint(1)和 tinyint(3)没什么区别,占用字节都是一位,存储范围都是一样的,1和3分别表示显示长度,那显示长度该怎么理解呢?
tinyint(3) zerofill ,当插入的数据少于3位的时候,左边自动补零,这才是限制显示长度啊,其他的都不变,比如.tinyint(1),和tinyint(3)没什么区别,存123都能存的下,而如果tinyint(3) zerofill 的话,插入值 12,会存储012,zerofill自动左边补零,这才是限制显示长度
#随机产生字符串
#定义一个新的命令结束符
delimiter $$
Delimiter就是告诉MySQL解释器,该段命令是否已经结束了,MySQL是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。
事先把delimiter换成其它符号,如//或$$,这样只有当//出现之后,mysql解释器才会执行这段语句
#删除自定的函数
drop function rand_string $$
创建函数:
#rand_string(n INT) rand_string 是函数名(n INT) //该函数传参一个整数
create function rand_string(n INT)
returns varchar(255) #该函数会返回一个字符串
Begin
#chars_str定义一个 变量
declare chars_str varchar(100) default
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
declare return_str varchar(255) default '';
declare i int default 0;
while i < n do
set return_str=concat(return_str,substring(chars_str,floor(1+rand()*52),1));
//Java中提供的substring方法截取字符串
截取的字符串从chars_str开始,到floor(1+rand()*52)结束
floor函数,floor(1+rand()*52小于等于1+rand()*52,且于1+rand()*52最接近的整数
JavaScript concat() 方法用于连接两个或多个数组
set i = i +1;
end while;
return return_str;
end $$
delimiter ;
select rand_string(6);
# 随机产生部门编号
delimiter $$
drop function rand_num $$
再来一个函数
create function rand_num( )
returns int(5)
begin
declare i int default 0;
set i = floor(10+rand()*500);
return i;
end $$
delimiter ;
select rand_num();
#******************************************
#向emp表中插入记录(海量的数据)
delimiter $$
drop procedure insert_emp $$
创建存储过程
#随即添加雇员[光标] 360w
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0;
#set autocommit = 0 把autocommit设置成0
set autocommit = 0;
Repeat
set i = i +1;
Insert into emp values
((start+i),rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());
until i = max_num
end repeat;
commit;
//使用COMMIT
一般的MySQL语句都是直接针对数据库表执行和编写的。这就是所谓的隐含提交(implicit commit),即提交(写或保存)操作是自动进行的。但是,在事务处理块中,提交不会隐含地进行。为进行明确的提交,使用 COMMIT 语句,隐含事务关闭 当 COMMIT 或 ROLLBACK 语句执行后,事务会自动关闭(将来的更改会隐含提交)。
end $$
delimiter ;
#调用刚刚写好的函数, 1800000条记录,从100001号开始
call insert_emp(100001,4000000);
#**************************************************************
# 向dept表中插入记录
delimiter $$
drop procedure insert_dept $$
create procedure insert_dept(in start int(10),in max_num int(10))
begin
declare i int default 0;
set autocommit = 0;
repeat
set i = i + 1;
insert into dept values ((start+i) ,rand_string(10),rand_string(8));
until i = max_num
end repeat;
commit;
end $$
delimiter ;
call insert_dept(100,10);
#------------------------------------------------
#向salgrade 表插入数据
delimiter $$
drop procedure insert_salgrade $$
create procedure insert_salgrade(in start int(10),in max_num int(10))
begin
declare i int default 0;
set autocommit = 0;
ALTER TABLE emp DISABLE KEYS;
repeat
set i = i + 1;
insert into salgrade values ((start+i) ,(start+i),(start+i));
until i = max_num
end repeat;
commit;
end $$
delimiter ;
#测试不需要了
#call insert_salgrade(10000,1000000);