今天是学习MySQL的第四天,
学习目标:
数据操作语句
学习内容:
单表查询、插入数据、更新数据
遇见的问题:
单表查询:无
插入数据:如何插入中文数据
更新数据:如何多条件更新数据
案例代码如下:
DATABASE:book
案例用表:student,course,sc(studentCourse)
(建表过程省略)
单表查询
L1,查询全体学生的 学号 和 姓名
SELECT sno ,sname FROM student
L2,查询全体学生的姓名、学号和所在系
SELECT sname,sno,sdept FROM student
L3,查询全体学生的详细信息
SELECT sno,sname,ssex,sage,sdept FROMstudent
此句等价于
SELECT * FROM student
L4,查询全体学生的姓名及出生年份
SELECT sname,2010-sage FROM student
L5,查询全体学生的姓名和出生年份,并在 出生年份 列前加一个新列,新列的每行数据均为 出生年份 常量值
SELECT sname,’出生年份’,2010-sageFROM student
或
SELECT sname AS 姓名, ‘出生年份’ AS 常量列 , 2010-sageAS 年份
FROM student
L6,在选课表中查询有哪些学生选修了课程,列出选课学生的学号
SELECT sno FROM sc
//去重查询(DISTINCT 关键字可以去掉查询结果中的重复行)
SELECT DISTINCT sno FROM sc
L7,查询计算机系全体学生的姓名
SELECT sname FROM student WHERE sdept = ‘计算机系’
L8,查询所有年龄在20岁以下的学生的姓名和年龄
SELECT sname,sage FROM student WHERE sage<20
或
SELECT sname,sage FROM student WHERE NOTsage >=20
L9,查询考试成绩有不及格的学生的符号
SELECT DISTINCT sno FROM sc WHERE grade<60
L10,查询年龄在20~23岁之间的学生的姓名、所在系和年龄
SELECT sname,sdept,sage FROM student
WHERE sage BETWEEN 20 AND 23
或
SELECT sname,sdept,sage FROM student
WHERE sage >= 20 AND sage <=23
L11,查询年龄不在20~23岁之间的学生姓名、所在系和年龄
SELECT sname,sdept,sage FROM student
WHERE sage NOT BETWEEN 20 AND 23
或
SELECT sname,sdept,sage FROM student
WHERE sage <20 OR sage>23
L12,查询信息系、数学系和计算机系学生的姓名和性别
SELECT sname,ssex FROM student
WHERE sdept IN (‘信息系’,’数学系’,’计算机系’)
或
SELECT sname,ssex FROM student
WHERE sdept =’信息系’ OR sdept=’数学系’ OR sdept =’计算机系’
L13,查询既不是信息系、数学系,也不是计算机系学生的姓名和系别
SELECT sname,ssex FROM student
WHERE sdept NOT IN (‘信息系’,’数学系’,’计算机系’)
或
SELECT sname,ssex FROM student
WHERE sdept!=’信息系’ AND sdept!=’数学系’ AND sdept !=’计算机系’
插入数据
因为插入过程中有中文,编码格式需设置为UTF8,否则会报错
我用的是ZIP免安装,配置文件是没有my.ini的,手动加了之后重启mysql 也不能更改为UTF8,所以用的是代码更改
更改方式如下:
SHOW VARIABLESLIKE 'character%';
查看所有值的属性,如果哪个不是utf8的,输入如下语句
SET character_set_datebase =utf8
其中小写部分为修改部分
以此类推
L63(63是因为我跟书自学,例子追踪到书上的具体例子,书名《数据库原理与应用教程》,何玉洁,第三版,机械工业出版社,且,大学SQL教材选用的是它)
将新生记录(9521104,陈东,男,18岁,信息系)插入到student 表
INSERT INTO student VALUES (‘9521104’,’陈东’,’男’,18,’信息系’)
PS:这里我 18 对应的是student 表中的 sage column,类型为 TINYINT,
同时
汉字定义的类型为NVARCHAR,因为汉字的编码是两个字节,而统一编码不管对哪个地区、哪种语言均采用双字节(16位)编码,即世界上所有的字符统一进行编码
L64,在sc表中插入一条新纪录,学号为“9521104”,选的课程号为“c01”,成绩暂缺。
INSERT INTO sc(sno ,cno) VALUES (‘9521104’,’c01’)
PS:对于L64 ,由于提供的值的个数与表中的列个数不一致,因此在插入语句中必须列出列名。而且sc表中的grade 列必须允许为NULL,因为此句实际插入的值为:
(‘9521104’,’c01’,NULL)
更新数据
L65,将所有学生的年龄加1
UPDATE student SET sage =sage +1
L66,//基于本表条件的更新
将“9512101”学生的年龄改为21岁
UPDATE student SET sage =21
WHERE sno =’9512101’
PS:可以接AND 例如
UPDATE student SET sage =21
WHERE sno =’9512101’ AND ssex = ‘男’
L67,将计算机系全体学生的成绩加5分
//用子查询实现
UPDATE sc SET grade =grade +5
WHERE sno IN
(SELECT sno FROM student
WHERE sdept =’计算机系’
);
//用多表连接实现
UPDATE sc SET grade = grade +5
FROM sc JOIN student ON sc.sno =student.sno
WHERE sdept =’计算机系’