MySQL · 基本操作

MYSQL数据库
-------------------------------------------------------------------------

  • 关系模型的基本术语


关系:整个二维表
关系名:表格名称
元组:行数据(记录)
属性:列数据(字段/分量)
属性名:列名称(字段名)
主键:唯一确定元组的属性组(关键字)
域:属性的取值范围
关系模式:关系的描述,表示为:关系名(属性列表)
例如:学生(学号,姓名,性别,年龄,系别)
关系的约束:域完整性约束,实体完整性约束,参照完整性约束
-------------------------------------------------------------------

本地连接:
mysql  -u shiyi -p
远程连接:
mysql -h 192.144.137.179 -P 3306 -u shiyi -p
mysql -h 192.144.137.179 -u shiyi -p

  • 一、数据库设计

—————————————————————————————————
1.1    >>>创建数据库:(urban_cloud_reservation)
create database if not exists urban_cloud_reservation
default character set=utf8
default collate=utf8_general_ci;

1.2    >>>修改数据库:
alter database urban_cloud_reservation
default character set=utf8
default collate=utf8_general_ci;

1.3    >>>删除数据库:
drop database if exists urban_cloud_reservation;
drop schema if exists urban_cloud_reservation;

1.4.1    >>>查看建库信息:
show create datebase urban_cloud_reservation;

1.4.2    >>>选择使用数据库:
use urban_cloud_reservation;

1.4.3    >>>查看所有数据库:
show databases;
show schemas;

  • 二、数据表设计

--------------------------------------------------------------------
2.1    >>>定义表
--------------------------------------------------------------------
2.1.1    >>>MYSQL常见数据类型:
--------------------------------------------------------------------
    数值类型:            类型        无符号             有符号
    bit(M)                位字段类型    M表示数值范围1~64
    tinyint(M) [unsigned] [zerofill]    很小整数型    无符号表示0~255    有符号表示-128~127
    bool,boolean==tinyint(1)            0~1
    smallint    (M)            小的整数    0~65535        -32768~32767
    mediumint(M)            中等大小整数    0~1677 7215        -8388608~8388607
    int(M)==integer        普通大小整数    0~42 9496 7295    -2147483648~2147483647
    bigint(M)            大整数        0~1844 6744 0737 0955 1615        
    float(M)            单精度浮点数值
    double(M,D))            双精度浮点数,    M为小数总位数 D为小数点后位数(M,D受系统限制)
    decimal(M,D)==dec         压缩的严格定点数,    M为小数总位数 D为小数点后位数M<50,D<30
--------------------------------------------------------------------
    时间和日期类型:
    date                 日期型        1000-01-01~9999-12-31
    datetime            日期时间型    1000-01-01 00:00:00~9999-12-31 23:59:59
    timestamp            时间戳        1970-01-01 00:00:00~2037年
    time                 时间型         -838:59:59~838:59:59
    year                年型(2或4位)    1901~2155&0000    70~69(1970~2069)
--------------------------------------------------------------------
    字符串类型:
    char                 定长字符串                0-255字节     
    varchar             变长字符串                0-65535 字节
    tinyblob             不超过 255 个字符的二进制字符串    0-255字节
    tinytext             短文本字符串                0-255字节     
    blob                 二进制形式的长文本数据             0-65 535字节     
    text                 长文本数据                 0-65 535字节     
    mediumblob             二进制形式的中等长度文本数据         0-16 777 215字节     
    mediumtext             中等长度文本数据             0-16 777 215字节     
    longblob             二进制形式的极大文本数据         0-4 294 967 295字节     
    longtext             极大文本数据                 0-4 294 967 295字节2^30*4     
--------------------------------------------------------------------    
--------------------------------------------------------------------
2.1.2    >>>创建user表:
create table if not exists ucr_user(
    userID bigint unsigned not null auto_increment,
    Uname varchar(50) not null default "向日葵",
    Upicture mediumblob,
    Usex varchar(1) default "女",
    Uage tinyint default 18,
    Unickname varchar(10),
    Uphone bigint(12),
    Uqq bigint(12),
    Uemail varchar(30),
    constraint PK_student primary key(userID) on update restrict on delete cascade
)engine=innoDB auto_increment=0 default charset=utf8;
~~~~~~~~~~
create table db_school.tb_class(
    classNo char(6) primary key,
    className varchar(20) not null unique,
    department varchar(30) not null,
    grade smallint,
    classNum tinyint
)engine=InnoDB;
~~~~~~~~~~
create table db_school.tb_student(
    studentNo char(10),
    studentName varchar(20) not null,
    sex char(2) not null,
    birthday date,
    native varchar(20),
    nation varchar(10) default '汉',
    classNo char(6),
    constraint PK_student primary key(studentNo),
    constraint FK_student foreign key(classNo) references tb_class(classNo)
        on update cascade
        on delete cascade
)engine=InnoDB;
~~~~~~~~~~
create table db_school.tb_course(
    courseNo char(6),
    courseName varchar(20) not null,
    credit int not null,
    courseHour int not null,
    term char(2),
    priorCourse char(6),
    constraint PK_course primary key(courseNo),
    constraint FK_course foreign key(priorCourse) references tb_course(courseNo),
        on update cascade
        on delete cascade
    constraint CK_course check(credit=courseHour/16)
)engine=InnoDB;
~~~~~~~~~~
create table if not exists tb_score(
    studentNo char(10),
    courseNo char(6),
    score float check(score>=0 and score <=100),
    constraint PK_score primary key(studentNo,courseNo),
    constraint FK1_score foreign key(studentNo) references tb_student(studentNo),
        on update cascade
        on delete cascade
    constraint FK2_score foreign key(courseNo) references tb_course(courseNo)
)engine=innoDB;
--------------------------------------------------------------------
2.1.3-1    >>>查看数据表的基本结构
desc table ucr_user;
desc ucr_user;
describe ucr_user;
show columns from ucr_user from urban_cloud_reservation;
show columns in ucr_user in urban_cloud_reservation;
show columns in ucr_user;
-------------------------------------------------------------------
2.1.3-2    >>>查看数据表的详细结构
show create table ucr_user;
-------------------------------------------------------------------

