Java 之 MySQL 查询与约束

查询

排序  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

http://blog.csdn.net/huzongnan/article/list

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值