SQL内连接查询,外连接查询,子查询,其他函数,聚合函数

1.内连接查询  INNER JOIN 插入的表名  ON  链接相同的条件

1.查询学生的学号,姓名,性别,电话,年纪名称  
       首先学生表中没有年纪名称,只有年纪编号,这里我们采用学生表和年纪表链接查询
        使用 inner join 链接查询年纪表,使用on 指定链接查询的条件。
        这里的含义是:当学神表的年纪编号等于年纪表的编号,返回 年纪表中对应的年纪名称; 
        SELECT studentno,studentName,sex,phone ,GradeName FROM student 
        INNER JOIN grade ON student.`gradeId`=grade.`GradeId`;

2.查询课程编号,课程名称。课时。年纪名称
        SELECT SubjectId, ClassHour,  GradeName FROM `subject` INNER JOIN grade ON         subject.`GradeId`=grade.`GradeId`;

3.查询 考试编号 学生姓名,课程名称,考试成绩,考试时间
        SELECT ResultId ,studentName,SubjectName,StudentResult,ExamDate FROM result
        INNER JOIN student ON result.`StudentNo`=student.`studentno` 
        INNER JOIN `subject` ON result.`SubjectId`=subject.`SubjectId`;


4.查询 考试编号 学生姓名,学生所属年纪名称,课程名称,考试成绩,考试时间
        SELECT ResultId ,studentName,SubjectName,Gradename,StudentResult,ExamDate         FROM result
        INNER JOIN student ON student.`studentno`= result.`StudentNo`
        INNER JOIN `subject` ON result.`SubjectId`=subject.`SubjectId`
        INNER JOIN grade ON student.`gradeId`=grade.`GradeId`;

5.查询考试编号,学生姓名,课程名称,课程所属年纪名称,考试成绩,考试时间
        SELECT ResultId,studentName,Gradename,StudentResult,ExamDate FROM  result
        INNER JOIN student ON student.`studentno`= result.`StudentNo`
        INNER JOIN `subject` ON result.`SubjectId`=subject.`SubjectId`
        INNER JOIN grade ON subject.`gradeId`=grade.`GradeId`;

6.查询‘使用c#语言开发数据库应用系统“课程前三名的考试成绩,查询对应的学生姓名,考试成绩,考试时间”
SELECT studentName,StudentResult,ExamDate FROM result
INNER JOIN student ON result.`StudentNo`=student.`studentno`
INNER JOIN SUBJECT ON result.`SubjectId`=subject.`SubjectId`
WHERE subject.`SubjectId` ='1' 
ORDER BY StudentResult DESC LIMIT 3;


7.查询学号,姓名,性别,电话,年纪编号,年纪名称,
#注意在表名称查询中,列如果唯一属于某个表,在查询时可以省略表明,列名
#如果某个列在两张表中都存在,就必须明确查询的该列属于那张表
SELECT studentno,studentName,sex,phone ,student.`gradeId`,GradeName FROM student 
INNER JOIN grade ON student.`gradeId`=grade.`GradeId`;

SELECT studentno,studentName,sex,phone ,student.`gradeId`,GradeName FROM student 
INNER JOIN grade ON student.`gradeId`=grade.`GradeId`;

2.外连接查询

1.查询参加过考试的学生姓名和电话
内连接查询时查询两张表中关联的数据
SELECT DISTINCT studentName,phone FROM student
INNER JOIN result ON student.`studentno`=result.`StudentNo`

2.查询没有参加过考试的学生姓名和电话
外连接查询,不仅返回两张表关联的数据,也返回不关联的数据
外连接查询,又分:左外链接和右外链接
RIGHT JOIN 右链接,右表所有的数据都返回
LEFT  JOIN 左连接,左表所有的数据都返回
SELECT  studentName,phone,StudentResult 
FROM student LEFT JOIN result ON student.`studentno`=result.`StudentNo`;

3.子查询  limit 不能在子查询中