DROP TABLE语句
--------------------
2.1.4    >>>删除表
drop table ucr_user;
drop table if exists ucr_user,user;
drop table if exists urban_cloud_reservation.ucr_user;
-------------------------------------------------------------------

ALTER TABLE语句
--------------------
2.1.5    >>>重命名表
alter table ucr_user rename to user;
alter table user rename ucr_user;
rename table ucr_user to user;
rename table ucr_user to user,user to ucr_user;
-------------------------------------------------------------------
2.1.6-1    >>>添加表字段
alter table urban_cloud_reservation.ucr_user
add column Udescription varchar(200) null default "我是一只小小鸟!" after Uemail;
alter table urban_cloud_reservation.ucr_user
add column UU bigint(20) not null unique first;

-------------------------------------------------------------------
2.1.6-2    >>>修改表字段
    >change: 改列名,类型,约束
alter table ucr_user change column UU Up tinyint(4) unsigned not null;
    >alter      :  改默认值
alter table ucr_user alter column Up set default 66669999;
    >alter      :  删除默认
alter table ucr_user alter column Up drop default;
    >modify:  改类型,约束,
alter table ucr_user modify Up bigint(20) not null unique first;
-------------------------------------------------------------------
2.1.6-3    >>>drop:删除表字段
alter table ucr_user drop column Up;
-------------------------------------------------------------------

-------------------------------------------------------------------
2.2    >>>数据的完整性约束
-------------------------------------------------------------------
2.2.1    >>>定义实体完整性
-------------------------------------------------------------------
    >>>主键约束
    >单键约束方式一:
create table if not exists ucr_test(
id bigint,
name varchar(50),
userID bigint,
constraint UCR
    primary key(id)
    ,unique key(name)
    ,foreign key(userID) references ucr_user(userID)
    ,check(id<100)
);

    >单键约束方式二:
create table if not exists ucr_test(
id int unsigned not null,
name varchar(50),
primary key(id)
);
    >>>复合主键约束:
create table if not exists ucr_test(
id int unsigned not null,
name varchar(50),
primary key(id,name)
);
-------------------------------------------------------------------

    >>>完整性约束的命名
constraint UCR
    primary key(id)
    ,unique(name)
    ,foreign key(id) references ucr_user(id)
    ,check(id<100)
}
-------------------------------------------------------------------
    >>>候选键约束
    >单键约束方式一:
create table if not exists ucr_test(
id bigint unique,
name varchar(50),
userID bigint,
);

    >单键约束方式二:
create table if not exists ucr_test(
id int unsigned not null,
name varchar(50),
age tinyint(4),
constraint UCR primary key(id),unique key(age)
);
-------------------------------------------------------------------
    >候选键复合健约束
create table if not exists ucr_test(
id int unsigned not null,
name varchar(50),
age tinyint(4),
constraint UCR primary key(id),unique(name,age),unique(age)
);
-------------------------------------------------------------------
2.2.2    >>>定义参照完整性
-------------------------------------------------------------------
    >>>外键约束
create table db_school.tb_student(
    studentNo char(10),
    studentName varchar(20) not null,
    sex char(2) not null,
    birthday date,
    native varchar(20),
    nation varchar(10) default '汉',
    classNo char(6),
    constraint PK_student primary key(studentNo),
    constraint FK1_student foreign key(classNo) references tb_class(classNo),
    constraint FK2_student foreign key(classNo) references tb_student(studentNo)
)engine=InnoDB;
-------------------------------------------------------------------
    >>>参照完整性约束的违约处理策略
1、restrict    限制策略
2、cascade    级联策略
3、set null    置空策略
4、no action    不采取措施(同限制策略)
5、set default    默认值策略

参照动作适用语句
1、update
2、delete

create table db_school.tb_student(
    studentNo char(10),
    studentName varchar(20) not null,
    sex char(2) not null,
    birthday date,
    native varchar(20),
    nation varchar(10) default '汉',
    classNo char(6),
    constraint PK_student primary key(studentNo),
    constraint FK_student foreign key(classNo)
        references tb_class(classNo)
        on update restrict
        on delete cascade
)engine=InnoDB;

-------------------------------------------------------------------
2.2.3    >>>用户自定义的完整性
-------------------------------------------------------------------
1、设置非空约束    列级
2、check约束        列级&表级
3、触发器

create table db_school.tb_course(
    courseNo char(6),
    courseName varchar(20) not null,
    credit int not null,
    courseHour int not null,
    term char(2),
    priorCourse char(6),
    constraint PK_course primary key(courseNo),
    constraint UK_course unique key(credit),
    constraint FK_course foreign key(priorCourse)
        references tb_course(courseNo),
    constraint CK_course check(credit=courseHour/16)
)engine=InnoDB;

-------------------------------------------------------------------
2.2.3    >>>更新完整性约束
-------------------------------------------------------------------
    >删除约束->外键
alter table tb_course drop foreign key FK_course;
    >删除约束->主键
