MySQL-03 SQL语句设计
学习要点
- SQL语句分类
- DML语句
- DML 查询语句
SQL语句分类
- 数据操纵语言(DML):用来操纵数据库中数据的命令。包括:SELECT、INSERT、UPDATE、DELETE。
- 数据定义语言(DDL):用来建立数据库、数据库对象和定义列的命令。包括:CREATE、DROP、ALTER。
- 数据控制语言(DCL):用来控制数据库组件的存取许可、权限等的命令。包括:GRANT、REVOKE。
- 其他语言元素:如流程控制语言、内嵌函数、批处理语句等。
DML语句
INSERT语句
语法格式:
INSERT INTO 表名[(字段1,字段2,…,字段n)] VALUES(值1,值2,…,值n);
示例:
INSERT INTO grade(gradeid,gradename) VALUES(0,'大一');
INSERT INTO grade(gradename) VALUES('大一'); // gradeid为自动增长字段
UPDATE语句
语法格式:
UPDATE 表名 SET 字段名=表达式[,…]
[WHERE条件]
[ORDER BY 字段]
[LIMIT 行数]
示例代码:
#UPDATE 更新表格中的记录 #更新课程表中最新录入三门课程的年级属性为2年级 SELECT * FROM `subject`; UPDATE `subject` SET gradeid=2 ORDER BY subjectno DESC LIMIT 3; #更新课程表中英语课程年级属性为1年级 UPDATE `subject` SET gradeid=1 WHERE subjectno=14; #更新课程表中软件分层架构课程年级属性为3年级 UPDATE `subject` SET gradeid=3 WHERE subjectno=16;
DELETE语句
语法格式:
DELETE FROM [表名] [WHERE 条件] [ORDER BY 字段] [LIMIT 行数]
示例代码:
#删除课程表中的数理逻辑课程 SELECT * FROM `subject` WHERE subjectname='数理逻辑'; DELETE FROM `subject` WHERE subjectno=20;
#删除最近录入的三门课程
DELETE FROM `subject` ORDER BY subjectno DESC LIMIT 3;
清空表:TRUNCATE [表名]
示例代码:
#截断表之前,需要删除从表外键 SHOW CREATE TABLE scheduleinfo;#查询外键名称 ALTER TABLE scheduleinfo DROP FOREIGN KEY sche_team_hostid;#删除外键 ALTER TABLE scheduleinfo DROP FOREIGN KEY sche_team_awayid;#删除外键 #截断表 TRUNCATE teaminfo;
#添加外键 ALTER TABLE scheduleinfo ADD CONSTRAINT sche_team_hostid FOREIGN KEY(hostteamid) REFERENCES teaminfo(id); ALTER TABLE scheduleinfo ADD CONSTRAINT sche_team_awayid FOREIGN KEY(awayteamid) REFERENCES teaminfo(id);
DML 查询语句
语法格式:
SELECT 查询体 FROM 数据来源(一张表或者多张表) WHERE 条件 GROUP BY 分组 HAVING 分组的基础上筛选 ORDER BY 排序(按照一个或者多个字段) LIMIT 限制结果个数
查询特定字段
#查询学生的学号、姓名、email SELECT studentno,studentname,email FROM student;
AS关键字为字段起别名
#使用AS为查询结果字段起别名 SELECT studentno AS '学 号',studentname AS 姓名,email AS 电子邮件 FROM student;
DISTINCT关键字
#查看全校有多少学生有考试记录 SELECT * FROM result; SELECT DISTINCT studentno FROM result; 如果DISTINCT后面跟随多个字段,则返回这些字段的唯一组合
SELECT 语句中使用表达式
所有表达式支持算术运算:+ - * / %
#课程编号为1的课程,每位同学加10分显示
SELECT * FROM result;
SELECT
studentno AS 学号,
subjectno AS 课程编号,
studentresult AS 原来的成绩,
studentresult + 10 AS 加分后的成绩
FROM
result
WHERE subjectno=1;
WHERE 子句
逻辑和比较运算符
|
运算符 |
说明 |
|
AND(&&)、OR(||)、XOR、NOT(!) |
逻辑运算符,分别表示否、并且、或,用于多个逻辑连接。 |
|
= |
等于 |
|
<=> |
等于,等同于=。通常用于null值比较 |
|
!=或者<> |
不等于 |
|
> |
大于 |
|
< |
小于 |
|
>= |
大于或等于 |
|
<= |
小于或等于 |
|
BETWEEN … AND … |
介于某个范围之内,例:WHERE age BETWEEN 20 AND 30 |
|
NOT BETWEEN …AND |
不在某个范围之内 |
|
IN(项1,项2,…) |
在指定项内,例:WHERE city IN('beijing','shanghai') |
|
NOT IN(项1,项2,…) |
不在指定项内 |
|
LIKE |
搜索匹配,常与模式匹配符配合使用 |
|
NOT LIKE |
LIKE的反义 |
|
IS NULL |
空值判断符 |
|
IS NOT NULL |
非空判断符 |
|
% |
模式匹配符,表示任意字串,例:WHERE username LIKE '%use’ |
WHERE子句示例
#查询学生信息
SELECT *
FROM student;
#1年级,女生信息
SELECT *
FROM student
WHERE gradeid=1 AND sex='女';
#查询家庭地址为空的学生信息
SELECT *
FROM student
WHERE address IS NULL;
#查询成绩在60-70分之间的学生的学号
SELECT *
FROM result
WHERE studentresult>=60
AND studentresult<=70;
SELECT *
FROM result
WHERE studentresult BETWEEN 60 AND 70;
#查询大一和大三的学生信息
SELECT *
FROM student
WHERE gradeid=1 OR gradeid=3;
SELECT *
FROM student
WHERE gradeid NOT IN(1,3);
#模糊查询:查家庭地址在北京的学生
SELECT *
FROM student
WHERE address LIKE '%北京%';
#模糊查询:查询姓张同学,名字只有一个字
SELECT *
FROM student
WHERE studentname LIKE '张_';
上机练习1:设计SQL语句,实现以下功能
- 从学生信息表中查询家庭地址为空的学生信息。
- 从学生信息表中查询家庭地址不为空的学生的信息。
上机练习2:设计SQL语句,实现以下功能
从成绩表中查询学生成绩在50分打80分之间的学生信息,要求输出学号和学生成绩。
上机练习3:设计SQL语句,实现以下功能
从学生信息表中查询大一和大三的学生,要求输出学生姓名、年级编号。
提示:使用in比较运算符。
上机练习4:设计SQL语句,实现以下功能
从学生信息表中查询家庭地址在河南的学生。
提示:使用like和%模糊查询。
上机练习5:设计SQL语句,实现以下功能
从学生信息表中查询张姓单名的同学。例如张三,张四。
提示使用‘ _ ’ 匹配查询。
数据库的关系代数运算
数据库关系代数五种基本运算:并、差、笛卡尔积、投影、选择。
多表连接查询
1、非等值和等值的多表查询
问题1:要求设计SQL语句,输出学生姓名和所在年级的名称。
#非等值查询:没有where条件的查询,结果为笛卡尔乘积
SELECT
studentname,
gradename
FROM
student,
grade;
#等值查询:多表查询
SELECT
studentname,
gradename
FROM
student,
grade
WHERE
student.gradeid=grade.gradeid;
或者
SELECT
s.studentname 姓名,
g.gradename 年级
FROM
student s,
grade g
WHERE
s.gradeid=g.gradeid;
上机练习6:设计SQL语句,实现以下功能
从成绩表中查询每位同学的成绩,要求输出姓名,成绩。如下图所示:

