• 08数据库复习02


    1.数据的操作

    -- 更新名字为4为的用户,让其年龄+100
    UPDATE  cms_user  SET age = age + 100 WHERE username LIKE '____';

    -- 更新前三条记录,让已有年龄+20
    UPDATE cms_user SET age = age + 20 LIMIT 3;

    注意:不能使用偏移量的分页限制方式。

    -- 删除用户性别为男的用户,按照年龄降序排列,删除前2条记录
    DELETE FROM cms_user WHERE sex = '' ORDER BY  age DESC LIMIT 2;

    2.连接查询

    -- 查询cms_user id,username
    -- provinces,proName
    SELECT cms_user.id,cms_user.username,provinces.proName FROM cms_user,provinces;-- 这样得到的结果是一个笛卡尔积的形式

    SELECT cms_user.id,cms_user.username,provinces.proName FROM cms_user,provinces WHERE cms_user.proId = provinces.`id`;

    -- 内连接的方式进行查询
    SELECT u.`id`,u.`username`,p.`proName`
    FROM cms_user AS u
    INNER JOIN provinces AS p
    ON u.`proId` = p.`id`
    
    SELECT u.`id`,u.`username`,p.`proName`
    FROM cms_user AS u
    CROSS JOIN provinces AS p
    ON u.`proId` = p.`id`
    
    SELECT u.`id`,u.`username`,p.`proName`
    FROM cms_user AS u
    JOIN provinces AS p
    ON u.`proId` = p.`id`

    -- 查询cms_user id,username
    -- provinces,proName
    -- 条件是cms_user为男的用户
    SELECT u.`id`,u.`username`,p.`proName`
    FROM cms_user AS u
    JOIN provinces AS p
    ON u.`proId` = p.`id`
    WHERE u.`sex`='';

    SELECT u.`id`,u.`username`,p.`proName`
    FROM cms_user AS u
    JOIN provinces AS p
    ON u.`proId` = p.`id`
    WHERE u.`sex`=''
    GROUP BY p.`proName`;

    SELECT u.`id`,u.`username`,p.`proName`,COUNT(*) AS totalUser
    FROM cms_user AS u
    JOIN provinces AS p
    ON u.`proId` = p.`id`
    WHERE u.`sex`=''
    GROUP BY p.`proName`;

    SELECT u.`id`,u.`username`,p.`proName`,COUNT(*) AS totalUser
    FROM cms_user AS u
    JOIN provinces AS p
    ON u.`proId` = p.`id`
    WHERE u.`sex`=''
    GROUP BY p.`proName`
    HAVING totalUser > 1;

    -- 查询cms_news 中的id,title
    -- cms_cate 中的cateName
    SELECT n.id,n.`title`,c.`cateName`
    FROM cms_news AS n
    JOIN cms_cate AS c
    ON n.`cId`=c.`id`

    -- 查询cms_news 中的id,title
    -- cms_admin username,role
    SELECT n.`id`,n.`title`,a.`username`,a.`role`
    FROM cms_news AS n
    JOIN cms_admin AS a
    ON n.`aId`=a.`id`

    -- 查询cms_news 中的id,title
    -- cms_cate cateName
    -- cms_admin username,role
    SELECT n.`id`,n.`title`,c.`cateName`,a.`username`,a.`role`
    FROM cms_cate AS c
    JOIN cms_news AS n
    ON c.`id`=n.`cId`
    JOIN cms_admin AS a
    ON a.`id` = n.`aId`

    -- 插入一条错误的数据
    INSERT cms_user(username,PASSWORD,regTime,proId)
    VALUES('test2','test2',1234,20);
    
    SELECT * FROM cms_user;

    -- test2那条数据使用内连接查询查不出来,因为是个错误数据,不满足查询条件
    SELECT u.`id`,u.`username`,p.`proName`
    FROM cms_user AS u
    JOIN provinces AS p
    ON u.`proId` = p.`id`

    -- 左外连接,左表为主表
    SELECT u.`id`,u.`username`,p.`proName`
    FROM cms_user AS u
    LEFT JOIN provinces AS p
    ON u.`proId` = p.`id`

    -- 左外连接,左表为主表
    SELECT u.`id`,u.`username`,p.`proName`
    FROM provinces AS p
    LEFT JOIN cms_user AS u
    ON u.`proId` = p.`id`

    3.外键

    -- 创建部门表department(主表)
    -- id depName 
    CREATE TABLE IF NOT EXISTS department(
        id TINYINT UNSIGNED AUTO_INCREMENT KEY,
        depName VARCHAR(20) NOT NULL UNIQUE
    )ENGINE = INNODB;
    
    INSERT department(depName) VALUES('教学部'),('市场部'),('运营部'),('督导部');

    -- 创建员工表employee(子表)
    -- id,username,depId
    CREATE TABLE IF NOT EXISTS employee(
        id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
        username VARCHAR(20) NOT NULL UNIQUE,
        depId TINYINT UNSIGNED
    )ENGINE = INNODB;
    
    
    INSERT employee(username,depId) VALUES('king',1),
    ('queen',2),
    ('zhangsan',3),
    ('lisi',4),
    ('wangwu',1);

    SELECT e.`id`,e.`username`,d.`depName`
    FROM employee AS e
    JOIN department AS d
    ON e.`depId`=d.`id`

    -- 删除督导部
    DELETE FROM department WHERE depName='督导部';
    
    SELECT * FROM employee;

    -- 删除之前创建的员工表和部门表
    DROP TABLE employee,department;
    
    -- 重新创建带有外键的员工表和部门表
    -- 创建部门表department(主表)
    -- id depName 
    CREATE TABLE IF NOT EXISTS department(
        id TINYINT UNSIGNED AUTO_INCREMENT KEY,
        depName VARCHAR(20) NOT NULL UNIQUE
    )ENGINE = INNODB;
    
    INSERT department(depName) VALUES('教学部'),('市场部'),('运营部'),('督导部');
    
    -- 创建员工表employee(子表)
    -- id,username,depId
    CREATE TABLE IF NOT EXISTS employee(
        id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
        username VARCHAR(20) NOT NULL UNIQUE,
        depId TINYINT UNSIGNED,
        FOREIGN KEY(depId) REFERENCES department(id)
    )ENGINE = INNODB;
    
    
    INSERT employee(username,depId) VALUES('king',1),
    ('queen',2),
    ('zhangsan',3),
    ('lisi',4),
    ('wangwu',1);

    -- 先删除属于1部门的员工
    DELETE FROM employee WHERE depId = 1;
    -- 然后才可以删除1部门
    DELETE FROM department WHERE id = 1;

    INSERT employee(username,depId) VALUES('test',11); -- 因为有了外键约束,所以不能随便插入

    -- 删除员工表
    DROP TABLE employee;
    
    -- 指定外键名称
    CREATE TABLE IF NOT EXISTS employee(
        id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
        username VARCHAR(20) NOT NULL UNIQUE,
        depId TINYINT UNSIGNED,
        CONSTRAINT emp_fk_dep FOREIGN KEY(depId) REFERENCES department(id)
    )ENGINE = INNODB;
    
    INSERT employee(username,depId) VALUES('king',3),
    ('queen',2),
    ('zhangsan',3),
    ('lisi',4),
    ('wangwu',2);

    -- 删除外键
    ALTER TABLE employee DROP FOREIGN KEY emp_fk_dep;
    
    -- 添加外键
    ALTER TABLE employee ADD CONSTRAINT emp_fk_dep FOREIGN KEY(depId) REFERENCES department(id);
    -- 删除之前创建的表
    DROP TABLE employee,department;
    
    CREATE TABLE IF NOT EXISTS department(
        id TINYINT UNSIGNED AUTO_INCREMENT KEY,
        depName VARCHAR(20) NOT NULL UNIQUE
    )ENGINE = INNODB;
    
    INSERT department(depName) VALUES('教学部'),('市场部'),('运营部'),('督导部');
    
    -- 创建员工表employee(子表)
    -- id,username,depId
    CREATE TABLE IF NOT EXISTS employee(
        id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
        username VARCHAR(20) NOT NULL UNIQUE,
        depId TINYINT UNSIGNED,
        FOREIGN KEY(depId) REFERENCES department(id) ON DELETE CASCADE -- 级联操作,当删除父表中的记录,对应的字表中的记录也会被删除
    )ENGINE = INNODB;
    
    
    INSERT employee(username,depId) VALUES('king',1),
    ('queen',2),
    ('zhangsan',3),
    ('lisi',4),
    ('wangwu',1);
    
    SELECT * FROM department;
    
    DELETE FROM department WHERE id=1;
    
    SELECT * FROM employee;

    4.联合查询

    -- 联合查询
    SELECT username FROM cms_user; -- 有10条记录
    
    SELECT username  FROM employee; -- 有3条记录
    
    SELECT username FROM cms_user UNION SELECT username  FROM employee; -- 有12条记录,去除了重复

    SELECT username FROM cms_user UNION ALL SELECT username  FROM employee; -- 有13条记录,不去除重复

    5.子查询

    -- 由[not] in 引发的子查询
    SELECT id FROM department; -- 答案为2,3,4
    
    SELECT id,username FROM employee WHERE depId IN(2,3,4);
    
    -- 利用子查询
    SELECT id,username FROM employee WHERE depId IN(SELECT id FROM department);

    -- 创建student表
    -- id,username,score
    CREATE TABLE IF NOT EXISTS student(
        id TINYINT UNSIGNED AUTO_INCREMENT KEY,
        username VARCHAR(20) NOT NULL UNIQUE,
        score TINYINT UNSIGNED
    );
    INSERT student(username,score) VALUES('king1',90),
    ('king2',80),
    ('king3',40),
    ('king4',50),
    ('king6',70),
    ('king7',90),
    ('king8',55),
    ('king9',25);
    
    -- 创建奖学金scholarship
    -- id,level
    CREATE TABLE IF NOT EXISTS scholarship(
        id TINYINT UNSIGNED AUTO_INCREMENT KEY,
        LEVEL TINYINT UNSIGNED
    );
    
    INSERT scholarship(LEVEL) VALUES(90),(80),(70);
    
    -- 查询一等奖学金的学员有,id,username
    SELECT LEVEL FROM scholarship WHERE id=1; -- 查询结果为90
    
    SELECT id,username FROM student WHERE score >= 90;
    
    -- 使用子查询
    SELECT id,username FROM student WHERE score>=(SELECT LEVEL FROM scholarship WHERE id=1);

    SELECT id,username FROM employee WHERE EXISTS(SELECT * FROM department WHERE id = 10); -- 没有查询结果
    
    SELECT id,username FROM employee WHERE EXISTS(SELECT * FROM department WHERE id = 2);

    -- 查询所有获得奖学金的学员信息id,username
    SELECT id,username FROM student WHERE score >= ANY (SELECT LEVEL FROM scholarship)

    -- 查询所有获得一等奖学金的学员信息id,username
    SELECT id,username,score FROM student WHERE score >= ALL (SELECT LEVEL FROM scholarship);

    -- 查询没有获得奖学金的学员信息
    SELECT id,username,score FROM student WHERE score < ALL(SELECT LEVEL FROM scholarship);

    CREATE TABLE test1(
        id TINYINT UNSIGNED AUTO_INCREMENT KEY,
        num TINYINT UNSIGNED
    );
    -- 将查询的结果插入到另一个表中
    INSERT test1(id,num) SELECT id,score FROM student;
    
    SELECT * FROM test1;

    -- 在创建表时,将查询结果写入到表中
    CREATE TABLE test2(
        id TINYINT UNSIGNED AUTO_INCREMENT KEY,
        num TINYINT UNSIGNED
    ) SELECT id,score FROM student;
    
    SELECT * FROM test2;

    -- 在创建表时,将查询结果写入到表中
    CREATE TABLE test3(
        id TINYINT UNSIGNED AUTO_INCREMENT KEY,
        score TINYINT UNSIGNED
    ) SELECT id,score FROM student;
    
    SELECT * FROM test3;

    6.正则表达式

    -- 查询用户名以r开始的用户
    SELECT * FROM cms_user WHERE username REGEXP '^r';

    -- 查询用户名以g结尾的用户
    SELECT * FROM cms_user WHERE username REGEXP 'g$';

    -- 查询用户名以r开始,以g结束,中间有两个字符 .
    SELECT * FROM cms_user WHERE username REGEXP 'r..g';
    
    SELECT * FROM cms_user WHERE username LIKE 'r__g';

    -- 查询用户名中包含tlo字符的用户信息 [tlo]
    SELECT * FROM cms_user WHERE username REGEXP '[tlo]'; 

    -- 查询用户名中不包含tlo字符的用户信息 [tlo]
    SELECT * FROM cms_user WHERE username REGEXP '[^tlo]'; -- 注意要求用户名中仅仅包含t字符或者仅仅包含l字符或者仅仅包含o字符
    -- 查询用户名中包括ng|qu|te的用户信息
    SELECT * FROM cms_user WHERE username REGEXP 'ng|qu|te';

    7.运算符

    SELECT username,username = 'king' FROM cms_user;

    SELECT id,username, score >= 70 FROM student;

    8.数学函数

    9.字符串函数

     

    10.日期函数

     

    11.条件判断函数和系统函数

    11.1条件判断函数

    SELECT id,username, score,IF(score>=60,'及格','不及格') FROM student;

    SELECT id,username,age,IFNULL(age,0) FROM cms_user;

    SELECT id,username,score,CASE WHEN score>60 THEN '不错' WHEN score=60 THEN '刚及格' ELSE '没及格' END FROM student;

    11.2系统函数

    12.加密函数

    13.其他常用的函数

  • 相关阅读:
    工单系统(帮助中心)
    理解RESTful架构
    trace显示不出东西
    thinkphp
    在一个元素中查找子元素
    阻止表单元素失去焦点
    RelativeLayout不能调用measure去直接测量子元素
    兼容加载Xml字符串
    IE下载时提示无法下载,重试后成功
    借用layer让弹层不限制在iframe内部
  • 原文地址:https://www.cnblogs.com/xinmomoyan/p/11435930.html
Copyright © 2020-2023  润新知