查询
排序 order by 列名 asc(默认) desc
查询所有学生记录,按年龄升序排序
SELECT *
FROM stu
ORDER BY sage ASC;
或者
SELECT *
FROM stu
ORDER BY sage;
查询所有学生记录,按年龄降序排序
SELECT *
FROM stu
ORDER BY age DESC;
查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
SELECT * FROM emp
ORDER BY sal DESC,empno ASC;
聚合函数 sum avg max min count
聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
-- 查询薪金和佣金之和
-- 注意:任何数值和null值相加 都是null值
-- 使用 IFNULL 过滤空值,如果该值为空,当做0来处理
SELECT
sal,
comm,
sal + IFNULL(comm, 0) AS 总数
FROM
emp;
-- 按薪金排序(默认升序ASC, 降序DESC)
SELECT
sal
FROM
emp
ORDER BY
sal DESC;
-- 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号降序排序
SELECT
*
FROM
emp
ORDER BY
sal DESC,
empno DESC;
-- 查询表的记录数
SELECT
COUNT(*)
FROM
emp;
-- 查询佣金和薪金的记录数
-- Count(字段)查询的是不为空的记录数
SELECT
COUNT(comm),
COUNT(sal)
FROM
emp;
-- 查询emp表中月薪大于2500的人数:
SELECT
COUNT(sal)
FROM
emp
WHERE
sal > 2500;
-- 统计月薪与佣金之和大于2500元的人数:
SELECT
COUNT(sal + IFNULL(comm, 0))
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)) AS total
FROM
emp;
-- 统计所有员工平均工资:
SELECT
AVG(sal)
FROM
emp;
-- 查询最高工资和最低工资
SELECT
MAX(sal),
MIN(sal)
FROM
emp;
-- 分组查询
-- 查询每个部门的部门编号和每个部门的工资和
注意:分组查询时,查询的字段必须是分组的字段(记录数对应)
SELECT
deptno,
SUM(sal)
FROM
emp
GROUP BY
deptno;
-- 查询每个部门的编号以及每个部门的人数
SELECT
deptno,
COUNT(deptno)
FROM
emp
GROUP BY
deptno;
-- 查询每个部门的部门编号以及每个部门工资大于1500的人数:
SELECT
deptno,
COUNT(deptno)
FROM
emp
WHERE
sal > 1500
GROUP BY
deptno;
-- 查询工资总和大于9000的部门编号以及工资和:
-- HAVING 分组之后使用的筛选条件(可以使用函数)
-- WHERE 是分组之前的(不能使用函数)
SELECT
deptno,
sum(sal) AS total
FROM
emp
GROUP BY
deptno
HAVING
sum(sal) > 9000;
注:having与where的区别:
1.having是在分组后对数据进行过滤.
where是在分组前对数据进行过滤
2.having后面可以使用聚合函数(统计函数)
where后面不可以使用聚合函数。
WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;
而HAVING是对分组后数据的约束。
-- 分页查询
SELECT
*
FROM
emp
LIMIT 0,-- 代表起始页
3; -- 代表一共显示几条记录
-- 模糊查询
-- % 代表 0 - n 个字符
SELECT
*
FROM
emp
WHERE
ename LIKE 'w%';
SELECT
*
FROM
emp
WHERE
ename LIKE '%w%';
SELECT
*
FROM
emp
WHERE
ename LIKE 'w_';
SELECT
*
FROM
emp
WHERE
ename LIKE 'w___';
合并查询(返回的结果集字段的类型和数量要一致)
单独使用 UNION 会把两张表的数据合并,并且过滤掉相同的数据
不想过滤使用 UNION ALL
SELECT
NAME,
score
FROM
A
UNION
-- 加 ALL 显示所有字段,不加只显示不重复的值
SELECT
*
FROM
B;
-- 链接查询
-- 查询两张表的数据
-- 产生的数据为笛卡尔积
-- 这样会产生无用的数据 可以通过外键 来过滤掉
SELECT
*
FROM
student,
score
WHERE
student.sid = score.sid;
-- 起别名
SELECT
s.sid,
s.sname,
c.score
FROM
student s,
Score c
WHERE
s.sid = c.sid;
-- 查询学生的成绩要求70分以上
SELECT
s.sid,
s.sname,
c.score
FROM
student s,
Score c
WHERE
s.sid = c.sid
AND c.score > 70;
-- 查询所有学生的成绩
-- 内连接相当于把两张表链接到一起查询使用 INNER JOIN 关键词条件使用 ON(INNER 可以省略不写)
SELECT
*
FROM
student s
INNER JOIN score c ON s.sid = c.sid;
-- 左外连接查询
-- 以左边的表为主,主表中的数据都会查询出来(有可能产生无用的数据)
SELECT
s.sid,
s.sname,
c.score
FROM
Score c
LEFT JOIN Student s ON s.sid = c.sid;
外键是约束,约束数据的插入,查询就是查询,和约束无关
表中不建立外键关系,可以使用连接查询
-- 自然连接
-- 会自动匹配到表中相同的字段,没有外键也能自然查询
SELECT
*
FROM
Student
NATURAL JOIN score;
-- 多表查询
-- 查询所有学生的分数和考试科目
-- 查询是3张表2个条件 -> n 张表 n - 1 个条件
SELECT
s.sid,f
s.sname,
c.score,
b.cid,
b.cname
FROM
student s
JOIN score c ON s.sid = c.sid
JOIN subjects b ON b.cid = c.cid;
-- 子查询
-- 出现多次 select 关键字的查询语句
SELECT
*
FROM
emp
WHERE
deptno = (
SELECT
deptno
FROM
emp
WHERE
ename = 'SCOTT'
);
-- 工资高于30号部门所有人的员工信息
SELECT
*
FROM
emp
WHERE
sal > (
SELECT
MAX(sal)
FROM
emp
WHERE
deptno = 30
);
-- 查询工作和工资与 MARTIN (马丁)完全相同的员工信息
-- 第一种方法
SELECT
*
FROM
emp
WHERE
job = (
SELECT
job
FROM
emp
WHERE
ename = 'MARTIN'
)
AND sal = (
SELECT
sal
FROM
emp
WHERE
ename = 'MARTIN'
);
-- 第二种方法
-- 单个数据使用等号,多个数据一般使用 in
SELECT
*
FROM
emp
WHERE
(job, sal) IN (
SELECT
job,
sal
FROM
emp
WHERE
ename = 'MARTIN'
);
-- 有两个以上直接下属的员工信息
SELECT
*
FROM
emp
WHERE
empno IN (
SELECT
mgr
FROM
emp
GROUP BY
mgr
HAVING
COUNT(mgr) >= 2
);
-- 查询员工编号为7788的员工名称 员工工资 部门名称 部门地址
SELECT
e.ename,
e.sal,
d.dname,
d.loc
FROM
emp e
JOIN dept d ON empno = 7788
WHERE
e.deptno = d.deptno;
-- 求7369员工编号、姓名、经理编号和经理姓名
-- 自连接查询,给自己找个表起个别名来使用
-- 当你的数据全部在一张表中,但是一次不能查出来时,考虑使用自连接
SELECT
e1.empno,
e1.ename,
e1.mgr,
e2.ename AS mgrename
FROM
emp e1,
emp e2
WHERE
e1.empno = '7369'
AND e2.empno = e1.mgr;
-- 求各个部门薪水最高的员工所有信息
-- 查询过程中出现问题,查询时,没有把部门的条件带进去
-- 只是按最高工资处理的
SELECT
*
FROM
emp
WHERE
sal IN (
SELECT
MAX(sal)
FROM
emp
GROUP BY
deptno
);
-- 把查询返回结果集当做一张新表去使用
SELECT
*
FROM
emp e1,
(
SELECT
deptno,
MAX(sal) msal
FROM
emp
GROUP BY
deptno
) e2
WHERE
e1.sal = e2.msal
AND e1.deptno = e2.deptno;
约束
-- 创建一个 student 表 id(主键) name
-- 在创建表的时候, 添加主键可以保证数据的完整性
-- 主键的特点: 1.唯一 2.不能为空
-- 创建方式一:
CREATE TABLE student (
id INT PRIMARY KEY,
NAME VARCHAR (100)
);
INSERT INTO student
VALUES
(1, '学生'),
(2, '学生');
-- 创建方式二(好处:添加联合主键):
CREATE TABLE student (
id INT,
NAME VARCHAR (100),
PRIMARY KEY (id)
);
-- 创建联合主键
-- 联合主键不完全一致, 都可以插入到数据库中
CREATE TABLE student (
stuid INT,
NAME VARCHAR (100),
classid INT,
PRIMARY KEY (stuid, classid) -- 添加联合主键(联合主键实质是一个主键)
);
INSERT INTO student
VALUES
(1, '学生', 1),
(2, '学生', 1),
(1, '学生', 2),
(2, '学生', 2);
-- 创建方式三:
CREATE TABLE student (
id INT,
NAME VARCHAR (100)
);
-- 通过修改表结构添加主键约束
ALTER TABLE student ADD CONSTRAINT PRIMARY KEY (id);
-- 唯一约束(不能重复, 可以有空值)
CREATE TABLE student (
id INT PRIMARY KEY,
NAME VARCHAR (100) UNIQUE
);
-- 自动增长列(auto_increment)
CREATE TABLE student (
id INT PRIMARY KEY auto_increment,
NAME VARCHAR (100)
);
-- 主键插入空值
INSERT INTO student
VALUES
(null, '学生1'),
(null, '学生2'),
(null, '学生1'),
(null, '学生2');
-- 域完整性限制单元格的数据内容
-- 值不能为空和默认值
CREATE TABLE student (
id INT PRIMARY KEY,
NAME VARCHAR (100) NOT NULL,
gender VARCHAR (100) DEFAULT '男'
);
INSERT INTO student (id, NAME)
VALUES
(1, '学生'),
(2, '学生'),
(3, '学生'),
(4, '学生');
-- 引用完整性(外键约束 让表与表之间通过字段建立联系)
-- 主表
CREATE TABLE student (
sid INT PRIMARY KEY,
NAME VARCHAR (100)
);
-- 从表
create table Score(
sid int,
score int,
-- 创建外键建立表之间的联系
-- foreign key(当前表的字段)
constraint fk_Score_sid foreign key(sid) references student(sid)
);
/*
建立多对多关系的时候,实际就是建立外键
明确:
1.在哪张表建立外键(中间表)
2.哪个字段与哪个字段建立联系
中间表的 tid 与老师表的 tid 建立外键关系
中间表的 sid 与学生表的 sid 建立外键关系
*/
-- 建立三张表
-- 老师 tid tname
CREATE TABLE teacher (
tid INT PRIMARY KEY,
tname VARCHAR (100)
);
-- 学生 sid sname
CREATE TABLE student (
sid INT PRIMARY KEY,
sname VARCHAR (100)
);
-- 中间表 tid sid
CREATE TABLE center (tid INT, sid INT);
-- 建立多对多的关系
ALTER TABLE center ADD CONSTRAINT fk_center_tid FOREIGN KEY (tid) REFERENCES teacher (tid);
ALTER TABLE center ADD CONSTRAINT fk_center_sid FOREIGN KEY (sid) REFERENCES student (sid);
一对一关系
例如 QQ 和 QQ 中的详尽信息
qq
id password
qqdetail
id name qage gender
建立外键的时候 如何明确主从关系?
看谁引用了谁?被引用的表是主表
外键在从表中建立关联主表
CREATE TABLE qq (
id INT PRIMARY KEY,
PASSWORD VARCHAR (100)
);
CREATE TABLE qqdetail (
id INT PRIMARY KEY,
qname VARCHAR (100) NOT NULL,
qgender VARCHAR (100) DEFAULT '男'
);
ALTER TABLE qqdetail ADD CONSTRAINT fk_qqdetaile_id FOREIGN KEY (id) REFERENCES qq (id);
数据库
1.对库/表结构进行操作
create alter drop
查看表字段的 desc 表名
pri 主键
mul 可重复的键值(外键)
nui 唯一键
2.对表数据进行操作语句
插入 更新 删除
3.查询
条件查询 where
分组查询 group by
分页查询 limit
模糊查询 like
排序查询 order by
聚合函数查询 sum avg count max min
子查询 多个 select 嵌套查询
连接查询 join left right
自然连接查询 natural join
自连接查询 将自己当做新表使用
把查询的结果集当做一个表使用
合并查询 union