2、复合连接查询
问题:设计SQL语句,要求实现
要求从成绩表查询成绩,输出学生姓名、课程名称,成绩?
解决途径:
- WHERE等值连接查询
- 内连接查询:作用和WHERE等值连接查询相同
INNER JOIN …. ON…
示例代码:
SELECT s.studentname 姓名, j.subjectname 课程名称, r.studentresult 成绩 FROM result r INNER JOIN student s ON r.studentno=s.studentno INNER JOIN subject j ON r.subjectno=j.subjectno;
左外连接查询:返回包括左表中的所有记录和右表中连接字段相等的记录。
LEFT JOIN …. ON …
查询没有参加考试的学生如何查?
SELECT s.studentname 姓名, r.studentresult 成绩 FROM student s LEFT JOIN result r ON r.studentno=s.studentno WHERE r.studentresult IS NULL;
右外连接查询:返回包括右表中的所有记录和左表中连接字段相等的记录。
RIGHT JOIN … ON ..
如何查询没有考过试的课程?使用右外连接查询?
SELECT j.subjectname 课程名称, r.studentresult 成绩 FROM result r RIGHT JOIN `subject` j ON j.subjectno=r.subjectno WHERE r.studentresult IS NULL;
上机练习7:设计SQL语句,实现以下功能
从成绩表中查询每位同学的成绩,要求输出姓名,年级,课程名称,成绩。如下图所示:

