• JAVA12_01学习总结(MySQL,约束)


    今日内容

    1. MySql基本查询

    --ifnull(字段名称,预期值)
        -如果两个int类型数据求和,其中一个为null,那么结果就是null,使用ifnull来解决
    1. -- 需求--查询姓名和成绩和
    2. -- 创建表
    3. CREATE TABLE test(
    4. id INT , -- 编号
    5. NAME VARCHAR(20) , -- 姓名
    6. age INT , -- 年龄
    7. math INT , -- 数学成绩
    8. english INT -- 英语成绩
    9. )
    10. -- 输入数据
    11. INSERT INTO
    12. test
    13. VALUES
    14. (1,'钟离',500,80,NULL) ,
    15. (2,'胡桃',18,90,100) ;
    16. -- 查询姓名以及数学和英语成绩之和
    17. SELECT
    18. NAME '姓名', -- 添加说明,AS可省略
    19. (math+english) '和'
    20. FROM
    21. test;

     

    1. -- 解决方案,使用ifnull
    2. SELECT
    3. NAME '姓名',
    4. (math+IFNULL(english,0)) '和'
    5. FROM
    6. test;

     

    查询年龄是500或者年龄是18的所有信息
        --where条件可以使用
            or 或者
            java语言||
            in(值1,值2.....)
    1. -- where条件可以使用 -or 或者 -java语言|| -in(值1,值2.....)
    2. -- or
    3. SELECT
    4. *
    5. FROM
    6. test
    7. WHERE
    8. age=500 OR age=18 ;
    9. -- ||
    10. SELECT
    11. *
    12. FROM
    13. test
    14. WHERE
    15. age=500 || age=18 ;
    16. -- in
    17. SELECT
    18. *
    19. FROM
    20. test
    21. WHERE
    22. age IN(500,18) ;

     

    查询某个字段为null的信息
        ---->is null
    查询字段不为null的信息
        ---->is not null
    1. -- 需求:查询英语成绩是null的所有信息
    2. SELECT
    3. *
    4. FROM
    5. test
    6. WHERE
    7. english IS NULL ;

     

    查询某个字段不等于某个值 
        ---使用!=
        ---mysql的 <>  
    1. -- 需求:查询年龄不是500岁的所有信息
    2. SELECT
    3. *
    4. FROM
    5. test
    6. WHERE
    7. age != 500 ;
    8. SELECT
    9. *
    10. FROM
    11. test
    12. WHERE
    13. age <> 500 ;

     

    2. DQL

    2.1 DQL之模糊查询

    模糊条件查询
        关键字--like
        语法
            select 字段列表 from 表名 where 字段名称 like '%XX%' --xx是查询条件
                %代表任意多个字符--开发中经常使用
                _代表任意一个字符
                'XX%' 或者 '%XX' 都是可以的
    1. -- 需求:查询表中所有名字里带桃的人的信息
    2. SELECT
    3. *
    4. FROM
    5. test
    6. WHERE
    7. NAME LIKE '%桃%' ;

     

    1. -- 查询学生的姓名是两个字符的人的信息
    2. SELECT
    3. *
    4. FROM
    5. test
    6. WHERE
    7. NAME LIKE '__' ; --两个下划线

     

    2.2 DQL之聚合查询

    DQL之聚合查询 
        ---结果是单行单例的
            COUNT(字段名称) ---使用最多  统计表的记录
                count里面 字段名称:一般是非业务字段
                    --如果字段某个值是null,不会统计
        
            max(列名称):求最大值
            min(列名称):求最小值   
            avg(列名称):求当前列的平均值
            sum(列名称):求当前这列的总和
        聚合函数---完成sql语句嵌套 (单表操作/多表都可以)
        SELECT 
            * 
        FROM
            test 
        WHERE 
        math > 
            (SELECT 
                AVG(math) 
            FROM
                test) ;

    2.3 DQL之排序查询

    DQL语句之排序查询 
        order by
            单独使用order by
                --select 字段列表 from 表名  order by  字段名称 排序规则;
                    排序规则
                        默认asc--升序排序
                           desc--降序
                    如果有条件where和order by同时存在
                        --先满足where条件,再排序!
    1. SELECT
    2. *
    3. FROM
    4. test
    5. WHERE
    6. math>70
    7. ORDER BY
    8. math ASC ,
    9. age DESC ;

     

    2.4 DQL之分组查询

    DQL语句之分组查询
        group by
            注意
                1)分组查询里面可以select 查询分组字段 
                2)分组group by后面不能使用聚合函数
            单独使用
                --select 字段列表 from 表名 group by 分组字段名称;
            如果分组查询带where条件
                --where条件和group by同时存在,where条件在group by的前面
                --group by的后面不能使用where,先满足where条件,才参与分组!

    2.5 筛选

    筛选having
        注意
            having的后面可以跟聚合函数
            having在group by后面 
            where是gruop by的前面

    2.6 分页查询

    分页查询limit
        语法
            select 字段列表 from 表名 limit 起始行数,每页显示的条数;
                起始行数= (当前页码数-1)*每页显示的条数;
        如果复合查询
            有where条件,还有limit,where在limit前面

    3. 约束

    约束
        约束用户操作数据库的非法行为

    3.1 默认约束

    1. -- 默认约束default
    2. -- 没有插入字段的值默认值null,为了防止这种数据出现,可以在创建表的时候加入默认约束default,当没有插入这个字段,默认约束起作用!
    3. CREATE TABLE testdefault(
    4. id INT ,
    5. NAME VARCHAR(20) ,
    6. sex VARCHAR(3) DEFAULT '女' -- 性别不填写的话默认女
    7. ) ;
    8. INSERT INTO testdefault (id , NAME) VALUES (1 , '钟离') ;
    9. SELECT * FROM testdefault ;

     

    3.2 非空约束

    1. -- 非空约束 not null
    2. -- 当前这个值不能为null,不能直接添加数据给一个null
    3. CREATE TABLE testnotnull(
    4. id INT NOT NULL , -- 序号不能是空,写入值的时候必须赋值
    5. NAME VARCHAR(20) ,
    6. sex VARCHAR(3)
    7. );
    8. -- INSERT INTO testnotnull (NAME,sex) VALUES ('钟离','男') ;
    9. -- Field 'id' doesn't have a default value
    10. INSERT INTO testnotnull VALUES (1,'钟离','男') ;
    11. SELECT * FROM testnotnull ;

     

    3.3 唯一约束

    1. -- 唯一约束 unique (当前这个值不能重复)
    2. -- 限制id字段/有效身份信息(邮箱/手机号/身份证...)
    3. CREATE TABLE testunique(
    4. id INT ,
    5. NAME VARCHAR(20) ,
    6. number INT UNIQUE -- 这个值输入时不能有重复!
    7. );
    8. -- insert into testunique values (1,'钟离',100773429),(2,'离',100773429) ;
    9. -- Duplicate entry '100773429' for key 'number'
    10. INSERT INTO testunique VALUES (1,'钟离',100773429),(2,'离',100773430) ;
    11. SELECT * FROM testunique ;

     

    3.4 主键约束

    1. -- 主键约束primary key
    2. -- 特点非空且唯一
    3. CREATE TABLE testprimarykey(
    4. id INT PRIMARY KEY , -- 主键,非空且唯一
    5. NAME VARCHAR(20) ,
    6. age INT
    7. );
    8. INSERT INTO testprimarykey VALUES (1,'钟离',15) ;
    9. -- INSERT INTO testprimarykey VALUES (1,'钟',15) ;
    10. -- Duplicate entry '1' for key 'PRIMARY'
    11. -- INSERT INTO testprimarykey VALUES (null,'钟离',15) ;
    12. -- Column 'id' cannot be null

     

    3.5 自增长约束

    1. -- 自增长约束 auto_increment
    2. -- 一般自增长约束都是在主键字段上,保证唯一
    3. -- 指定插入数据的值,下次在之前的值上继续自增1
    4. CREATE TABLE testauto_increment(
    5. id INT PRIMARY KEY AUTO_INCREMENT , -- 一般主键和自增连用
    6. NAME VARCHAR(20)
    7. );
    8. INSERT INTO testauto_increment (NAME) VALUES ('钟离');
    9. INSERT INTO testauto_increment (NAME) VALUES ('钟离');
    10. INSERT INTO testauto_increment (NAME) VALUES ('胡桃');
    11. SELECT * FROM testauto_increment ;
    12. -- mysql自带函数---查找数据库表中最后一次自增主键的值是多少
    13. SELECT LAST_INSERT_ID();

     

    3.6 外键约束

    1. -- foreign key
    2. /*问题:
    3. 1)查询员工的所有信息---部门名称字段 冗余度大(重复度高)
    4. 2)一张表描述了两个事情(员工信息,又有部门信息!)
    5. 解决方案
    6. 将这张表拆分两张表
    7. 一张表员工信息
    8. 一张表描述部门信息
    9. */
    10. -- 创建一张部门表
    11. CREATE TABLE dept(
    12. id INT PRIMARY KEY AUTO_INCREMENT, -- 部门编号
    13. NAME VARCHAR(10) -- 部门名称
    14. );
    15. INSERT INTO dept(NAME) VALUES('往生堂'),('屋漏茶室'),('烟花店');
    16. -- 创建一个员工表
    17. CREATE TABLE employee(
    18. id INT PRIMARY KEY AUTO_INCREMENT, -- 员工编号
    19. NAME VARCHAR(10) , -- 员工姓名
    20. gender VARCHAR(3) , -- 性别
    21. dept_id INT -- 部门编号
    22. );
    23. INSERT INTO employee(NAME,gender,dept_id)
    24. VALUES
    25. ('钟离','男',1),
    26. ('胡桃','女',1),
    27. ('夜阑','女',2),
    28. ('申鹤','女',2),
    29. ('宵宫','女',3) ;
    30. -- 插入了一个条数据:没有4号部门,但是依然能插入进去!
    31. -- 防止出现问题,添加外键约束---让两个产生关联关系
    32. -- 创建员工表的时候,同时添加外键约束!
    33. /*
    34. 外键作用的表---从表
    35. 另一张表---主表
    36. 创建表的时候添加外键
    37. constraint (声明)
    38. 外键名
    39. foriegn key
    40. (从表的字段名称)
    41. references -- (关联)
    42. 主表名(主键字段的名称)
    43. */
    44. CREATE TABLE employee(
    45. id INT PRIMARY KEY AUTO_INCREMENT, -- 编号
    46. NAME VARCHAR(10), -- 姓名
    47. gender VARCHAR(3), -- 性别
    48. dept_id INT ,-- 部门编号
    49. CONSTRAINT -- 声明
    50. dept_emp_fk -- 外键名称
    51. FOREIGN KEY
    52. (dept_id) -- 作用在指定外键字段上
    53. REFERENCES -- 关联
    54. dept(id) -- 主表的主键字段
    55. );
    56. -- 有了外键之后,直接修改或者删除主表数据,前提需要让从表的数据跟主表没有关联
    57. -- 这个时候才能修改和删除主表数据!
    58. -- 所以我们引出了!!!
    59. -- 级联操作cascade
    60. -- 级联删除/级联修改 on delete cascade /on update casade
    61. -- 当修改/删除主表的数据,从表数据随之改动
    62. -- 将上面这个语句放在外键的后面
    63. -- 添加外键的同时---添加级联修改和级联删除
    64. ALTER TABLE employee
    65. ADD CONSTRAINT dept_emp_fk
    66. FOREIGN KEY (dept_id)
    67. REFERENCES dept(id)
    68. ON UPDATE CASCADE
    69. ON DELETE CASCADE ;
    70. -- 直接修改主表数据,
    71. -- 将1号部门改成2号部门,这个时候1号部门的员工,它部门编号变成2
    72. UPDATE dept SET id = 2 WHERE id =1 ;
    73. -- 直接删除主表数据,从表随之变化
    74. -- 将3号部门解散
    75. DELETE FROM dept WHERE id = 3 ;

  • 相关阅读:
    前端开发免费资源分享
    JDBC数据库连接
    陪诊系统|陪诊软件革新陪诊体验解决病患难题
    机器学习笔记05---SVM支持向量机
    LeetCode:88. 合并两个有序数组
    《每天5分钟用Flask搭建一个管理系统》第11章:测试与部署
    vue2中vuex的用法
    使用webpack基础配置并打包typescript
    Uniapp中嵌入H5( uniapp开发的H5),并且在H5中跳转到APP的指定页面
    网页html产生随机MAC地址
  • 原文地址:https://blog.csdn.net/weixin_53118395/article/details/128138916