MySql学习day02 复制表结构 数据库操作语句(DML) select语句

  1. 复制表结构
    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);

  1. 数据库操作语句(DML)
    对表中数据的更改
    2.1 insert语句
    2.1.1 作用
    向指定表中插入数据
    2.1.2 插入一行数据的语法
    insert into 表名[(字段列表)] values(值列表);
    注意:字段列表为可选项。如果省略字段列表,相当于提供了和表结构字段的数量和顺序一致的字段列表,所以值列表也必须提供和字段列表一致的字段的值。
    2.1.3 示例
    1. 向指定表中的所有字段插入数据
      – 向教师表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’);
  1. 在指定字段插入数据(自增长字段)
    – 向班级表中插入如下数据:
    ±------------------------------------------+
    |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班’,‘机电工程’);

  2. 在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 示例

  1. 删除表stu2中 student_name为’张三’的数据
    delete from stu2 where student_name=‘张三’;
  2. 删除表stu2中的全部数据
    delete from stu2;
    2.3.4 truncate语句
  3. 语法
    truncate table 表名;
  4. 作用
    截断表
  5. 示例
    truncate table stu1;
  6. 和delete语句的区别
    1> truncate语句不能应用于主表(即使子表中没有数据)
    truncate table student; – 失败
    delete from student; – 成功
    2> 对于自增长字段,使用delete删除时,继续编号
    使用truncate截断表时,自增长字段的值恢复初始值
    delete from exam_score;
    truncate table exam_score;
    3> 使用delete语句删除数据可以回滚
    使用truncate语句截断表不能回滚
  1. 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子句指定字段列表
字段列表的指定方式:
: 代表数据源中的全部字段
字段列表: 逗号隔开的多个字段,指定需要检索的若干个字段
表名.
: 多表查询中,指定某个表的全部字段
表名.字段: 多表查询中,指定某个表的某个字段
表达式: 表达式中可以包含算数运算、函数等

  1. 列出MySQL的版本号、服务器时间
    select version(),now();
  2. 别名
    字段或表达式 [as] 别名
    select version() as 版本号,now() as 服务器时间;

3.2 基本查询语句

  1. 语法
    select 字段列表 from 表名;
  2. 示例
    – 列出表中全部字段
    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 内连接

  1. 语法
    select 字段列表
    from 表1 [inner] join 表2 on 关联条件;
  2. 示例
    – 需求:列出学生及其所在班级的信息,包括学号、姓名、班级和院系
    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;
  1. 表的别名
    表名 [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 外连接

  1. 左外连接
    左外连接的结果集=内连接的结果集+左表中匹配不上的数据行
    – 语法
    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;
  2. 右外连接
    右外连接的结果集=内连接的结果集+右表中匹配不上的数据行
    – 语法
    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;
  3. 全外连接 – 目前MySQL不支持
    全外连接的结果集=内连接的结果集+两表中匹配不上的数据行
    – 语法
    select 字段列表
    from 左表 full [outer] join 右表 on 关联条件;

3.2.4 三表内连接

  1. 语法
    select 字段列表
    from 表1 join 表2 on 关联条件1
    join 表3 on 关联条件2;
  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.列出学生的学号、姓名、班级名称和考试成绩

你可能感兴趣的:(MySql)