一、MySQL运算符
1.算数运算符
2.字符串自动转换为数字
MySQL中,由字符串表示的数字在需要计算时,会自动转换为数字,但要遵循两个基本原则:
①如果第一位是数字的字符串被应用于算术运算中,则该字符串转换为第一个数字的值
②如果数字和字符混合而成的字符串无法顺利转换为数字,则默认转换为0
3.比较运算符
对运算符两边的表达式进行比较,比较的结果总是“1”(真),“0”(假),或“NULL”(不确定)
注:①比较运算符可对数字和字符串进行比较
②对数字进行比较时,将数字作为浮点型进行比较
③对字符串进行比较时,不区分大小写(除非使用特殊的BINARY二进制关键字)
④对于<>运算符,如果表达式两边不相等返回真值,相等返回假值
另外,可以使用IS NULL或者IS NOT NULL运算符来测定是否为空
4.MySQL数据库中的通配符
①“%” (百分号) 代表任意长度(长度可以为0)的字符串
例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等
②“_ ”(下横线) 代表任意单个字符
例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等
注:如果已知字符串的部分字符,可通过like语句和通配符进行搜索
例:select 'Roger says hello' like 'll';
5.逻辑运算符
6.位运算符
“~” 表示按位取反。 “^” 表示异或。
二、插入操作
语法:NSERT [INTO] 表名 ([列名1],[列名2]) VALUES (值列表)
注:如果表明后面没有注明列名,则默认为左右列插入数据
例1:向people表中添加一条记录:
insert into people(name,age)
values(“zhangsan”,20);
例2:创建一张学生信息表,往表中插入数据
create table students(
scode int not null auto_increment,
sname varchar(20) not null,
saddress varchar(20) default‘未知’,
sgrade int,
semail varchar(20),
ssex bit,
primary key(scode)
);
INSERT INTO STUDENTS (SName,SGrade,SSex)
VALUES('测试女生1',75,0),
('测试女生2',77,0),
('测试女生3',83,0),
(‘测试男生1',81,1),
('测试女生4',90,0),
(‘测试男生2',94,1),
('测试女生5',51,0),
(‘测试男生3',53,1);
注:①每次插入一行数据,不可能只插入半行或者几列数据,因此,插入的数据是否有效将按照整行的完整性的要求来检验
②每个数据值的数据类型、精度和小数位数必须与相应的列匹配;
③如果在设计表的时候就指定了某列不允许为空,则必须插入数据;
④具有缺省值的列,可以使用DEFAULT(缺省)关键字来代替插入的数值
例:INSERT INTO Students (SName,SAddress,SGrade,SEmail,SSEX)
VALUES ('张青裁',DEFAULT,6,'ZQC@Sohu.com',0)
三、更改操作
语法:UPDATE 表名 SET 列名 = 更新值 [WHERE <更新条件>]
注:where字句用来设置条件,即只更改满足条件的行;如果没有使用where字句,则修改所有行
例:将student表中的所有学生名称为"Alex"的改为"Tom":
update student set sname="Tom" where sname="Alex";
四、删除操作
语法:DELETE FROM 表名 [WHERE <删除条件>]
注:where字句用来设置条件,即只删除满足where条件的行;如果没有使用where字句,则删除所有表中的数据,但表格保留
例:删除student表中的所有年龄小于18岁的记录:
delete from student where sage<18;
五、查询操作
语法:SELECT 列名 FROM 表名 [WHERE<查找条件>] [ORDER BY <排序条件> ASC/DESC]
注:查询操作并不产生数据表,而是将查找到的数据以表的形式显示出来,不进行存储
查询记录操作:
语句 | 作用 |
distinct | 排重 |
---|---|
from子句 | 指定查询数据的表 |
where子句 | 查询数据的过滤条件 |
group by子句 | 对匹配where子句的查询结果进行分组 |
having子句 | 对分组后的结果进行条件限制 |
order by子句 | 对查询结果结果进行排序,后面跟desc降序或asc升序(默认) |
limit子句 | 对查询的显示结果限制数目 |
procedure子句 | 查询存储过程返回的结果集数据 |
例:
-- 举例1 : 查询全体学生的学号与姓名。
select sno,sname from student;
-- 举例2 : 查询全体学生的详细记录。
select sno,sname,ssex,sage,sdept from student;
或select * from student;
-- 举例3 : 查全体学生的姓名及其出生年份。
select sname,2014-sage from student;
-- 举例4 : 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。
select sname,'year of birth: ',2008-sage, lower(sdept) from student;
-- 举例5 : 查询选修了课程的学生学号(去掉重复的记录)
select distinct studentid from sc;
-- 举例6 : 查询全体学生的学号与姓名,用中文显示列名。
select sno as ‘编号’,sname as ‘姓名’ from student;
-- 举例7 : 给表设置别名。
select s.sno,s.sname from student as s;
-- 举例8 : 查询年龄在20以下的学生的姓名。
select sname from student where sage<20;
-- 举例9 : 查询全体学生的姓名、年龄,要求按照年龄降序排序。
select sname,sage from student order by sage desc;
-- 举例10 : 查询年龄最大的前3个学生的姓名和年龄,或第4、5个学生
select sname,sage from student order by sage desc limit 3;或(limit 3,2)
统计函数(集函数)
语句 | 作用 |
记数函数: count(列名) | 计算元素的个数 |
求和函数: sum(列名) | 对某一列的值求和,但属性必须是整型 |
计算平均值:avg(列名) | 对某一列的值计算平均值 |
求最大值: max(列名) | 找出某一列的最大值 |
求最小值: min(列名) | 找出某一列的最小值 |
例:
-- 举例11 : 查询学生总数。
select count(*) from student;
-- 举例12 : 查询选修了课程的学生人数。
select count(distinct studentid) from sc;
-- 举例13 : 查询1号课程的学生平均成绩。
select avg(grade) from sc where courseid=1;
-- 举例14 : 查询1号课程的学生最高分和最低分。
select max(grade) as ‘最高分’,min(grade) as ‘最低分’ from sc where courseid=1;
-- 举例15 : 查询每个学生的平均成绩。
select studentid,avg(grade) as ‘平均成绩’ from sc group by studentid;
-- 举例16 : 查询学生的平均成绩在70分以上的。
select studentid,avg(grade) as ‘平均成绩’ from sc group by studentid having avg(grade)>70;
在where子句中使用谓词设置查询条件:
子句 | 作用 |
BETWEEN AND | 在两数之间 |
NOT BETWEEN AND | 不在两数之间 |
IN <值表> | 是否在特定的集合里 |
NOT IN <值表> | 是否不在特定的集合里 |
LIKE | 模糊查询(根据已知字符串的一部分进行查询) |
IS NULL/IS not NULL | 为空/不为空 |
REGEXP | 检查一个值是否匹配一个常规表达式。 |
例:
-- 举例17 : 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄 。
select sname,sdept,sage from student where sage between 20 and 23;
-- 举例18 : 查询年龄不在20~23岁之间的学生姓名、系别和年龄。
select sname,sdept,sage from student where sage not between 20 and 23;
-- 举例19 : 查询'信息系'、'美术系'和'计算机系'学生的姓名和性别。
select sname,ssex from student where sdept in (‘信息系',‘美术系',‘计算机系');
-- 举例20 : 查询学号为95001的学生的详细情况。
select * from student where sno like '95001';
等价于:select * from student where sno='95001';
-- 举例21 : 查询所有姓刘学生的姓名、学号和性别。
select sname,sno,ssex from student where sname like ‘刘%';
-- 举例22 : 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
select studentid,courseid from sc where grade is null;
-- 举例23 : 查所有有成绩的学生学号和课程号。
select studentid,courseid from sc where grade is not null;
-- 举例24 : 查询计算机系年龄在20岁以下的学生姓名。
select sname from student where sdept=‘计算机系' and sage<20;
-- 举例25 : 查询信息系、美术系和计算机系学生的姓名和性别
select sname,ssex from student where sdept in (‘信息系','美术','计算机系');
-- 可改写为:
Select sname,ssex from student where sdept='信息系' or sdept='美术' or sdept='计算机系';
-- 举例26 : 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
select studentid,grade from sc where courseid=3 orber by grade desc;
-- 举例27 : 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
select * from student order by sdept,sage desc;
多表查询问题:同时查询显示多个数据表中的内容
分类:内连接(INNER JOIN) 左外联结 (LEFT JOIN) 右外联结 (RIGHT JOIN)
例:
-- 内连接
SELECT S.SName,C.CourseID,C.Grade
From Sc c INNER JOIN Students S ON C.StudentID = S.SNo
-- 左外连接
SELECT S.SName,C.CourseID,C.Grade
From Sc AS C LEFT JOIN Students S ON C.StudentID = S.SNo
-- 右外连接
SELECT Titles.Title_id, Titles.Title, Publishers.Pub_name
FROM titles RIGHT OUTER JOIN Publishers ON Titles.Pub_id = Publishers.Pub_id
子查询: 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为子查询。一个SELECT-FROM-WHERE语句称为一个查询块
例:查询选修了课程名为“Java”的学生学号和姓名
select sno,sname from student where sno in
(select studentid from sc where cno =
(select cno from course where cname=‘Java’) );