alter table tb_course drop primary key;
    >删除约束->候选键
alter table tb_course drop index UK_course;

    >添加约束->主键
alter table tb_course add constraint PK_course primary key(courseNo);
    >添加约束->外键
alter table tb_course add constraint FK_course foreign key(priorCourse) references tb_course(courseNo);
    >添加约束->候选键
alter table tb_course add constraint UK_course unique key(credit);

-------------------------------------------------------------------

  • 三、数据查询

3.1    select语句
3.2    select子句
3.3    分组聚合查询
3.4    连接查询
3.5    子查询
3.6    联合查询
—————————————————————————————————
3.1    @@@select语句
select [All|distinct|distinctrow] <目标表达式1>[,<目标表达式2>]...
from <表达式1或视图1>[,<表达式2或视图名2>]...
[where<条件表达式>]
[group by <列名1>[having<条件表达式>]]
[order by <列名2>[asc|desc]]
[limit [m,]n];

—————————————————————————————————
3.2    @@@select子句
—————————————————————————————————
3.2.1-1    @@@选择字段查询
select courseName from tb_course;
select distinct courseName from tb_course;
select distinctrow courseName from tb_course;

—————————————————————————————————
3.2.1-2    @@@查询所有字段
select * from tb_course;

—————————————————————————————————
3.2.1-3    @@@查询经过计算的值
select  studentName,sex,'Age:',year(now())-year(birthday) from tb_student;

—————————————————————————————————
3.2.1-4    @@@定义字段别名
select studentName as 姓名,sex as 性别,year(now())-year(birthday) as 年龄 from tb_student;
select studentName as '姓 名',sex as 性别,year(now())-year(birthday) as 年龄 from tb_student;
select studentName 姓名,sex 性别,year(now())-year(birthday) 年龄 from tb_student;

—————————————————————————————————
3.2.2    @@@where子句选择指定记录
比较        =、 <>、!=、<、<=、>、 >=、!>、!<、not+含比较运算的表达式
确定范围    between and、not between and
确定集合    in、not in
字符匹配    like 、not like
空值        is null、is not null
多重查询    and、or

—————————————————————————————————
3.2.2-1    @@@比较
select courseName,credit,courseHour from tb_course where courseHour>28;
select courseName,credit,courseHour from tb_course where not courseHour<28;
select studentName,sex,native,nation from tb_student where nation!='汉';
select studentName,sex,native,nation from tb_student where nation<>'汉';
select studentName,sex,native,nation from tb_student where not nation='汉';

—————————————————————————————————
3.2.2-2    @@@between and关键字
select * from tb_student where birthday between '1991-01-01' and '2018-04-06';
select * from tb_student where birthday not between '1991-01-01' and '2018-04-06';

—————————————————————————————————
3.2.2-3    @@@in关键字
select * from tb_student where native in('北京','上海','河南省周口市');
select * from tb_student where native not in('北京','上海');

—————————————————————————————————
3.2.2-4    @@@like关键字
select * from tb_student where studentNo like '1601141019';
select * from tb_student where studentName like '晏%';
select * from tb_student where studentName not like '晏%';
select * from tb_student where studentName like '%沈%';
select * from tb_student where studentName like '晏_';
select * from tb_student where studentName like '晏__';
select * from tb_student where studentName like '_沈_';
select * from tb_student where studentName like '__沈';

—————————————————————————————————
3.2.2-5    @@@正则表达式regexp 常用字符匹配列表
 <串>    匹配包括指定字符串的文本
 []    匹配[ ]中的任意一个字符
 [^]    匹配不在[ ]中的任意一个字符
^    匹配文本的开始字符
$    匹配文本的结尾字符
.    匹配任意单个字符
*    匹配0个或多个*前面指定的字符
+    匹配+前面的字符至少1次或多次
{n}    匹配前面的字符至少n次
select * from tb_course where courseName regexp 'sy';    ==  select * from tb_course where courseName like '%sy%';
select * from tb_course where courseName regexp '[sy]';
select * from tb_course where courseName regexp '[^sy]';
select * from tb_course where courseName regexp '^sy';
select * from tb_course where courseName regexp 'sy$';
select * from tb_course where courseName regexp 's.y';
select * from tb_course where courseName regexp 's*y';
select * from tb_course where courseName regexp 'sy+';
select * from tb_course where courseName regexp 's{3}y';
select * from tb_course where courseName regexp 'shiyi|jdd|lm';

 —————————————————————————————————
3.2.2-6    @@@is null关键字空值查询
select * from tb_course where priorCourse is null;
select * from tb_course where priorCourse is not null;

—————————————————————————————————
3.2.2-7    @@@带and和or的多条件查询
select * from tb_course where courseName regexp 'sy' and priorCourse is null;
select * from tb_course where courseName regexp 'sy' or priorCourse is null;
select * from tb_course where courseName regexp 'sy' or priorCourse is null and credit>3;

—————————————————————————————————
3.2.3    @@@对查询结果排序
select * from tb_student order by studentNo desc;
select * from tb_student order by studentName asc;
select * from tb_student order by studentName asc,score desc;
select * from tb_student where score>85 order by studentNo,score desc;

—————————————————————————————————
3.2.4    @@@限制查询结果的数量
select * from tb_student order by studentName limit 1,5;
select * from tb_student order by studentName limit 5 offset 1;