3、自连接查询
问题:需要输出赛程表,主队和客队要输出球队名称,要如何实现?


上机练习8:设计SQL语句,输出赛程表
子查询

问题:查询年龄比何强小的同学,如何查?

上机练习9:查询“PHP基础”课程至少一次考试刚好等于65分的学生学号和姓名
需求:两种实现方式表连接查询和子查询。
ORDER BY对查询结果进行排序
问题:查询学生信息,要求按照出生日期最近的排在前面,如何查询?

注意:子查询中不能使用order by。Order by只能对最终结果排序。
LIMIT限定结果行数
问题:查询学生信息,要求每次显示两条,按照学号增序排序。
使用LIMIT实现分页查询
#LIMIT (pageindex-1)*pagesize,pagesize; SELECT * FROM student ORDER BY studentno LIMIT 0,2; SELECT * FROM student ORDER BY studentno LIMIT 2,2; SELECT * FROM student ORDER BY studentno LIMIT 4,2;
参数说明:LIMIT 从记录的偏移量开始,取出的记录条数
统计函数(聚合函数)
|
函数名 |
作用 |
|
COUNT() |
返回记录数。不统计null值。 |
|
SUM() |
返回总数 |
|
AVG() |
返回平均数 |
|
MAX() |
返回最大数 |
|
MIN() |
返回最小数 |
问题1:统计在校学生总数?

问题2:统计成绩表中学生的最高分,最低分,平均分,分数总和?

GROUP BY分组查询
问题1:如何从学生表中统计每个年段学生人数?

问题2:如何从学生表中统计每个年段男女学生人数?

查询优化
最重要原则:避免查询条件遍历整个数据表
1、WHERE子句中最先出现的条件,一定是过滤和排除更多结果的条件。以下哪个WHERE条件设计更合理?
WHERE studentresult>60 AND studentno<20015 WHERE studentno<20015 AND studentresult>60
2、WHERE子句中的条件尽量避免OR
WHERE studentresult>60 OR grade=2
3、针对ORDER BY 后面的字段,尽量和WHERE后的字段构成联合索引。
4、尽量少使用*作为查询体。
5、对于海量数据库设计。推荐海量数据库解决方案。
综合练习
上机练习10:查询大一开设的课程
上机练习11:查询参加最近一次“PHP基础”考试成绩最高分和最低分
上机练习12:查询参加“PHP基础”课程最近一次考试的在读学生名单
上机练习13:查询未参加“PHP基础”课程最近一次考试的在读学生名单
上机练习14:查询最近一次考试缺考的学生
上机练习15:输出学生姓名、课程所属的年级名称、课程名称、考试日期、考试成绩
如下图所示:

