去除重复数据 distinct
注意:查询的所有数据完全相同才能去除重复的
查询emp表中所有薪金
SELECT DISTINCT
ename,
sal
FROM
emp;
查看雇员的月薪与佣金之和
sal+comm两列值相加并且组成一个新的字段
值和null相加只能返回null
IFNULL(expr1,expr2) 如果expr1为null就用expr2代替
SELECT
ename,
sal + IFNULL(comm, 0)
FROM
emp;
给查询的字段起别名 AS(可以省略)
SELECT
ename,
sal + IFNULL(comm, 0) AS total
FROM
emp;
排序order by
查询所有学生记录,按年龄升序排序 ASC
SELECT
*
FROM
stu
ORDER BY
age ASC;
查询所有学生记录,按年龄降序排序 DESC
SELECT
*
FROM
stu
ORDER BY
age DESC;
查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
SELECT
*
FROM
emp
ORDER BY
sal DESC,
empno ASC;
聚合函数 sum avg max min count(总记录数)
查询emp表中记录数:可以去除null值
SELECT
COUNT( * )
FROM
emp;
查询emp表中月薪大于2500的人数:
SELECT
COUNT( * )
FROM
emp
WHERE
sal > 2500;
统计月薪与佣金之和大于2500元的人数
SELECT
COUNT( * )
FROM
emp
WHERE
sal + IFNULL(comm, 0) > 2500;
查询有佣金的人数,有领导的人数:
注意:查询是要保证要查询的字段记录数相等
SELECT
COUNT(comm),
COUNT(mgr)
FROM
emp;
查询所有雇员月薪和:
SELECT
SUM(sal)
FROM
emp;
查询所有雇员月薪和,以及所有雇员佣金和:
SELECT
SUM(sal),
SUM(comm)
FROM
emp;
查询所有雇员月薪+佣金和:
SELECT
SUM(sal + IFNULL(comm, 0))
FROM
emp;
统计所有员工平均工资:
SELECT
AVG(sal)
FROM
emp;
查询最高工资和最低工资:
SELECT
MAX(sal),
MIN(sal)
FROM
emp;
分组查询 GROUP BY
查询每个部门的部门编号和每个部门的工资和:
按什么分组 前面查询的字段就是什么 保证查询结果数量对等
SELECT
deptno,
SUM(sal)
FROM
emp
GROUP BY
deptno;
查询每个部门的部门编号以及每个部门的人数:
SELECT
deptno,
COUNT( * )
FROM
emp
GROUP BY
deptno;
查询每个部门的部门编号以及每个部门工资大于1500的人数:
WHERE 条件要加在group by 的前面
SELECT
deptno,
COUNT( * )
FROM
emp
WHERE
sal > 1500
GROUP BY
deptno;
查询工资总和大于9000的部门编号以及工资和:
1.WHERE 后面不能有聚合函数
2.分组之后如果要添加筛选条件 需要是要having 后面可以用聚合函数
3.WHERE条件是在分组之前进行筛选,having是在分组后进行筛选
SELECT
SUM(sal),
deptno
FROM
emp
GROUP BY
deptno
HAVING
SUM(sal) > 9000;
分页查询 关键词 LIMIT(mysql方言)
limit 从第几条显示数据,一共显示多少条数据
SELECT
*
FROM
emp
LIMIT 3,3;
起始页 = (pageSize -1) * 一页多少条数据
limit要写在所有的条件后面
模糊查询 LIKE
使用占位符 %多个字符 _一个下划线表示一个字符
SELECT
*
FROM
emp
WHERE
ename LIKE ‘%s%’;
数据完整性(保证用户插入的数据有效的)
引用完整性(多张表依赖的关系)
域完整性 (一个单元格的完整性)
实体完整性(保证一条数据的完整性) 主键 唯一键 主键自增
主键 特点 唯一 且不能为空 可以做精准删除
唯一键 特点 唯一 可以为空
设置主键方式一
CREATE TABLE stu1 (
sid INT PRIMARY KEY,
sname VARCHAR (50)
);
设置主键方式二 可以创建联合主键(用两个字段同时当主键)
注意 联合主键都相同才算重复
CREATE TABLE stu2 (
sid INT,
sname VARCHAR (50),
PRIMARY KEY (sid)
);
CREATE TABLE stu3 (
classId INT,
sid INT,
sname VARCHAR (50),
PRIMARY KEY (classId, sid)
);
设置主键方式三先创建出来表 在添加主键约束
CREATE TABLE stu4 (sid INT, sname VARCHAR(50));
ALTER TABLE stu4 ADD CONSTRAINT PRIMARY KEY (sid);
删除主键约束
ALTER TABLE stu4 DROP PRIMARY KEY;
唯一键约束 可以插空 但是不能重复
CREATE TABLE stu5 (
sid INT PRIMARY KEY,
sname VARCHAR (50) UNIQUE
);
INSERT INTO stu5
VALUES
(3, NULL);
主键自增
CREATE TABLE stu6 (
sid INT PRIMARY KEY auto_increment,
sname VARCHAR (50) UNIQUE
);
注意 主键只能自增 删除了也不会倒退
插入时可以给null 让他自己自增
域完整性 not null(非空) default 默认值
CREATE TABLE stu7 (
sid INT PRIMARY KEY auto_increment,
sname VARCHAR (50) NOT NULL,
sgender VARCHAR (50) DEFAULT ‘男’
);
INSERT INTO stu7 (sname)
VALUES
(‘hanhan’);
有默认值约束 直接插入null 可以 要使用默认值 可以不插入该字段
引用完整性 参照物约束
表和表之间的关系
一对一 一对多 多对多(常用)
学生表(主)和分数表(从) 可以通过外键来建立两张表之间的关系
外键建立的方式一 明确外键在从表中
CREATE TABLE student (
sid INT PRIMARY KEY,
sname VARCHAR (50)
);
外键别名规范 fk_主表名_从表名_字段名
constraint 外键别名 foreign key (从表中的字段) references 主表名 (主表中的字段)
CREATE TABLE score (
sid INT,
score INT,
CONSTRAINT fk_student_score_sid FOREIGN KEY (sid) REFERENCES student (sid)
);
创建外界方式二
CREATE TABLE student1 (
sid INT PRIMARY KEY,
sname VARCHAR (50)
);
CREATE TABLE score1 (sid INT, score INT);
添加外键约束
ALTER TABLE score1 ADD CONSTRAINT fk_student1_score1_sid FOREIGN KEY (sid) REFERENCES student1 (sid);
删除外键 (一个表中可能有多个外键)
ALTER TABLE score1 DROP FOREIGN KEY fk_student1_score1_sid;
多对多的关系
CREATE TABLE teacher (
tid INT PRIMARY KEY,
tname VARCHAR (50)
);
CREATE TABLE studentX (
sid INT PRIMARY KEY,
sname VARCHAR (50)
);
中间表
CREATE TABLE teacher_studentX (tid INT, sid INT);
添加外键(多对多的关系 外键在中间表中)
ALTER TABLE teacher_studentX ADD CONSTRAINT fk_teacher_studentX_stuedntX_sid FOREIGN KEY (sid) REFERENCES studentX (sid);
ALTER TABLE teacher_studentX ADD CONSTRAINT fk_teacher_studentX_teacher_tid FOREIGN KEY (tid) REFERENCES teacher (tid);