—————————————————————————————————
3.3    @@@分组聚合查询
—————————————————————————————————
3.3.1    @@@聚合函数查询
select count(distinct *) from tb_student;
select count(*) from tb_student;
select count(all *) from tb_student;
select count(all courseName) from tb_student;
select max(all courseName) from tb_student;
select min(all courseName) from tb_student;
select sum(all courseName) from tb_student;
select avg(all score) from tb_score;

—————————————————————————————————
3.3.2    @@@分组聚合查询    [group by 字段列表] [having <条件表达式>]
select courseNo,count(studentNo) from tb_score group by courseNo;
select studentNo,count(*) 选课门数,avg(score) 平均分,max(score) 最高分 from tb_score group by studentNo;
select studentNo,count(*) 选课门数,avg(score) 平均分,max(score) 最高分 from tb_score group by studentNo having avg(score)>=95;
select studentNo,count(*) 选课门数,avg(score) 平均分,max(score) 最高分 from tb_score group by studentNo having count(*)>2;

SELECT typeID,GROUP_CONCAT(Tname) FROM ucr_supplier_reservation_type GROUP BY typeID;
—————————————————————————————————
3.4    @@@连接查询(多表查询)
—————————————————————————————————
3.4.1    @@@连接查询(多表查询)->交叉连接
select  * from tb_student cross join tb_score;
select  * from tb_student,tb_score;

—————————————————————————————————
3.4.2    @@@连接查询(多表查询)->内连接
3.4.2-1    @等值与非等值连接
select tb_student.*,tb_score.*
    from tb_student,tb_score
    where tb_student.studentNo=tb_score.studentNo;
select tb_student.*,tb_score.*
    from tb_student inner join tb_score
    on tb_student.studentNo=tb_score.studentNo;
select tb_student.*,tb_score.*
    from tb_student join tb_score
    on tb_student.studentNo=tb_score.studentNo;

select studentNo,studentName,native,tb_student.classNo,className
    from tb_student,tb_class
    where tb_student.classNo=tb_class.classNo and department='信息工程学院';
select studentNo,studentName,native,tb_student.classNo,className
    from tb_student join tb_class
    on tb_student.classNo=tb_class.classNo
    where department='信息工程学院';

select a.studentNo,studentName,score
    from tb_student as a,tb_course b,tb_score c
    where a.studentNo=c.studentNo and b.courseNo=c.courseNo and courseName='计算机网络';
select a.studentNo,studentName,score
    from tb_student as a join tb_course b join tb_score c
    on a.studentNo=c.studentNo and b.courseNo=c.courseNo
    where courseName='计算机组成原理';

—————————————————————————————————
3.4.2    @@@连接查询(多表查询)->内连接
3.4.2-2    @自连接
select c1.*
    from tb_course c1,tb_course c2
    where c1.credit=c2.credit and c2.courseName='数据库原理';    
select c1.*
    from tb_course c1 join tb_course c2
    on c1.credit=c2.credit
    where c2.courseName='数据库原理';
select c1.*
    from tb_course c1 join tb_course c2
    on c1.credit=c2.credit
    where c2.courseName='数据库原理' and c1.courseName!='数据库原理';

—————————————————————————————————
3.4.2    @@@连接查询(多表查询)->内连接
3.4.2-3    @自然连接
select a.studentNo,studentName,courseNo,score
    from tb_student a natural join tb_score b;

—————————————————————————————————
insert into tb_student values('1601141027','一静','女','1998-7-24','苏州','汉','3');
3.4.3    @@@连接查询(多表查询)->外连接
3.4.3-1    @左外连接
select a.studentNo,studentName,sex,classNo,courseNo,score
    from tb_student a left outer join tb_score b
    on a.studentNo=b.studentNo;
select a.studentNo,studentName,sex,classNo,courseNo,score
    from tb_student a left join tb_score b
    on a.studentNo=b.studentNo;

—————————————————————————————————
3.4.3    @@@连接查询(多表查询)->外连接
3.4.3-2    @右外连接
select courseNo,score,b.studentNo,studentName,sex,classNo
    from tb_score a right outer join tb_student b
    on a.studentNo=b.studentNo;

—————————————————————————————————
3.5    @@@子查询
3.5.1    @带in关键字子查询
select studentNo,studentName
    from tb_student
    where tb_student.studentNo in
    (select distinct tb_score.studentNo from tb_score);
select studentNo,studentName
    from tb_student
    where tb_student.studentNo not in
    (select distinct tb_score.studentNo from tb_score);

—————————————————————————————————
3.5    @@@子查询
3.5.2    @带比较关键符的子查询
select studentNo,studentName from tb_student
    where classNo=(select classNo from tb_class where className='物联网工程');
select studentNo,studentName from tb_student
    where classNo<>(select classNo from tb_class where className='物联网工程');

select studentNo,studentName from tb_student
    where classNo='1';
select studentNo,studentName,classNo from tb_student s1
    where classNo=
    (select classNo from tb_student s2 where studentName='一静');
select studentNo,studentName,classNo from tb_student s1
    where classNo=
    (select classNo from tb_student s2 where studentName='一静') and studentName<>'一静';
select studentNo,studentName,classNo from tb_student s1
    where classNo=
    (select classNo from tb_student s2 where studentNo='1601141019') and studentNo!='1601141019';

select studentNo,studentName,year(birthday) from tb_student
    where sex='男' and year(birthday)<any(
    select year(birthday) from tb_student where sex='女');
使用聚合函数查询
select studentNo,studentName,year(birthday) from tb_student
    where sex='男' and year(birthday)<(
    select max(year(birthday)) from tb_student
    where sex='女');

