• 黑马MySQL数据库学习day02 表数据CRUD 约束CRUD


     1 /*
     2     基础查询练习:
     3         1.字段列表查询
     4             当查询全部字段时,一种简便方式,使用*代替全部字段(企业中不推荐使用) 
     5             
     6         2.去除重复行
     7             DISTINCT,注意修饰的是行,也就是整个字段列表,而不是单个字段。
     8             DISTINCT的位置在字段列表前。
     9             
    10         3.计算字段
    11             字段运算,函数处理。
    12             
    13             bug点: null值参与计算,得到的值是null
    14             方案:IFNULL(含null值表达式, null值的代替值)函数处理。
    15             
    16         4.别名
    17             AS关键字 
    18 */
    19 DROP TABLE IF EXISTS student;
    20 CREATE TABLE student(
    21     id INT PRIMARY KEY, -- 编号
    22     name VARCHAR(20), -- 姓名
    23     age INT, -- 年龄
    24     sex VARCHAR(5), -- 性别
    25     address VARCHAR(100), -- 地址
    26     math INT, -- 数学
    27     english INT -- 英语
    28 );
    29 INSERT INTO student(id, name, age, sex, address, math, english)
    30 VALUES
    31 (1,'马云',55,'','杭州',66,78),
    32 (2,'马化腾',45,'','深圳',98,87),
    33 (3,'马景涛',55,'','香港',56,77),
    34 (4,'柳岩',20,'','湖南',76,65),
    35 (5,'柳青',20,'','湖南',76,NULL),
    36 (6,'刘德华',57,'','香港',99,99),
    37 (7,'马德',22,'','香港',99,99),
    38 (8,'德玛西亚',18,'','南京',56,65);
    39 
    40 -- 1.字段列表查询
    41 SELECT name, math, english FROM student;
    42 
    43 -- 简便方式,*表示全部字段,进行查询
    44 SELECT * FROM student;
    45 
    46 -- 规范写法,并且企业中规定禁止用SELECT *,效率低。
    47 SELECT
    48     name, -- 姓名
    49     math, -- 数学
    50     english -- 英语
    51 FROM
    52     student; -- 学生表
    53 
    54 -- 2.去除重复行,DISTINCT修饰的是字段列表,不是单个字段。
    55 SELECT DISTINCT address from student;
    56 
    57 SELECT name, DISTINCT address from student;-- 错误语句
    58 
    59 
    60 -- 3.计算字段
    61 SELECT name, math, english, math + english FROM student;-- bug: NULL值,参与计算,得到的结果是NULL。不符合要求。
    62 
    63 SELECT    name, math, english, IFNULL(math, 0) + IFNULL(english, 0) FROM student;-- 调用函数,对NULL进行处理
    64 
    65 -- 4.起别名
    66 SELECT    name, math, english, IFNULL(math, 0) + IFNULL(english, 0) AS total_score FROM student;-- 对计算字段起别名
    67 
    68 -- 5.bug
    69 DROP TABLE IF EXISTS student;
    70 CREATE TABLE student(
    71     id INT PRIMARY KEY, -- 编号
    72     name VARCHAR(20), -- 姓名
    73     age INT, -- 年龄
    74     sex VARCHAR(5), -- 性别
    75     address VARCHAR(100), -- 地址
    76     math INT, -- 数学
    77     english INT -- 英语
    78 );
    79 INSERT INTO student(id,name,age,sex,address,math,english) VALUES (1,'马云',55,'','
    80 杭州',66,78),(2,'马化腾',45,'','深圳',98,87),(3,'马景涛',55,'','香港',56,77),(4,'柳岩
    81 ',20,'','湖南',76,65),(5,'柳青',20,'','湖南',86,NULL),(6,'刘德华',57,'','香港
    82 ',99,99),(7,'马德',22,'','香港',99,99),(8,'德玛西亚',18,'','南京',56,65);
    83 
    84 -- bug1: NULL值,参与计算,得到的结果是NULL。不符合要求。
    85 SELECT name, math, english, math + english FROM student;
    86 
    87 -- bug2: 在字符串中间换行,导致字符串中会额外插入一个换行符。
    88 SELECT DISTINCT address from student;-- bug演示:发现有2个香港,没有去重,其实其中1个有个额外的换行符。
    基础查询练习
     1 /*
     2 基础条件查询:
     3     全部的比较运算符参看MySQL手册第12章运算符和函数
     4     1.关系运算符 
     5         > < >= <= = != 
     6         <> 
     7     2.逻辑运算符 
     8         AND OR NOT 
     9         && || ! 不推荐
    10     3.便捷运算符
    11         BETWEEN AND, IN
    12         NOT BETWEEN AND, NOT IN
    13     4.null值判断
    14         IS NULL 
    15         IS NOT NULL
    16     5.模糊查询
    17         LIKE 
    18         NOT LIKE
    19         %(匹配n个任意字符) 
    20         _(匹配1个任意字符)
    21 */
    22 DROP TABLE IF EXISTS student;
    23 CREATE TABLE student(
    24     id INT PRIMARY KEY, -- 编号
    25     NAME VARCHAR(20), -- 姓名
    26     age INT, -- 年龄
    27     sex VARCHAR(5), -- 性别
    28     address VARCHAR(100), -- 地址
    29     math INT, -- 数学
    30     english INT -- 英语
    31 );
    32 INSERT INTO student(id, NAME, age, sex, address, math, english)
    33 VALUES
    34 (1,'马云',55,'','杭州',66,78),
    35 (2,'马化腾',45,'','深圳',98,87),
    36 (3,'马景涛',55,'','香港',56,77),
    37 (4,'柳岩',20,'','湖南',76,65),
    38 (5,'柳青',20,'','湖南',76,NULL),
    39 (6,'刘德华',57,'','香港',99,99),
    40 (7,'马德',22,'','香港',99,99),
    41 (8,'德玛西亚',18,'','南京',56,65);
    42 
    43 SELECT * FROM student;
    44 
    45 -- 查询年龄大于20岁
    46 SELECT * FROM student WHERE age > 20;
    47 -- 查询年龄大于等于20岁
    48 SELECT * FROM student WHERE age >= 20;
    49 
    50 -- 查询年龄等于20岁
    51 SELECT * FROM student WHERE age = 20;
    52 -- 查询年龄不等于20岁
    53 SELECT * FROM student WHERE age != 20;
    54 SELECT * FROM student WHERE age <> 20;
    55 
    56 
    57 -- 查询年龄在20岁到30岁的人
    58 SELECT * FROM student WHERE age >= 20 AND age <= 30;
    59 SELECT * FROM student WHERE age BETWEEN 20 AND 30;
    60 -- 查询年龄不在20岁到30岁的人
    61 SELECT * FROM student WHERE age NOT BETWEEN 20 AND 30;
    62 
    63 -- 查询年龄为18岁,20岁,22岁的人
    64 SELECT * FROM student WHERE age = 18 OR age = 20 OR age = 22;
    65 SELECT * FROM student WHERE age IN(18, 20, 22);
    66 -- 查询年龄不为18岁,20岁,22岁的人
    67 SELECT * FROM student WHERE age NOT IN(18, 20, 22);
    68 
    69 
    70 -- 查询英语成绩为null的人,即没有参加英语考试的人
    71 SELECT * FROM student WHERE english = NULL; -- 错误 不能用 = !=判断null值
    72 SELECT * FROM student WHERE english IS NULL;
    73 
    74 -- 查询英语成绩不为null的人,即参加了英语考试的人
    75 SELECT * FROM student WHERE english IS NOT NULL;
    76 
    77 
    78 -- 查询姓马的人
    79 SELECT * FROM student WHERE NAME LIKE '马%';
    80 -- 查询不姓马的人
    81 SELECT * FROM student WHERE NAME NOT LIKE '马%';
    82 
    83 -- 查询名字中含德的人
    84 SELECT * FROM student WHERE NAME LIKE '%德%';
    85 
    86 -- 查询名字中第2个字是化的人
    87 SELECT * FROM student WHERE NAME LIKE '_化%';
    88 -- 查询名字为3个字的人
    89 SELECT * FROM student WHERE NAME LIKE '___';
    基础条件查询练习
      1 /*
      2 分组聚合排序分页查询:
      3     WHERE和HAVING的区别?
      4         1.where在分组前过滤数据,不满足条件的,不参与分组。having在分组后过滤数据。
      5         2.where中不能使用聚合函数,having中可以使用聚合函数。
      6 
      7     1.分组
      8             1.语法:
      9             [GROUP BY {col_name | expr | position}[ASC | DESC], ... [WITH ROLLUP]]
     10             2.过滤分组:
     11                 [HAVING where_condition]
     12                 分组后过滤数据。可以使用聚合函数。
     13             3.注意点:
     14                 1.分组后查询目标:分组字段,聚合函数,
     15                 2.提供了ASC和DESC,这是提供的ORDER BY的一种简便方式。
     16 
     17     2.聚合
     18         5个聚合函数,排除null值。不对null值进行统计。
     19             1.count()
     20             2.max()
     21             3.min()
     22             4.avg()
     23             5.sum()
     24         特殊的:count(*),统计结果集中记录数,包括null行。
     25                 
     26     3.排序
     27         语法:
     28             [ORDER BY {col_name | expr | position} [ASC | DESC], ...]
     29         排序方式:
     30             ASC 升序 默认的
     31             DESC 降序
     32         注意点:
     33             1.如果排序中有null值,则MySQL是nullmin的,即null值最小。
     34             2.多条件排序,多个排序条件有先后次序。
     35             3.如果进行了分组,则是对分组后的结果集进行排序
     36 
     37     4.分页
     38         语法:
     39             [LIMIT {[offset,] row_count | row_count OFFSET offset}]
     40             offset: 起始行
     41             row_count: 行数
     42         公式:
     43                 起始行 = (当前页 - 1)* 页大小
     44                 行数 = 页大小    
     45 */
     46 DROP TABLE IF EXISTS student;
     47 CREATE TABLE student(
     48     id INT PRIMARY KEY, -- 编号
     49     NAME VARCHAR(20), -- 姓名
     50     age INT, -- 年龄
     51     sex VARCHAR(5), -- 性别
     52     address VARCHAR(100), -- 地址
     53     math INT, -- 数学
     54     english INT -- 英语
     55 );
     56 INSERT INTO student(id, NAME, age, sex, address, math, english)
     57 VALUES
     58 (1,'马云',55,'','杭州',66,78),
     59 (2,'马化腾',45,'','深圳',98,87),
     60 (3,'马景涛',55,'','香港',56,77),
     61 (4,'柳岩',20,'','湖南',76,65),
     62 (5,'柳青',20,'','湖南',76,NULL),
     63 (6,'刘德华',57,'','香港',99,99),
     64 (7,'马德',22,'','香港',99,99),
     65 (8,'德玛西亚',18,'','南京',56,65);
     66 
     67 SELECT * FROM student;
     68 
     69 -- 按男女分组,查询平均分
     70 SELECT sex, AVG(math) FROM student GROUP BY sex;
     71 -- 按男女分组,查询平均分和男生女生人数
     72 SELECT sex, AVG(math), COUNT(id) FROM student GROUP BY sex;
     73 -- 按男女分组,查询平均分和男生女生人数。要求:分数低于70的不参与分组
     74 SELECT sex, AVG(math), COUNT(id) FROM student WHERE math > 70 GROUP BY sex;
     75 -- 按男女分组,查询平均分和男生女生人数。要求:分数低于70的不参与分组,并且分组人数大于2
     76 SELECT sex, AVG(math), COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
     77 
     78 
     79 
     80 -- 统计学生人数,用count(*)
     81 SELECT count(*) FROM student;
     82 
     83 SELECT 
     84     MAX(english) max_score,
     85     MIN(english) min_score,
     86     AVG(english) avg_score,
     87     sum(english) sumAll,
     88     count(english) num
     89 FROM student;
     90 
     91 
     92 -- 按照(总分 desc,英语 desc)排序
     93 SELECT *, (IFNULL(math, 0) + IFNULL(english, 0)) AS total_score from student
     94 ORDER BY total_score DESC, english DESC;
     95 
     96 
     97 -- 页大小为3,数据库中总共有8条数据
     98 SELECT * FROM student LIMIT 0, 3; -- 第1页 返回3条
     99 SELECT * FROM student LIMIT 3, 3; -- 第2页 返回3条
    100 SELECT * FROM student LIMIT 6, 3; -- 第3页 返回2条
    101 SELECT * FROM student LIMIT 9, 3; -- 第4页 返回0条
    分组聚合排序分页查询
      1 /*
      2 约束分类: 4种约束的CRUD
      3 注意点:
      4 唯一 主键 外键 都可以约束多列。
      5 4种约束,建表后,添加约束,如果表中有数据,则可能出bug,导致约束添加失败。
      6 
      7 查询约束:
      8         查询约束信息:SHOW CREATE TABLE 表名;
      9         查询约束语法:help create talbe; help alter table
     10 
     11     1.非空
     12             NOT NULL 非空
     13         建表时加非空,删除非空,建表后加非空
     14         
     15         建表后添加非空约束:
     16         bug: 如果表中有数据,并且指定列有null值,则非空约束添加失败。
     17             
     18     2.唯一    
     19             UNIQUE 唯一,可以有多个null值
     20         建表时加UNIQUE,删除UNIQUE,建表后加UNIQUE
     21         
     22         建表后添加唯一约束:
     23         bug: 如果表中有数据,并且指定的列有重复数据,则UNIQUE约束添加失败
     24 
     25         注意点:
     26             UNIQUE约束允许多个null值。
     27 
     28     3.主键 
     29         PRIMARY KEY  唯一非空,一张表只能有一个主键约束
     30         建表时加PRIMARY KEY,删除PRIMARY KEY,建表后加PRIMARY KEY
     31         
     32         建表后添加主键约束:
     33         bug: 如果表中有数据,并且指定列含有null值或者重复数据,则添加主键失败。
     34     
     35         注意点:
     36             1.PRIMARY KEY != UNIQUE + NOT NULL(因为主键只能有一个,而UNIQUE + NOT NULL可以多个)
     37             2.删除PRIMARY KEY后还会有一个NOT NULL约束
     38 
     39     4.外键
     40         FOREIGN KEY 外键约束可以设置级联更新和级联删除
     41         建表时加FOREIGN KEY,删除FOREIGN KEY,建表后加FOREIGN KEY
     42         
     43         建表后添加外键约束:
     44         bug: 如果从表有数据,并且外键列引用了被引用列没有的值,则添加外键约束失败
     45 
     46         注意点:
     47             1.添加外键约束,主表必须存在
     48             2.表数据约束:
     49                 1.从表不能引用主表中不存在的值
     50                 2.主表不能删除被从表引用的记录
     51             3.删表:从表引用主表,不能直接删除主表。
     52 
     53     5.综合:
     54     唯一 主键 外键 都可以约束多列。
     55     4种约束,建表后,添加约束,如果表中有数据,则可能出bug,导致约束添加失败。
     56     
     57     6.自动增长
     58             AUTO_INCREMENT
     59             1.一张表只能有一个自动增长列,该列必须是数值类型
     60             2.自增的新值= 表数据最大值 + 1
     61     7.默认值
     62             DEFAULT
     63 
     64 */
     65 DROP TABLE IF EXISTS student;
     66 
     67 -- 建表时添加NOT NULL约束
     68 CREATE TABLE student(
     69     name VARCHAR(50) NOT NULL
     70 );
     71 
     72 -- 删除NOT NULL约束
     73 ALTER TABLE student MODIFY name VARCHAR(50);
     74 
     75 -- 建表后添加NOT NULL约束
     76 -- bug: 如果表中有数据,并且指定列有null值,则非空约束添加失败。
     77 ALTER TABLE student MODIFY name VARCHAR(50) NOT NULL;
     78 DELETE FROM student WHERE name IS NULL;
     79 
     80 
     81 
     82 DROP TABLE IF EXISTS student;
     83 
     84 -- 建表时,添加UNIQUE约束
     85 CREATE TABLE student(
     86     name VARCHAR(50) UNIQUE
     87 );
     88 
     89 CREATE TABLE student(
     90     name VARCHAR(50),
     91     CONSTRAINT uni_name UNIQUE(name)
     92 );
     93 
     94 -- 删除UNIQUE约束
     95 ALTER TABLE student DROP INDEX name;
     96 
     97 -- 建表后,添加UNIQUE约束
     98 -- bug: 如果表中有数据,并且指定的列有重复数据,则UNIQUE约束添加失败
     99 ALTER TABLE student MODIFY name VARCHAR(50) UNIQUE;
    100 ALTER TABLE student ADD CONSTRAINT uni_name UNIQUE(name);
    101 
    102 -- 查看表信息
    103 SHOW CREATE TABLE student;
    104 
    105 /*
    106     PRIMARY KEY 主键约束
    107         唯一非空,一张表只能有一个主键约束
    108         注意点:
    109             PRIMARY KEY != UNIQUE + NOT NULL(因为主键只能有一个,而UNIQUE + NOT NULL可以多个)
    110 */
    111 DROP TABLE IF EXISTS student;
    112 
    113 -- 建表时,添加PRIMARY KEY约束
    114 CREATE TABLE student(
    115     name VARCHAR(50) PRIMARY KEY
    116 );
    117 
    118 CREATE TABLE student(
    119     name VARCHAR(50),
    120     PRIMARY KEY(name)
    121 );
    122 
    123 -- 删除主键
    124 ALTER TABLE student DROP PRIMARY KEY; -- 删除后还有一个NOT NULL约束
    125 
    126 -- 创建完表后,添加主键
    127 -- bug: 如果表中有数据,并且指定列含有null值或者重复数据,则添加主键失败。
    128 ALTER TABLE student MODIFY name VARCHAR(50) PRIMARY KEY;
    129 ALTER TABLE student ADD PRIMARY KEY (name); 
    130 
    131 -- 查看表:约束
    132 SHOW CREATE TABLE student;
    133 
    134 
    135 /*
    136     外键约束:
    137         注意点:
    138             1.添加外键约束,主表必须存在
    139             2.表数据约束:
    140                 1.从表不能引用主表中不存在的值
    141                 2.主表不能删除被从表引用的记录
    142             3.删表:从表引用主表,不能直接删除主表。
    143 */
    144 DROP TABLE IF EXISTS employee;
    145 DROP TABLE IF EXISTS department;
    146 
    147 CREATE TABLE department(
    148     id INT PRIMARY KEY,
    149     name varchar(50) UNIQUE NOT NULL
    150 );
    151 -- 建表时,添加外键
    152 CREATE TABLE employee(
    153     id INT PRIMARY KEY,
    154     name    varchar(50) NOT NULL,
    155     dep_id    INT,
    156     CONSTRAINT emp_dep_fk FOREIGN KEY(dep_id) REFERENCES department(id)
    157 );
    158 -- 删除外键
    159 ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;
    160 
    161 -- 建表后,添加外键
    162 -- bug: 如果从表有数据,并且外键列引用了被引用列没有的值,则添加外键约束失败
    163 ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY(dep_id) REFERENCES department(id);
    164 
    165 SHOW CREATE TABLE employee;
    MySQL约束
  • 相关阅读:
    ifcfgens33 xsync async
    MySQL 忘记 root密码 两种 处理方法
    MySQL 用户 权限管理 按需分配 mysql 权限
    ip
    Mac设置su root密码
    odbc 通过 sql server 客户端 连接 mysql
    MySQL 忘记 root密码 处理方法
    mysql 查询缓存 相关变量 参数
    windows 如何 远程桌面 连接 mac
    图像清晰度的评价指标
  • 原文地址:https://www.cnblogs.com/mozq/p/10710438.html
Copyright © 2020-2023  润新知