数据库的学习笔记---单表查询

1:查询表中的若干列

(1)查询全部列

例1:从students表中查询全体学生的详细记录。(两种写法都可以)

select * from students;

select id,sex,name,age,department from students;

(2)查询经过计算的值

例:从students表中查询全体学生的姓名以及出生年份。

由于目前只知道学生的年龄,要显示学生的出生年份,只需要将当前年份减去学生的年龄即可得出学生的出生年份。

select name,2022-age from students;

例:从students表中查询全体学生的姓名,出生年份和所在院系,要求用小写字母表示系名。

前面我们知道了怎么显示出生年份,现在需要知道怎么显示将所有的字母都用小写字母显示出来。

lower(字段名)----将所有的英文字母变成小写、upper(字段名)---将所有的英文字母转换成大写。

select name,2022-age,lower(department) from students;

此外。还可以通过取别名的方式,使得查询的结果显示的更加清楚。

取别名的格式: 字段名+空格或者as+要显示的名称。

以下我将2022-age取名为birth,将lower(department)取名为department。为了区分两种情况都可以,我将2022-age 用as的形式取别名,lower(deparment)用空格的形式取别名。

select name ,2022-age as birth,lower(department) department from students;

 2:查询表中的若干元组

(1)消除值重复的元组(消除重复的行),这里只需要用到distinct关键字即可消除重复行。

例:从students表中查询年龄不同的学生。

select distinct age from students;

(2)查询满足条件的元组(满足条件的行/记录) 

1:<>和!=是同样的意思:不等于  

2:取值在某个范围应该使用:between a  and b (在a和b之间,包括了a和b) 或者 not between a and b(不在a和b之间)  

例:从students表中查询性别为男的学生姓名。(以下三种查询的结果均相同)

select name from students where sex = '男';

select name from students where sex != '女';

select name from students where sex <>'女';

 当属性值确定的时候,可以用in/not in来查找属性值属于指定集合的元组。

例:从students表中查找计算机科学系(cs),数学系(ma),信息系(is)的学生姓名和性别。

select name,sex from students where department in ('cs','ma','is');

想要查找只包含某个字符的所有元组:用like来进行字符串的匹配。

例:从students表中查找姓刘的学生的姓名(name),学号(id)和性别(sex)。

select name,id,sex from students where name like '刘%';

字符串的匹配:用到的词是like,字符串,因此like后要接英文单引号。

%(百分号):代表任意长度的字符串(长度可以为0),_(下横线):表示任意单个字符,注意:当数据库字符集为ASCII时一个汉字需要两个__,当字符集为GBK时,一个汉字只需要一个_。

举例:a%b:表示以a开头,以b结尾的任意长度的字符串。

因此上面的例题要查找姓刘的学生,就只需要查找姓名以刘开头的字符串,即 name like '刘%'。

例:从students表中查询姓名为"欧阳"且全名为三个汉字的学生姓名。

select name from students where name like '欧阳_';

 注意看这句话:当数据库字符集为ASCII时一个汉字需要两个__,当字符集为GBK时,一个汉字只需要一个_。

例:从Course表中查询DB_Design课程的课程号(Cid)和学分(credit)。

select Cid,credit from Course where name like 'DB\_Design' escape'\';

escape ' \ ' 表示' \ '为换码字符,将DB_Design中的_ 转义成普通的_。

例:从Course表中查询以DB_开头,且倒数第三个字符为i的课程情况。

select * from Course where name like'DB\_%i_ _' escape '\' ;

这里只需要将DB后面的_转义成普通字符就可以了,而i后面的_均为普通的_。

判断某个属性中是否含有空值,只能用is null 或者is not null。

例:从students表中查询学生的成绩(grade)为空的学号。

select id from students where grade is null;

 多重条件查询:用逻辑运算符AND和OR连接,AND的优先级高于OR,通过括号可以改变优先级。

例:从students表中查找年龄在16-20岁之间且性别为女的学生姓名和年龄。

select name, age from students where age between 16 and 20 and sex = '女';

3:order by 字句

order by 字句用于对查询结果进行升序(asc)或降序(desc)排序,默认是升序排列。对于空值的排序,具体由系统决定。

 例:从students表中查找姓名和年龄,按年龄降序,学号升序排列。

select name,age from students 
order by id,age desc;

4:聚合函数

为了增强索引功能,SQL提供了多种聚合函数,主要有:

①:count()----统计元组的个数(或一列中值的个数),例:统计(成绩大于60的)人数

②:sum()----计算一列值的总和,例:计算学生的总成绩

③:avg()----计算一列值的平均值,例:计算(计算机系的)学生的平均成绩

④:max()----计算一列的值的最大值,例:查询学生中,年龄最大的值

⑤:min()----计算一列的值最小值,例:查询成绩的最低分(前提是不为0)

注意:(1):当聚合函数遇到空值时,除了count(*)外,都跳过空值只处理非空值。(2):聚合函数只能用于select子句和group by 子句中的having子句中。

例:从students表中查询性别为男的年龄的最大值的姓名,性别和年龄。

select name,sex,max(age) from students where sex = '男';

5:group by 子句

group by 子句是将查询结果按照某一列或多列的值进行分组,值相等的为一组。

group by 子句后面可以接having短语,having短语后接聚合函数,用于给分组以后的数据进行处理。注意:where 子句作用于基本表或视图,从中选择满足条件的元组,而having 短语作用于组,从中选择满足条件的组。

例:从学生选课表(student_class)中查询平均成绩大于90分的学生学号和平均成绩。

先查询学生的平均成绩,按照学号进行分组,再在组中找到平均成绩大于90的学生。

select id , avg(grade) 
from student_class 
group by id 
having avg(grade) >= 90;

以上是我个人对数据库单表查询的笔记编写,例题也是我个人认为值得掌握的例题,也不要仅限我掌握我的那些例题,想要掌握好,当然还是要多动手,多练习,大家一起加油吧~

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,针对你的问题,我可以为你提供一些关于MySQL触发器实验报告的基本信息和实验步骤。假设你已经创建了一个名为“students”的学生表,包括学号姓名、性别、年龄和专业等字段,现在你需要编写触发器,使得当插入新的学生记录时,自动计算该学生的年龄并更新到年龄字段中。具体的实验步骤如下: 1. 首先,在MySQL中创建一个名为“students”的学生表,包含学号姓名、性别、年龄和专业等字段,其中年龄字段可以先设置为NULL或者默认值0。 ```mysql CREATE TABLE students ( id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, gender ENUM('male', 'female') NOT NULL, age INT(11) DEFAULT 0, major VARCHAR(50) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` 2. 然后,创建一个名为“update_age”的触发器,当插入新的学生记录时,自动计算该学生的年龄并更新到年龄字段中。 ```mysql DELIMITER $$ CREATE TRIGGER update_age BEFORE INSERT ON students FOR EACH ROW BEGIN SET NEW.age = YEAR(CURDATE()) - YEAR(NEW.birthday); END$$ DELIMITER ; ``` 3. 最后,测试该触发器是否正常工作。插入一条新的学生记录,观察年龄字段是否已经自动计算并更新。 ```mysql INSERT INTO students (name, gender, birthday, major) VALUES ('张三', 'male', '1999-08-01', '计算机科学与技术'); ``` 这就是一个简单的MySQL触发器实验报告的基本步骤。当然,这只是一个例子,具体实验内容和要求可能有所不同,你需要根据实验要求进行相应的修改和调整。希望这些信息能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Swallow_L02

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值