—————————————————————————————————
3.5    @@@子查询
3.5.3    @带exists关键字子查询
select studentNo,studentName from tb_student a
    where exists(
    select * from tb_score b
    where a.studentNo=b.studentNo and courseNo='1');
等价in关键字查询
select studentNo,studentName from tb_student
    where studentNo in(
    select studentNo from tb_score where courseNo='1');


select studentNo,studentName from tb_student a
    where not exists(
    select * from tb_score b
    where a.studentNo=b.studentNo and courseNo='1');
等价in关键字查询
select studentNo,studentName from tb_student
    where studentNo not in(
    select studentNo from tb_score where courseNo='1');

not exists嵌套使用,双重否定表示肯定
select studentNo,studentName from tb_student x
    where not exists
    (select * from tb_course c where not exists
    (select * from tb_score where studentNo=x.studentNo and courseNo=c.courseNo));

—————————————————————————————————
3.6    @@@联合查询(支持并运算)
select studentNo from tb_score,tb_course where tb_score.courseNo=tb_course.courseNo and courseName='计算机网络'
    union
    select studentNo from tb_score,tb_course where tb_score.courseNo=tb_course.courseNo and courseName='计算机组成原理';
等价查询语句
select distinct studentNo
    from tb_score,tb_course
    where tb_score.courseNo=tb_course.courseNo
    and (courseName='计算机网络' or courseName='计算机组成原理');

select studentNo from tb_score,tb_course where tb_score.courseNo=tb_course.courseNo and courseName='计算机网络'
    union all
    select studentNo from tb_score,tb_course where tb_score.courseNo=tb_course.courseNo and courseName='计算机组成原理';
等价查询语句
select studentNo
    from tb_score,tb_course
    where tb_score.courseNo=tb_course.courseNo
    and (courseName='计算机网络' or courseName='计算机组成原理');

select studentNo 学号
    from tb_score,tb_course where tb_score.courseNo=tb_course.courseNo and courseName='计算机网络'  limit 0,5
    union all
    select studentNo 学生学号
    from tb_score,tb_course where tb_score.courseNo=tb_course.courseNo and courseName='计算机组成原理'
    limit 0,3;
交运算与差运算用子查询实现
select studentNo
    from tb_score,tb_course
    where tb_score.courseNo=tb_course.courseNo and courseName='计算机网络'
    and studentNo in (
    select studentNo
    from tb_score,tb_course
    where tb_score.courseNo=tb_course.courseNo and courseName='计算机组成原理');

select studentNo
    from tb_score,tb_course
    where tb_score.courseNo=tb_course.courseNo and courseName='计算机网络'
    and studentNo not in (
    select studentNo
    from tb_score,tb_course
    where tb_score.courseNo=tb_course.courseNo and courseName='计算机组成原理');
—————————————————————————————————

  • 四、数据更新

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.1    ###插入数据
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.1.1    ###插入完整的数据记录
insert into db_school.tb_student
    values('1601141001','鸿达','男','1998-7-14','周口','汉','3');
insert into db_school.tb_student(studentNo,studentName,sex,birthday,native,nation,classNo)
    values('1601141012','李梦','女','1998-6-24','周口','汉','3');
insert into db_school.tb_student(studentNo,nation,classNo,studentName,sex,birthday,native)
    values('1601141013','汉','3','子龙','男','1998-6-24','上海');

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.1.2    ###为表指定字段插入数据
insert into db_school.tb_student(studentNo,studentName,sex)
    values('1601141022','张良','男');

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.1.3    ###同时插入多条数据
insert into db_school.tb_student(studentNo,nation,classNo,studentName,sex,birthday,native)
    values('1601141018','汉','3','子龙','男','1998-6-24','北疆'),
    ('1601141020','汉','3','子龙','男','1998-6-24','北疆'),
    ('1601141021','汉','3','子龙','男','1998-6-24','北疆');

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.1.4    ###插入查询结果(可用于复制表数据)
create table db_school.tb_student_copy(
    studentNo char(10),
    studentName varchar(20) not null,
    sex char(2) not null,
    birthday date,
    native varchar(20),
    nation varchar(10) default '汉',
    classNo char(6),
    constraint PK_student primary key(studentNo),
    constraint FK_student foreign key(classNo) references tb_class(classNo)
        on update cascade
        on delete cascade
)engine=InnoDB;

insert into db_school.tb_student_copy(studentNo,studentName,native,nation,sex,birthday,classNo)
    select studentNo,studentName,native,nation,sex,birthday,classNo from tb_student;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.1.5    ###使用replace语句插入表数据(在没有定义外键时,可用于覆盖原来的插入语句)
replace into tb_student_copy
    values('1601141012','李梦','女','1998-6-24','周口','汉','3');

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.2    ###修改数据记录
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.2.1    ###修改特定数据记录
update db_school.tb_student
    set studentName='简单点',native='河南周口沈丘'
    where studentNo='1601141019';
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.2.1    ###修改所有数据记录
update db_school.tb_student_copy
    set studentName='简单点',native='河南周口沈丘';

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.2.3    ###带子查询的修改
update db_school.tb_score
    set score=0
    where courseNo=(select courseNo from tb_course where courseName='计算机组成原理');
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.3    ###删除数据记录
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.3.1    ###删除特定数据记录
delete from tb_student
    where studentName='李梦';
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.3.2    ###带子查询的删除
delete from db_school.tb_score
    where courseNo=(select courseNo from tb_course where courseName='计算机组成原理');
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.3.3    ###删除所有数据记录
delete from db_school.tb_student_copy;
truncate db_school.tb_student_copy;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  • 五、索引

