MySql面试前必须练习到熟练的
来源:互联网 发布:淘宝赚佣金的软件 编辑:程序博客网 时间:2024/05/22 14:07
一、建表语句
1、使用数据库——USE 数据库名;
2、建表语句——以一个学生成绩表为例
CREATE TABLE test(
id int not null,
name char(20),
score int,
primary key(id),
check(score between 0 and 100)
)engine = Innodb;
约束语句:
设置默认值——DEFAULT '默认值'
设置非空——NOT NULL
设置唯一——UNIQUE(字段名)
设置主键——PRIMARY KEY(字段名)
设置外键——FOREIGN KEY(字段名) REFERENCES 表名(字段名)
设置CHECK约束——CHECK(字段名 BETWEEN xx AND xx) 或 CHECK(字段名=xx or ……) 或CHECK(字段名>xx AND ……)
约束类型。
具体语法分为:列级___约束、表级__约束
主键约束 :是用来唯一标识表中一个列的,一个表中主键约束只能有一个,但是一个主键约束中可以包含多个列,也称联合主键。
外键约束:用来建立两个表中列之间关系的,它可以由1列或多列组成。一个表可以有一个或多个外键。
唯一约束:也是用来唯一标识表中列的,与主键约束不同的是在一张数据表中可以有多个唯一约束。
检查约束:(该约束在表中是不起作用的,即仍然可以插入不符合条件的数据)用来限定表中列里输入值的范围。
默认值约束:用来当不给表中的列输入值时,自动为该列添加一个值。
非空约束:(这个是给表中新建字段时,都会添加null或者not null ,默认为null)用来限定数据表中的列必须输入值。
注意提醒:
a. 以上6种约束中,只有主键约束在一个表中只能有一个,其他的约束都可以有多个。
b. 联合主键约束只能用表级主键约束的语法格式。
c.
二、插入数据——insert into 表名(字段1,字段2,……) values(值1,值2,……);
示例:insert into test(id,name,score) values(1,'test1',60);
insert ... set 形式
insert tableName().... select 形式(可以将其他表中的数据插入该表中)
三、删除数据——delete form 表名 where 条件;
示例:delete from test where id = 1;
四、修改数据——update 表名 set 字段名 = 新值 where 条件;
示例:update test set score=666 where id = 1;
五、聚合函数
注意:where子句中不能使用聚合函数,因为聚合函数对结果集进行操作,而where子句运行时还没有筛选出结果集,所以此时使用聚合函数会报错;与where相比,having虽然也是用来筛选的,但having是用来筛选分组的,跟在group by之后,所以having子句运行时结果集已经被筛选出,此时可以使用聚合函数进行二次筛选。
1、返回某列平均值——AVG(字段名) 示例:select max(score) from test;
2、返回某列行数——COUNT(字段名) 示例:select count(id) from test;
3、返回某列最大值——MAX(字段名) 示例:select max(score) from test;
4、返回某列最小值——MIN(字段名) 示例:select min(score) from test;
5、返回某列值之和——SUM(字段名) 示例:select sum(score) from test;
综合示例:select count(id),max(score),min(score) from test;
Group By使用:
示例:
首先在表中加上一个字段sex性别(这样的修改尽量避免,在此只为测试)——alter table test sex char(2) default '男'
并插入一条实例数据——insert into test(id,name,score,sex) values(8, 'test8', 88, '女');
然后对sex分组——select sex from test group by sex;
发现这样的结果只是会根据sex类型分为两组,每组只显示一条数据,这样的操作是没有意义的,所以Group By一般与聚合函数一起使用。
聚集函数与Group By使用:
示例:select sex,count(sex) from test group by sex;
这样就会把各个性别人数统计出来。
聚集函数与Group By与Having一起使用:
having子句可以再次筛选符合条件的分组
示例:select sex,count(sex) from test group by sex having count(sex) > 1;
六、面试常见查询语句(能掌握以下几个例子就基本可以了)
表结构:
student(s#,sname,sage,ssex)学生表
course(c#,cname,T#)课程表
sc(s#,c#,score)成绩表
Teacher(T#,tname)教师表
1.查询001课程比002课程成绩高的所有学生的学号:
select sc1.s#
from sc sc1 join sc sc2 on sc1.s# = sc2.s#
where sc1.c# = '001' and sc2.c# = '002' and sc1.score > sc2.score
2.查询平均成绩大于60分的同学的学号和平均成绩:13708374810
select s#, avg(score) from sc group by s# having avg(score)>60;
3.查询所有同学的学号,姓名,选课数,总成绩:
select student.s#,student.name ,count(sc.c#) ,sum(sc.score)
from student left join sc on student.s# = sc.s# 注:内连接要计算笛卡尔积,这里使用左外连接效率更高
4.查询姓李的老师个数:
select count(T#) from Teacher where tname like "李%"
注:模糊查询, %代表任意字符,_代表任一单个字符,[……]代表是括号中字符中的单个字符, [^……]代表不是括号中字符中的单个字符
5.查询没有学过叶萍老师课的同学学号,姓名:
select studet.s# student.sname
from student
where s# not in (select distinct(sc.s#) from sc, course, teacher where sc.c# = course.c# and teacher.t# = course.t# and teacher.tname = "叶萍");
三表联合 + 子查询
6.查询学过001和002课程的同学的姓名学号:
select student.s3 student .sname
from student join course on student.s# = course.s#
where(course.c# = '001' union course.c# = '002');
7.查询学过叶萍老师课的同学的学号,姓名:
select student.s# student.sname
from student
where s# in(select distinct(sc.s#) from sc course teacher where sc.c# = course.c# and teacher.t# = course.t# and teacher.tnmae = "叶萍") 注:distinct为去重函数
8.查询002成绩比001低的同学的学号,姓名:
select student.s# student .name
from student where student.s# in(select sc1.s# from sc sc1 join sc sc2 on sc1.s# = sc2.s# where s1.c# = 001 and s2.c# = 002 and sc1.score> sc2.score);
9.查询所有课程成绩小于60分的同学的学号,姓名:
select student.s# student.sname from student join sc on student.s# = sc.s#
where sc.score > 60;
10.查询没有学全 所有课的同学的学号和姓名:
select student.s# student.sname from student,sc
where student.s# = sc.s# group by student.s#,student.sname having count(c#) < (select count(c#)from course);
11.查询至少有一门课程与学号1001的同学所学相同的同学的学号和姓名:
select student.s# ,student.sname from student join sc
where student.s# = sc.s# and c# in select c# from sc where s# = '1001'
12.查询至少学过学号为001同学所有一门课的其他同学的学号和姓名:
select distinct student.s#,student,sname from
SC join student on SC.s# = student.s#
where c# in(select c# from sc where s#='001');
0 0
- MySql面试前必须练习到熟练的
- MySql面试前必须练习到熟练的。
- c++面试必须熟练掌握的算法(持续更新)
- C++面试前必须复习的知识点
- 【黑马程序员】入学面试前的练习
- MySQL迁移到Oracle前必须了解的50件事
- VIM必须熟练使用的几个命令
- 几个必须熟练使用的注解
- 必须熟练英语
- 网管必须熟练掌握的“杀手剪”命令,你会用吗?
- 数据管理人员必须熟练掌握的一些”关键词“
- C/C++程序员必须熟练应用的开源项目
- C/C++程序员必须熟练应用的开源项目
- C/C++程序员必须熟练应用的开源项目
- C/C++程序员必须熟练应用的开源项目
- C/C++程序员必须熟练应用的开源项目
- C/C++程序员必须熟练应用的开源项目
- C/C++程序员必须熟练应用的开源项目
- VS2010环境下 用MySQL Connector C 连接 MySql数据库
- JavaScript笔记(1)
- 做好正确的选择,明确奋斗的目标
- 自定义带头部和尾部的RecyclerView
- 递归函数解析
- MySql面试前必须练习到熟练的
- P1529 回家 Bessie Come Home(字符串+flored)+特判
- springmvc 和 cxf整合
- linux内核系列(2)——linux内核链表
- sass编译过程中出现编码错误的问题
- 3-GMM-HMMs语音识别系统-解码篇
- hdu 6016
- 基于TensorFlow的MNIST(手写图像识别)的一点经验
- 计算机图形学01——坐标系