MySQL-03 SQL语句设计的更多相关文章
- mysql 常用 sql 语句 - 快速查询
Mysql 常用 sql 语句 - 快速查询 1.mysql 基础 1.1 mysql 交互 1.1.1 mysql 连接 mysql.exe -hPup ...
- mysql的sql语句优化方法面试题总结
mysql的sql语句优化方法面试题总结 不要写一些没有意义的查询,如需要生成一个空表结构: select col1,col2 into #t from t where 1=0 这类代码不会返回任何结 ...
- PHP面试 MySQL的SQL语句编写
MySQL的SQL语句编写 面试题一 有A表(id,sex,par,c1,c2),B(id,age,c1,c2)两张表,其中A.id与B.id关联,现在要求写出一条SQL语句,将B中age>50 ...
- Mysql 常用 SQL 语句集锦
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- Mysql 常用 SQL 语句集锦 转载(https://gold.xitu.io/post/584e7b298d6d81005456eb53)
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- MySQL数据库sql语句的一些简单优化
1.查询条件的先后顺序 有多个查询条件时,要把效率高能更精确筛选记录的条件放在后边.因为MySQL解析sql语句是从后往前的(不知是否准确). 例: select a.*,b.* from UsrIn ...
- mysql下sql语句 update 字段=字段+字符串
mysql下sql语句 update 字段=字段+字符串 mysql下sql语句令某字段值等于原值加上一个字符串 update 表明 SET 字段= 'feifei' || 字段; (postgr ...
- MySQL数据库SQL语句基本操作
一.用户管理: 创建用户: create user '用户名'@'IP地址' identified by '密码'; 删除用户: drop user '用户名'@'IP地址'; 修改用户: renam ...
- mysql执行sql语句过程
开发人员基本都知道,我们的数据存在数据库中(目前最多的是mysql和oracle,由于作者更擅长mysql,所以这里默认数据库为mysql),服务器通过sql语句将查询数据的请求传入到mysql数据库 ...
- MySQL与SQL语句的操作
MySQL与SQL语句的操作 Mysql比较轻量化,企业用的是Oracle,基本的是熟悉对数据库,数据表,字段,记录的更新与修改 1. mysql基本信息 特殊数据库:information_sche ...
随机推荐
- C++中的new用法总结
前段时间复习面试的时候,看到这个问题经常有问到,我这个小白就看了些博客和书,总结一下. new可以说是个一个关键字,也可以说是一个运算符,并且可以被重载. 1.new operator 这个就是平时最 ...
- k8s-基于canel的网络策略-十九
一.前提 上一节学习了flannel,但是我们应该了解flannel只能提供网络通讯,而不能提供网络策略.因此,我们本节学习canal,让它来提供网络策略,来配合flannel使用. canal是ca ...
- UVa 11584 Partitioning by Palindromes (简单DP)
题意:给定一个字符串,求出它最少可分成几个回文串. 析:dp[i] 表示前 i 个字符最少可分成几个回文串,dp[i] = min{ 1 + dp[j-1] | j-i是回文}. 代码如下: #pra ...
- HDU5589:Tree(莫队+01字典树)
传送门 题意 略 分析 f[u]表示u到根的边的异或 树上两点之间的异或值为f[u]^f[v], 然后将查询用莫队算法分块,每个点插入到字典树中,利用字典树维护两点异或值大于等于M复杂度O(N^(3/ ...
- hdoj3183【思维】
思路: 处理方案非常霸气啊,无奈想不到. 说是n位去m个,那么默认就是取了n-m个数字,ok,然后m #include <iostream> #include <stdio.h> ...
- bzoj 1023: [SHOI2008]cactus仙人掌图【tarjan+dp+单调队列】
本来想先求出点双再一个一个处理结果写了很长发现太麻烦 设f[u]为u点向下的最长链 就是再tarjan的过程中,先照常处理,用最长儿子链和次长儿子链更新按ans,然后处理以这个点为根的环,也就是这个点 ...
- 键值观察 KVO
http://www.cnblogs.com/dyf520/p/3805297.html Key-Value Observing Programming Guide 1,注册Key-Value Obs ...
- USACO Training3.1联系【排序终极题目】By cellur925
题目传送门 这题我们很容易想到直接枚举即可.算法本身并没有什么难度但是细节超多!于是这题整整卡了一天....... (不,还是我太弱了.) 期间还暴露出一些平时没有特别注意的问题,这次一起解决. 开始 ...
- MVC 感触
这几天接触了下 ef+ MVC+WEBAPI +bootstrop VIEW--->Controller -->WebAPI ---Model (Linq) 记住 VIEW里的 csh ...
- Wolfycz的娱乐赛题解
现在不会放题解的!比赛完了我会把题解放上来的 祝大家玩的愉快~ 等会,cnblogs不会显示更新时间?我禁赛我自己 UPD:2018.12.15 欢迎大家爆踩标程- painting 我们考虑转化题意 ...