—————————————————————————————————
5.1    &&&索引分类(单列索引&组合索引)
—————————————————————————————————
    1、普通索引
    2、唯一性索引
    3、主键索引
    4、聚簇索引
    5、全文索引

—————————————————————————————————
5.2    &&&查看表索引
show index from tb_student;
show indexes from tb_student;
show keys from tb_student;
show keys in tb_student;
show keys in tb_student from db_school;
show keys in tb_student in db_school;

show index from tb_student \G
show indexes from tb_student \G
show keys from tb_student \G
show keys in tb_student \G
show keys in tb_student from db_school\G
show keys in tb_student in db_school\G

—————————————————————————————————
5.3    &&&创建索引
—————————————————————————————————
5.3.1    &&&使用create table语句创建索引
    &创建普通索引
create table if not exists tb_test1(
    studentNo char(10),
    courseNo char(6),
    score float check(score>=0 and score <=100),
    index(studentNo)
)engine=innoDB;
    &创建唯一性索引
create table if not exists tb_test2(
    studentNo char(10),
    courseNo char(6),
    score float check(score>=0 and score <=100),
    unique(studentNo)
)engine=innoDB;
    &创建主键同时创建主键索引
create table if not exists tb_test3(
    studentNo char(10),
    courseNo char(6),
    score float check(score>=0 and score <=100),
    primary key(studentNo)
)engine=innoDB;
    &创建外键同时创建外键索引
create table if not exists tb_test4(
    studentNo char(10),
    courseNo char(6),
    score float check(score>=0 and score <=100),
    constraint tb_test4 foreign key(studentNo) references tb_test1(studentNo)
        on update cascade
        on delete cascade
)engine=innoDB;

—————————————————————————————————
5.3.2    &&&使用create index语句创建索引
create index index_stuNo on db_school.tb_test(studentNo);
create index index_stuNo on db_school.tb_test(studentNo(3) desc);
create index index_stuNo on db_school.tb_test(studentNo desc,courseNo asc);
—————————————————————————————————
5.3.3    &&&使用alter table语句创建索引
alter table db_school.tb_test add index index_stuNo(studentNane);
alter table db_school.tb_test add constraint PK_student primary key(studentNo),
alter table db_school.tb_test add constraint FK_student foreign key(courseNo) references tb_score(scoreNo)
        on update cascade
        on delete cascade
—————————————————————————————————
5.4    &&&删除索引
drop index index_stuNo on db_school.tb_test;
alter table db_school.tb_test1 drop index studentNo;
alter table db_school.tb_test3 drop primary key;
alter table db_school.tb_test4 drop foreign key tb_test4;
—————————————————————————————————
5.5    &&&关于索引的使用
问题:降低更新表中数据的速度
增加存储空间
使用原则:
在插入,修改,删除,操作较多的数据表上避免过多建立索引
数据较小的表不建索引
查询表达式中经常使用,有较多不同值的字段上建立索引
使用link关键字时开头使用%会时索引失效
—————————————————————————————————

  • 六、视图

—————————————————————————————————
6.1    %%%视图概述
视图是提供一种对查询操作的封装
—————————————————————————————————
6.2    %%%创建视图
create or replace view db_school.v_student
    as
    select * from db_school.tb_student where sex='男'
    with check option;
create view db_school.v_score_avg(studentNo,scoreNo)
    as
    select studentNo,avg(score) from tb_score
    group by studentNo;

create view v_score
    as
    select * from db_school.tb_score where score<90
    with check option;
create view v_score_local
    as
    select * from db_school.v_score where score>80
    with 。 check option;
create view v_score_cascaded
    as
    select * from db_school.v_score where score>80
    with cascaded check option;

insert into db_school.v_score values('1601141001','2',92);
insert into db_school.v_score_local values('1601141002','2',92);
insert into db_school.v_score_cascaded values('1601141003','2',92);
—————————————————————————————————
6.3    %%%删除视图
drop view if exists db_school.v_score;
drop view if exists db_school.v_score_local;
drop view if exists db_school.v_score_cascaded;
—————————————————————————————————
6.4    %%%修改视图
alter view db_school.v_student(studentNo,studentName,classNo)
    as
    select studentNo,studentName,classNo from db_school.tb_student
    where sex='男' and nation='汉'
    with check option;
—————————————————————————————————
6.5    %%%查看视图定义
show create view v_student \G
—————————————————————————————————
6.6    %%%更新视图数据
insert 语句插入
insert into db_school.v_score values('1601141001','2',92);
update语句修改基础表的数据
 update db_school.v_student set studentName='黎黎' where studentNo='1601141038';
delete语句删除
delete from db_school.v_student where studentName='文文';
—————————————————————————————————
6.7    %%%查看视图数据
select * from v_student where studentNo='10601141038';
—————————————————————————————————

  • 七、触发器

—————————————————————————————————
7.1    >>>创建触发器
create trigger db_school.tb_student_insertAfterEvent
    after insert
    on db_school.tb_student
    for each row set @str='one student add!';

insert into db_school.tb_student
    values('1601141023','123','男','1998-7-14','周口','汉','3');
—————————————————————————————————
7.2    >>>删除触发器
drop trigger if exists db_school.tb_student_insertAfterEvent;
—————————————————————————————————
7.3    >>>使用触发器
insert触发器
create trigger db_school.tb_student_insertAfterEvent
    after insert
    on db_school.tb_student
    for each row set @str=new.studentNo;
delete触发器
create trigger db_school.tb_student_deleteAfterEvent
    before delete
    on db_school.tb_student
    for each row set @onum=old.studentNo;
