三章 高级查询
1.修改表名:
alter table<旧表名> rename [to] <新表明>;
alter table `demo01` rename `demo02`;
2.添加字段:
alter table 表名 add 字段名 数据类型 [属性];
alter table demo02 add `password` varchar(20) not null;
3.修改字段
alter table 表名 change 原字段名 新字段名 数据类型 [属性];
alter table demo02 change `name` `username` char(10) not null;
4.删除字段
alter table 表名 drop 字段名;
alter table demo02 drop `password`;
5.添加主键约束
alter table 表名 add constraint 主键名 primary key 表名 (字段名);
5.1 将grade表中的gradeId字段设置成主键
alter table `grade` add constraint `pk_grade` primary key `grade` (gradeId);
6.添加外键约束
alter table 表名 add constraint 外键名 foreign key (外键字段) references 关联表名 (关联字段)
6.1 设置syudent表的gradid字段与grade表的gradid字段建立主外键关联
alter table `student` add constraint fk_student_grade foreign key(`gradeId`) references `grade` (`gradeId`);
7.插入单行数据
insert into 表名 [(字段名列表)] values (值列表);
insert into `syudent`(`loginPwd`,`studentName`,`gradeId`,`phone`,`bornDate`)
values('123','黄小平',1,'13956799999','1996-5-8');
注意: 字段名是可选的,如省略则依次插入所有字段
多个列表和多个值之间使用逗号分隔
值列表和字段名列表一一对应
如插入的是表中部分数据,字段名列表必填
8.插入多行数据
insert into 新表 (字段名列表) values(值列表1),(值列表2),……,(值列表n);
insert into `subject` (`subjectName`,`classHour`,`gradeID`)
values('Logic Java',220,1),('HTML',160,1),('Java OOP',230,2);
经验:为避免表结构发生变化引发的错误,建议插入数据时写明具体字段名!
9.将查询结果插入的新表
insert into 新表 (字段1,字段2,字段3)
select 字段1,字段2……
from 原表;
句式1:需要先按照所插入字段的类型,顺序,个数创建新表,才能插入数据
create table 新表 (
select 字段1,字段2
from 原表 );
9.1 将syudent表中的studentName ,phone字段数据保存到新表phoneList中
create table `phoneList`(select `studentName`,`phone` from `student`);
句式2: 岁插入语句的执行而创建新表,无须先创建表;,如果新表存在,将会报错
10.更新数据记录,删除数据记录
10.1更新数据记录
update 表名 set 字段1=值1,字段2=值2,…,字段n=值n [where 条件];
10.2 修改student表中学员为10011学员的手机号码和家庭住址
update `sutudent`
set `phone`='1381014' , `address`='............'
where `studentNo`=10011;
10.2删除表记录
delate from 表名 [where条件];
删除phoneList表中黄小平的记录
deleta from `phoneList` where `studentName`='黄小平';
10.3删除表中所有记录
truncate table 表名;
11.DQL语句
select <字段名列表>
from <表名或视图>
[where <查询条件>]
[group by <分组的字段名>]
[having<条件>]
[order by <排序的字段名>[asc或deac]]
12.LIMIT字句
select <字段名列表>
from <表名或视图>
[where <查询条件>]
[group by <分组的字段名>]
[order by <排序的列名>[asc或deac]]
[limit [位置偏移量,]行数]
12.1示例
SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate`
FROM `student`
WHERE `gradeId` = 1
ORDER BY `studentNo`
LIMIT 4,4;
13 常用的函数
复合函数
字符串函数 日期函数
数学函数
14.子查询
14.1.简单子查询语法
SELECT … FROM 表1 WHERE 字段1 比较运算符(子查询)
14.2.查询出身日期比李斯文打的学生
select `studentNo`,`studentName`,`sex`,`bormDate`,`address`
from `student`
where `bornDate`>
(select `bornDate`from`student`where`studentName`=`李斯文`);
- 子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询
- 子查询在WHERE语句中的一般用法
注意:将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个
15.查询“Logic Java”课程至少一次考试刚好等于60分的学生
分析:
(1)查询subject表,获得Logie Java课程的课程编号。
(2)根据课程编号,查询result表中成绩是60分的学生的学号。
(3)根据学号,查询student表得到学生姓名。
因为涉及多表,所以我们可以采用表连接,在SQL Server课程中曾经学习过
方法一:采用表连接
select `studentName` from `student` (内连接(等值连接)
inner join `result` r on stu.studentNO = r.studentNo
inner join `subject` sub ON r.subjectNo=sub.subjectNo
where `studentResult` = 60 and `subjectName`='Logic Java';
方法二: 采用子查询
select 'studentName` from `student` where `studentNo` = (
swelect `studentNo` from `result`
inner join `Subject` on result.subjectNo= subject.subjectNo
where `studentResult` =60 AND `subjectName` ='Logic Java'
);
- 子查询:比较灵活、方便,常作为增删改查的筛选条件,适合于操纵一个表的数据
- 表连接:更适合于查看多表的数据
16.IN和NOT IN子查询
16.1in子查询
16.1.1查询“Logic Java”课程考试成绩为60分的学生名单
SELECT `studentName` FROM `student`
WHERE `studentNo` IN(
SELECT `studentNo` FROM `result`
WHERE `subjectNo` = (
SELECT `subjectNo` FROM `subject`
WHERE `subjectName`='Logic Java'
)AND `studentResult` = 60
);
in后面的子查询可以返回多条记录,用于限制学号的删选范围。