1.查询 深入.NET平台和C#编程 考试前5名学生信息
  SELECT * FROM student WHERE StudentNo IN( 
  SELECT StudentNo FROM result WHERE StudentResult IN(
  SELECT  StudentResult FROM result WHERE SubjectId IN(
  SELECT  SubjectId FROM SUBJECT WHERE SubjectName='深入.NET平台和C#编程'
  )ORDER BY StudentResult DESC
  ) 
  )LIMIT 5 ;

4.其他函数

1.字符串函数

CONCAT()字符串连接
SELECT CONCAT ('王','杰','杰');

SELECT * FROM student WHERE address LIKE CONCAT ('%','北京','%');

INSERT()字符串替换
从指定位置 开始删除指定长度的字符串
SELECT INSERT ('abcdefg',3,3,'');
删除的内容,可以公共函数的第四个参数指定替换的内容  3指的第三个开始,数后面4个,最后修改
SELECT INSERT ('abcdefg',3,4,'哈哈哈哈');
SELECT INSERT ('13770689489',3,5,'*****');
在查询语句中如何使用函数 
SELECT studentName AS 姓名, INSERT (phone,4,5,'*****')AS 电话 FROM student;

 LOWER()将字符串转为小写
SELECT LOWER ('aBcdefg');

 UPPER()将字符串转为大写
SELECT UPPER ('aBcdefg');

 SUBSTRING()字符串截取
重点(注意 这里3是位置,4是截取的长度)
SELECT SUBSTRING('abcdefg',3,4 ); 
如果只传位置,表示从当前位置从后面全部截取
SELECT SUBSTRING('abcdefg',3); 
 查询学生的性和名
SELECT SUBSTRING(studentName,1,1)as姓 ,SUBSTRING(studentName,2)AS 名 FROM student;

 2.日期函数
CURDATE()获取当前日期
SELECT CURDATE();

CURTIME()获取当前时间
SELECT CURTIME();

 NOW()获取当前日期和时间
SELECT NOW();

YEAR()获取年
SELECT YEAR(NOW());


 MONTH()获取月
SELECT MONTH(NOW());


 DAY()获取日
SELECT DAY(NOW());


 HOUR()获取小时
SELECT HOUR(NOW());


 MINUTE()获取分钟
SELECT MINUTE(NOW());


 SECOND()获取秒
SELECT SECOND(NOW());


 WEEK()获取周
SELECT WEEK(NOW());


 DATEDIFF()获取两个日期间隔天数
SELECT DATEDIFF (NOW(),'2000-8-30');

#ADDDATE()指定的日期上增加天数
SELECT ADDDATE(NOW(),10);

3.数学函数
 CEIL()向上取整
SELECT CEIL(55.1);

 FLOOR()向下取整
SELECT FLOOR(55.9);

 RAND()随机数
SELECT RAND()*10;

查询学生的姓名,年龄
SELECT studentName AS 姓名 ,CEIL (DATEDIFF(NOW(),bornDate)/365) AS 年龄 FROM student;

5.聚合函数:一般用于对查询结果进行统计 COUNT(*)统计行数,count(列名)统计指定列部位null的行数
 count 用于统计数量

1.查询 s1年纪有多少学生
SELECT COUNT(*) FROM student WHERE GradeId=(
SELECT GradeId FROM grade WHERE GradeName='S1'
);

SELECT COUNT(*) AS 学生数量 FROM student
WHERE email IS NULL;

下面写法用于统计不为null的行数数量
SELECT COUNT(email)AS 学生数量   FROM student;

sum :用于求和
SELECT SUM( StudentResult)AS 总分 FROM result;

2. 查询白燕的sum总分,avg 平均分,max最大分,min最小分 

SELECT SUM( StudentResult)AS 总分,FLOOR(AVG(StudentResult))AS 平均分
,MAX(StudentResult)AS 最大值,MIN(StudentResult)AS 最小值  FROM result WHERE StudentNo IN(
SELECT StudentNo FROM student WHERE studentName='白燕'
);

你可能感兴趣的:(数据库)