update触发器
create trigger db_school.tb_student_updateAfterEvent
    before update
    on db_school.tb_student
    for each row set new.nation=old.nation;
insert into db_school.tb_student
    values('1601141026','789','女','1998-7-14','沈丘','藏','3');
—————————————————————————————————
创建触发器
在MySQL中,创建触发器语法如下:

代码如下:


CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt

其中:

trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。

由此可见,可以建立6种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。

另外有一个限制是不能同时在一个表上建立2个相同类型的触发器,因此在一个表上最多建立6个触发器。

trigger_event 详解
MySQL 除了对 INSERT、UPDATE、DELETE 基本操作进行定义外,还定义了 LOAD DATA 和 REPLACE 语句,这两种语句也能引起上述6中类型的触发器的触发。

LOAD DATA 语句用于将一个文件装入到一个数据表中,相当与一系列的 INSERT 操作。

REPLACE 语句一般来说和 INSERT 语句很像,只是在表中有 primary key 或 unique 索引时,如果插入的数据和原来 primary key 或 unique 索引一致时,会先删除原来的数据,然后增加一条新数据,也就是说,一条 REPLACE 语句有时候等价于一条。

INSERT 语句,有时候等价于一条 DELETE 语句加上一条 INSERT 语句。

INSERT 型触发器:插入某一行时激活触发器,可能通过 INSERT、LOAD DATA、REPLACE 语句触发;
UPDATE 型触发器:更改某一行时激活触发器,可能通过 UPDATE 语句触发;
DELETE 型触发器:删除某一行时激活触发器,可能通过 DELETE、REPLACE 语句触发。

BEGIN … END 详解
在MySQL中,BEGIN … END 语句的语法为:

BEGIN
[statement_list]
END
其中,statement_list 代表一个或多个语句的列表,列表内的每条语句都必须用分号(;)来结尾。
而在MySQL中,分号是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL可以开始执行了。因此,解释器遇到statement_list 中的分号后就开始执行,然后会报出错误,因为没有找到和 BEGIN 匹配的 END。

这时就会用到 DELIMITER 命令(DELIMITER 是定界符,分隔符的意思),它是一条命令,不需要语句结束标识,语法为:
DELIMITER new_delemiter
new_delemiter 可以设为1个或多个长度的符号,默认的是分号(;),我们可以把它修改为其他符号,如$:
DELIMITER $
在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了$,才认为是语句结束。注意,使用完之后,我们还应该记得把它给修改回来。

一个完整的创建触发器示例
假设系统中有两个表:
班级表 class(班级号 classID, 班内学生数 stuCount)
学生表 student(学号 stuID, 所属班级号 classID)
要创建触发器来使班级表中的班内学生数随着学生的添加自动更新,代码如下:

代码如下:下载地址 springmvc+mybatis+spring 整合SSM   

DELIMITER $
create trigger tri_stuInsert after insert
on student for each row
begin
declare c int;
set c = (select stuCount from class where classID=new.classID);
update class set stuCount = c + 1 where classID = new.classID;
end$
DELIMITER ;

变量详解
MySQL 中使用 DECLARE 来定义一局部变量,该变量只能在 BEGIN … END 复合语句中使用,并且应该定义在复合语句的开头,

即其它语句之前,语法如下:

DECLARE var_name[,...] type [DEFAULT value]
其中:
var_name 为变量名称,同 SQL 语句一样,变量名不区分大小写;type 为 MySQL 支持的任何数据类型;可以同时定义多个同类型的变量,用逗号隔开;变量初始值为 NULL,如果需要,可以使用 DEFAULT 子句提供默认值,值可以被指定为一个表达式。

对变量赋值采用 SET 语句,语法为:

SET var_name = expr [,var_name = expr] ...

DELIMITER $$
ALTER ALGORITHM=TEMPTABLE DEFINER=root@localhost SQL SECURITY DEFINER VIEW `ucr_supplier_reservation_type_view_group_upn` AS
SELECT
  `u`.`Tlevel`          AS `Tlevel`,
  `u`.`typeID`          AS `typeID`,
  `u`.`Tname`           AS `Tname`,
  `u`.`T_reservationID` AS `T_reservationID`
FROM `urban_cloud_reservation`.`ucr_user_order_reservation_type` `u`
WHERE (3 > (SELECT
              COUNT(0)
            FROM `urban_cloud_reservation`.`ucr_user_order_reservation_type`
            WHERE ((`urban_cloud_reservation`.`ucr_user_order_reservation_type`.`T_reservationID` = `u`.`T_reservationID`)
                   AND (`urban_cloud_reservation`.`ucr_user_order_reservation_type`.`typeID` = `u`.`typeID`)
                   AND (`urban_cloud_reservation`.`ucr_user_order_reservation_type`.`Tlevel` < `u`.`Tlevel`))))
ORDER BY `u`.`T_reservationID`,`u`.`typeID`,`u`.`Tlevel`$$
DELIMITER ;

—————————————————————————————————

  • 八、事件

—————————————————————————————————
8.1    >>>开启事件调度器
1、set global event_scheduler=1;
2、set global event_scheduler=true;
3、在my.ini配置文件中加上event_schedule=1或set global event_scheduler=on;
查看是否开启:
show variables like 'event_scheduler';
select @@event_scheduler;
显示系统连接进程:
show processlist;
自定义结束符
delimiter $$
delimiter ;
—————————————————————————————————
8.2    >>>创建事件
delimiter $$
create event if not exists event_insert
    on schedule
    every 1 month
        starts curdate()
        ends '2018-6-3'
        do
        begin
            if year(curdate()) > 2016 then
                insert into tb_student_test
                    values('1601141019','dream','女','1999-8-12','周口沈丘','汉','3');
            end if;
        end $$
