MySql学习day02 复制表结构 数据库操作语句(DML) select语句
- 复制表结构
1.1 复制表结构(不包含数据)
– 语法
create table 新表名 like 源表名;
– 示例
create table stu1 like student;
1.2 使用查询结果集创建新表
– 语法
create table 新表名 select语句;
– 示例
– 向stu1中插入测试数据
insert into stu1 values(‘2017001’,‘张三’,‘10000000000’,1);
insert into stu1 values(‘2017002’,‘李四’,‘11000000000’,1);
insert into stu1 values(‘2017003’,‘王五’,‘12000000000’,2);
insert into stu1 values(‘2017004’,‘赵六’,‘13000000000’,null);
– 复制stu1表的结构和数据
create table stu2 select * from stu1;
insert into stu2 values(‘2017001’,‘张三’,‘10000000000’,1);
- 数据库操作语句(DML)
对表中数据的更改
2.1 insert语句
2.1.1 作用
向指定表中插入数据
2.1.2 插入一行数据的语法
insert into 表名[(字段列表)] values(值列表);
注意:字段列表为可选项。如果省略字段列表,相当于提供了和表结构字段的数量和顺序一致的字段列表,所以值列表也必须提供和字段列表一致的字段的值。
2.1.3 示例 [ol] 向指定表中的所有字段插入数据
– 向教师表teacher中插入如下数据:
±------------------------------------------+
|teacher_no teacher_name teacher_contact|
±------------------------------------------+
| ‘001’ ‘李老师’ ‘11000000000’|
| ‘002’ ‘王老师’ ‘12000000000’|
| ‘003’ ‘孙老师’ ‘13000000000’|
±------------------------------------------+
– SQL语句如下:
insert into teacher(teacher_no,teacher_name,teacher_contact)
values(‘001’,‘李老师’,‘11000000000’);
insert into teacher
values(‘002’,‘王老师’,‘12000000000’);
insert into teacher
values(‘003’,‘孙老师’,‘13000000000’);
-
在指定字段插入数据(自增长字段)
– 向班级表中插入如下数据:
±------------------------------------------+
|class_no class_name department_name|
±------------------------------------------+
| 1 ‘2017自动化1班’ ‘机电工程’ |
| 2 ‘2017自动化2班’ ‘机电工程’ |
| 3 ‘2017自动化3班’ ‘机电工程’ |
±------------------------------------------+
– SQL语句如下:
insert into classes values(null,‘2017自动化1班’,‘机电工程’);
insert into classes(class_name,department_name)
values(‘2017自动化2班’,‘机电工程’);
insert into classes values(3,‘2017自动化3班’,‘机电工程’); -
在insert语句中使用默认值
– 向课程表course中插入如下数据:
±---------------------------------------------------+
|course_name up_limit description status teacher_no |
±---------------------------------------------------+
| ‘Java语言’ 60 ‘暂无’ ‘已审核’ ‘001’ |
|‘MySQL数据库’ 150 ‘暂无’ ‘已审核’ ‘002’ |
| ‘C语言’ 230 ‘暂无’ ‘已审核’ ‘003’ |
±---------------------------------------------------+
– SQL语句如下:
insert into course values(null,‘Java语言’,default,‘暂无’,‘已审核’,‘001’);
或
insert into course
(course_name,description,status,teacher_no)
values(‘Java语言’,‘暂无’,‘已审核’,‘001’);
insert into course values(null,‘MySQL数据库’,150,‘暂无’,‘已审核’,‘002’);
insert into course values(null,‘C语言’,230,‘暂无’,‘已审核’,‘003’);
#错误 违反了外键约束
insert into course values(null,‘C#’,150,‘暂无’,default,‘007’);
#错误 违反了唯一约束
insert into course values(null,‘C#’,150,‘暂无’,default,‘002’);
– 向教师表teacher中插入一行数据
insert into teacher values(‘004’,‘刘老师’,‘14000000000’);
– 向课程表中插入数据 teacher_no字段使用’004’
insert into course values(null,‘C#’,150,‘暂无’,default,‘004’); – 成功执行后,自增长字段的值为6
2.1.4 批量掺入多行数据
– 语法
insert into 表名[(字段列表)] values
(值列表1),
(值列表2),
…
(值列表n);
– 示例:使用批量插入的语句向学生表student中插入以下数据:
---------------------------------------------------
student_no student_name student_contact class_no
---------------------------------------------------
‘2017001’ ‘张三’ ‘15000000000’ 1
‘2017002’ ‘李四’ ‘16000000000’ 1
‘2017003’ ‘王五’ ‘17000000000’ 3
‘2017004’ ‘马六’ ‘18000000000’ 2
‘2017005’ ‘田七’ ‘19000000000’ 2
---------------------------------------------------
– SQL语句如下:
insert into student values
(‘2017001’,‘张三’,‘15000000000’,1),
(‘2017002’,‘李四’,‘16000000000’,1),
(‘2017003’,‘王五’,‘17000000000’,3),
(‘2017004’,‘马六’,‘18000000000’,2),
(‘2017005’,‘田七’,‘19000000000’,2);
2.1.5 使用insert…select语句插入结果集
– 语法
insert into 目标表名[(字段列表1)] select 字段列表2 from 源表名[ where子句];
– 示例:把学生表student中的数据插入到stu2中
insert into stu2 select * from student;
2.2 update语句
2.2.1 作用
根据条件修改表中的数据
2.2.2 语法
update 表名 set 字段名=新值[,字段名=新值,…] [where 条件];
2.2.3 示例
– 创建成绩表
create table exam_score(
stu_no int auto_increment primary key,
e_score tinyint unsigned,
a_score tinyint unsigned,
c_no int
);
– 插入测试数据
insert into exam_score values(null,55,80,1);
insert into exam_score values(null,98,95,1);
insert into exam_score values(null,85,90,1);
insert into exam_score values(null,25,80,1);
insert into exam_score values(null,52,80,1);
– 所有学生的成绩加5分(没有where子句)
update exam_score set e_score=e_score+5;
– 将成绩大于100的,改为100
update exam_score set e_score=100 where e_score>100;
– 成绩处于[55,59]之间的,改为60
update exam_score set e_score=60
where e_score>=55 and e_score<=59;
– 更改学生表student,把’张三’的班号改为4
#错误 违反了外键约束 classes表中不存在class_no=4的数据
update student set class_no=4 where student_name=‘张三’;
– 更改班级表classes,将class_no=1的更改为class_no=4
#错误 违反了外键约束 主表中class_no=1的数据被子表引用
update classes set class_no=4 where class_no=1;
– 将stu1中 学号为’2017004’的姓名改为’马六’、班号改为1
update stu1 set student_name=‘马六’,class_no=1
where student_no=‘2017004’;
2.3 delete语句
2.3.1 作用
根据条件删除表中复合条件的数据行
2.3.2 语法
delete from 表名 [where 条件表达式];
2.3.3 示例
- 删除表stu2中 student_name为’张三’的数据
delete from stu2 where student_name=‘张三’; - 删除表stu2中的全部数据
delete from stu2;
2.3.4 truncate语句 - 语法
truncate table 表名; - 作用
截断表 - 示例
truncate table stu1; - 和delete语句的区别
1> truncate语句不能应用于主表(即使子表中没有数据)
truncate table student; – 失败
delete from student; – 成功
2> 对于自增长字段,使用delete删除时,继续编号
使用truncate截断表时,自增长字段的值恢复初始值
delete from exam_score;
truncate table exam_score;
3> 使用delete语句删除数据可以回滚
使用truncate语句截断表不能回滚
- select语句
3.1 select语句概述
3.1.1 语法
select 字段列表
from 数据源
[where 条件表达式]
[group by 分组字段
[having 条件表达式]]
[order by 排序字段 [排序方式]];
其中:
字段列表: 指定检索字段
数据源: 检索的表、视图、结果集等
where子句: 用于指定数据行的过滤条件
group by子句:根据分组字段,把数据行分成若干个组并进行汇总统计
having子句: 对分组结果进行筛选
order by子句:对结果集进行排序
3.1.2 使用select子句指定字段列表
字段列表的指定方式:
: 代表数据源中的全部字段
字段列表: 逗号隔开的多个字段,指定需要检索的若干个字段
表名.: 多表查询中,指定某个表的全部字段
表名.字段: 多表查询中,指定某个表的某个字段
表达式: 表达式中可以包含算数运算、函数等
- 列出MySQL的版本号、服务器时间
select version(),now(); - 别名
字段或表达式 [as] 别名
select version() as 版本号,now() as 服务器时间;
3.2 基本查询语句
- 语法
select 字段列表 from 表名; - 示例
– 列出表中全部字段
select * from student;
– 列出表中的部分字段
select student_no,student_name,class_no from student;
– 命名别名
select student_no 学号,student_name 姓名,class_no 班号
from student;
– 使用表达式
select stu_no 学号,e_score 卷面成绩,a_score 平时成绩,
e_score0.8+a_score0.2 成绩 from exam_score;
3.3 使用 distinct 排重
select distinct 字段列表 from 表名;
– 设置当前数据库为information_schema
use information_schema;
– 查看所有表
show tables;
– 查看表tables的表结构
desc tables;
– 列出表table中的table_type字段(单列排重)
select table_type from information_schema.tables;
select distinct table_type from tables;
– 列出表table中的table_schema,table_type字段(多列排重)
select distinct table_schema,table_type from tables;
3.4 使用limit实现分页
3.4.1 语法
select 字段列表 from 表名
limit [start,] length;
其中:
start 表示从第几行数据开始检索,默认为0,表示第一行
length 表示要检索的行数 (每页的行数)
3.4.2 示例
– 列出information_schema.tables表中的前10行
显示table_schema,table_name
select table_schema,table_name
from information_schema.tables
limit 10;
– 列出information_schema.tables表中的第7页(每页10行)
select table_schema,table_name
from information_schema.tables
limit 60,10;
3.5 多表查询
3.2.1 多表查询的类型
内连接:符合关联条件的数据行被检索到结果集中,不符合条件的被过滤掉
外连接:外连接的结果集=内连接的结果集+匹配不上的数据
3.2.2 内连接
- 语法
select 字段列表
from 表1 [inner] join 表2 on 关联条件; - 示例
– 需求:列出学生及其所在班级的信息,包括学号、姓名、班级和院系
student: 学号、姓名
classes: 班级、院系
关联条件: student.class_no=classes.class_no
select student.student_no,student.student_name, classes.class_name,classes.department_name from student join classes on student.class_no=classes.class_no; -- 向学生表student中插入一行数据 insert into student values('2017006','小王','20000000000',null); -- 向班级表classes中插入一行数据 insert into classes values(null,'2017电子信息工程','信息学院'); -- 如果关联的两张表中,有重名字段,则该字段必须用表名修饰 select student_no,student_name, class_name,department_name from student join classes on student.class_no=classes.class_no;
- 表的别名
表名 [as] 别名
select s.student_no,s.student_name,
c.class_name,c.department_name
from student s join classes c
on s.class_no=c.class_no;
#错误 表一旦命名别名,则在该语句中只能使用别名,不能使用原表名
select student.student_no,s.student_name,
~~~~~~~~~~~~~~~~~~
c.class_name,c.department_name
from student s join classes c
on s.class_no=c.class_no;
练习:列出教师及其所授课程的信息,包括教师姓名、课程名和人数
select t.teacher_name 姓名,c.course_name 课程,c.up_limit 人数
from teacher t join course c
on t.teacher_no=c.teacher_no;
3.2.3 外连接
- 左外连接
左外连接的结果集=内连接的结果集+左表中匹配不上的数据行
– 语法
select 字段列表
from 左表 left [outer] join 右表 on 关联条件;
– 示例:使用左外连接列出所有学生及其所在班级的信息
select s.student_no,s.student_name,c.class_name
from student s left join classes c
on s.class_no=c.class_no; - 右外连接
右外连接的结果集=内连接的结果集+右表中匹配不上的数据行
– 语法
select 字段列表
from 左表 right [outer] join 右表 on 关联条件;
– 示例:列出学生及其所在班级信息,包含所有班级
select s.student_no,s.student_name,c.class_name
from student s right join classes c
on s.class_no=c.class_no; - 全外连接 – 目前MySQL不支持
全外连接的结果集=内连接的结果集+两表中匹配不上的数据行
– 语法
select 字段列表
from 左表 full [outer] join 右表 on 关联条件;
3.2.4 三表内连接
- 语法
select 字段列表
from 表1 join 表2 on 关联条件1
join 表3 on 关联条件2; - 示例
– 列出教师姓名、所授课程名称和选修该课程的学生的学号
select t.teacher_name,c.course_name,ch.student_no
from teacher t join course c on t.teacher_no=c.teacher_no
join choose ch on c.course_no=ch.course_no;
练习:
1.向选课表中插入如下数据
student_no course_no score choose_time
‘2017001’ 2 40 now()
‘2017001’ 1 50 ‘2018-12-30 11:30:30’
‘2017002’ 3 60
‘2017002’ 2 70
‘2017003’ 1 80
‘2017004’ 2 90
‘2017005’ 3 NULL
‘2017005’ 1 NULL
insert into choose values(null,‘2017001’,1,40,‘2018-12-30 11:30:30’);
insert into choose values(null,‘2017001’,3,50,‘2018-12-30 10:30:30’);
insert into choose values(null,‘2017002’,4,60,‘2018-12-30 09:30:30’);
insert into choose values(null,‘2017002’,7,70,‘2018-12-30 08:30:30’);
insert into choose values(null,‘2017003’,3,80,‘2018-12-30 12:30:30’);
insert into choose values(null,‘2017004’,1,90,‘2018-12-30 13:30:30’);
insert into choose values(null,‘2017005’,3,null,‘2018-12-30 14:30:30’);
insert into choose values(null,‘2017005’,4,null,‘2018-12-30 15:30:30’);
2.使用表连接列出教师及其所授课程的信息,包括教师工号、姓名、课程名和人数
– 向教师表teacher中插入一行数据
– 分别使用内连接、左外连接和右外连接查询结果
3.列出学生的学号、姓名、班级名称和考试成绩
- PHP MySQL 数据库dml语句与dql语句的操作
- 数据库_MySQL_ SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
- 数据库MYSQL学习总结18—SELECT语句的基本形式
- mysql之sql语句-数据库、表结构相关的基础操作
- php中对MYSQL操作之预处理技术(1)数据库dml操作语句
- MySql学习day02:DQL语句:Select
- mysql 操作语句_select子句、数据库的操作
- php中对MYSQL操作之预处理技术(1)数据库dml操作语句
- Mysql学习点滴记录(1)--》数据库和表的操作
- mysql 复制一个表,复制一个表结构的sql 语句
- 学习Asp.Net应当知道的基本数据库操作语句
- MYSQL5.0 脚本测试笔记【复制表结构和数据SQL语句】
- Mysql数据库学习(一):数据库基本概念、关系型数据库、Mysql数据库安装配置、DDL/DCL/DML语句
- 学习Asp.Net应当知道的基本数据库操作语句
- mysql性能优化学习笔记(5)数据库结构优化
- 数据库工程师考试自学(4)---MySql与SQL Server 查看数据库与表结构的语句
- SQL语句:在两个数据库间复制表结构和数据数据库
- MySQL复制表结构和表数据的SQL语句和时间函数
- 数据库学习--mysql语句汇总
- MySql常用操作语句(2:数据库、表管理以及数据操作)