delimiter ;
—————————————————————————————————
8.3    >>>修改事件
临时关闭事件
alter event event_insert disable;
再次开启事件
alter event event_insert enable;
修改事件名称
alter event event_insert rename to e_insert;
—————————————————————————————————
8.4    >>>删除事件
drop event if exists event_insert;

—————————————————————————————————

  • 九、存储过程与存储函数

—————————————————————————————————
10.1    >>>存储过程
—————————————————————————————————
10.1.1    >>>创建存储过程
delimiter @@
create procedure sp_update_sex(in sno char(20),in ssex char(20))
    begin
    update tb_student set sex=ssex where studentNo=sno;
    end @@
delimiter ;

查看存储过程:
show procedure status;
show create procedure sp_update_sex;
—————————————————————————————————
10.1.2    >>>存储过程体
存储过程体的常用语法元素
1、局部变量
declare var_name varchar(50) default '拾忆';
2、set 语句
set var_name='简单点';
3、select...into语句
select studentName into var_name from where studentNo='1601141019';
4、流程控制语句
    a.条件判断语句

    b.循环语句
5、游标

delimiter @@
create procedure sp_sumofrow(out rows int)
    begin
    declare sno varchar(10);
    declare found boolean default true;
    declare cur cursor for
        select studentNo from tb_student;
    declare continue handler for not found
        set found=false;
    set rows=0;
    open cur;
    fetch cur into sno;
    while found do
        set rows=rows+1;
        fetch cur into sno;
    end while;
    close cur;
end@@
delimiter ;

—————————————————————————————————
10.1.3    >>>调用存储过程
call sp_update_sex('1601141038','男');
call sp_sumofrow(@rows);
—————————————————————————————————
10.1.4    >>>删除存储过程
drop  procedure sp_sumofrow;
—————————————————————————————————

10.2    >>>存储函数
—————————————————————————————————
10.2.1    >>>创建存储函数
delimiter @@
create function fn_search(sno varchar(10))
    returns varchar(10)
    deterministic
    begin
        declare ssex char(2);
        select sex into ssex from tb_student where studentNo=sno;
        if ssex is null then return(select '没有该学生!');
            else if ssex='女' then return(select '女');
                else return(select '男');
            end if;
        end if;
    end @@
delimiter ;

—————————————————————————————————
    >>>调用存储函数
select fn_search('1601141019');
—————————————————————————————————
    >>>删除存储函数
drop function if exists fn_search;
—————————————————————————————————  

  • 十、访问控制与安全管理

—————————————————————————————————
10.1    >>>用户账号管理
—————————————————————————————————
10.1.1    >>>创建用户账号
create user 'dream'@'localhost' identified by '234',
    'forever'@'localhost' identified by password '*565B1B47FD7BC0488435D2B707071F5EF873197B';

获取加密返回的散列值:
select password('234');
—————————————————————————————————
10.1.2    >>>删除用户
drop user forever@localhost;
—————————————————————————————————
10.1.3    >>>修改用户账号
rename user 'forever'@'localhost' to 'hope'@'localhost';
—————————————————————————————————
10.1.4    >>>修改用户口令
set password for 'hope'@'localhost'=password('234');
set password for 'hope'@'localhost'='*565B1B47FD7BC0488435D2B707071F5EF873197B';

—————————————————————————————————
10.2    >>>账户权限管理
—————————————————————————————————
10.2.1    >>>权限的授予
grant select(studentNo,studentName)
    on db_school.tb_student
    to 'dream'@'localhost';
grant select,update
    on db_school.tb_student
    to 'dream'@'localhost','forever'@'localhost';
grant all
    on db_school.*
    to 'dream'@'localhost';
grant create user
    on *.*
    to 'dream'@'localhost';
—————————————————————————————————
10.2.2    >>>权限的转移与限制
权限转移:
grant select,update
    on db_school.tb_student
    to 'hope'@'localhost' identified by '234'
    with grant option;
权限限制:
grant delete
    on db_school.tb_student
    to 'hope'@'localhost'
    with max_queries_per_hour 1;

—————————————————————————————————
10.2.3    >>>权限的撤销
revoke select
    on db_school.tb_student
    from 'dream'@'localhost';
revoke all privileges,grant option
    from 'dream'@'localhost';
—————————————————————————————————

连接名=mysql_connect("主机","用户名","密码");
连接名=mysql_qconnect("主机","用户名","密码");
mysql_select_db("数据库名",连接名);
查询结果=mysql_query(SQL语句,连接名);
读取结果(数字索引方式与关联索引方式的数组)=mysql_fetch_array(查询结果);
读取结果(数字索引方式与关联索引方式的数组)=mysql_fetch_array(查询结果,MYSQL_BOTH);
读取结果(数字索引方式的数组)=mysql_fetch_row(查询结果);
读取结果(数字索引方式的数组)=mysql_fetch_array(查询结果,MYSQL_NUM);
读取结果(关联索引方式的数组)=mysql_fetch_assoc(查询结果);
读取结果(关联索引方式的数组)=mysql_fetch_array(查询结果,MYSQL_ASSOC);
读取结果指定行=mysql_data_seek(查询结果,行号);
结果行数=mysql_num_rows(查询结果);
mysql_close();


 

posted @ 2018-09-14 13:44  wsyjlly  阅读(412)  评论(0编辑  收藏  举报