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. -- 3.计算字段
  60. SELECT name, math, english, math + english FROM student;-- bug: NULL值,参与计算,得到的结果是NULL。不符合要求。
  61.  
  62. SELECT name, math, english, IFNULL(math, 0) + IFNULL(english, 0) FROM student;-- 调用函数,对NULL进行处理
  63.  
  64. -- 4.起别名
  65. SELECT name, math, english, IFNULL(math, 0) + IFNULL(english, 0) AS total_score FROM student;-- 对计算字段起别名
  66.  
  67. -- 5.bug
  68. DROP TABLE IF EXISTS student;
  69. CREATE TABLE student(
  70. id INT PRIMARY KEY, -- 编号
  71. name VARCHAR(20), -- 姓名
  72. age INT, -- 年龄
  73. sex VARCHAR(5), -- 性别
  74. address VARCHAR(100), -- 地址
  75. math INT, -- 数学
  76. english INT -- 英语
  77. );
  78. INSERT INTO student(id,name,age,sex,address,math,english) VALUES (1,'马云',55,'男','
  79. 杭州',66,78),(2,'马化腾',45,'女','深圳',98,87),(3,'马景涛',55,'男','香港',56,77),(4,'柳岩
  80. ',20,'女','湖南',76,65),(5,'柳青',20,'男','湖南',86,NULL),(6,'刘德华',57,'男','香港
  81. ',99,99),(7,'马德',22,'女','香港',99,99),(8,'德玛西亚',18,'男','南京',56,65);
  82.  
  83. -- bug1: NULL值,参与计算,得到的结果是NULL。不符合要求。
  84. SELECT name, math, english, math + english FROM student;
  85.  
  86. -- bug2: 在字符串中间换行,导致字符串中会额外插入一个换行符。
  87. 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. -- 查询年龄在20岁到30岁的人
  57. SELECT * FROM student WHERE age >= 20 AND age <= 30;
  58. SELECT * FROM student WHERE age BETWEEN 20 AND 30;
  59. -- 查询年龄不在20岁到30岁的人
  60. SELECT * FROM student WHERE age NOT BETWEEN 20 AND 30;
  61.  
  62. -- 查询年龄为18岁,20岁,22岁的人
  63. SELECT * FROM student WHERE age = 18 OR age = 20 OR age = 22;
  64. SELECT * FROM student WHERE age IN(18, 20, 22);
  65. -- 查询年龄不为18岁,20岁,22岁的人
  66. SELECT * FROM student WHERE age NOT IN(18, 20, 22);
  67.  
  68. -- 查询英语成绩为null的人,即没有参加英语考试的人
  69. SELECT * FROM student WHERE english = NULL; -- 错误 不能用 = !=判断null
  70. SELECT * FROM student WHERE english IS NULL;
  71.  
  72. -- 查询英语成绩不为null的人,即参加了英语考试的人
  73. SELECT * FROM student WHERE english IS NOT NULL;
  74.  
  75. -- 查询姓马的人
  76. SELECT * FROM student WHERE NAME LIKE '马%';
  77. -- 查询不姓马的人
  78. SELECT * FROM student WHERE NAME NOT LIKE '马%';
  79.  
  80. -- 查询名字中含德的人
  81. SELECT * FROM student WHERE NAME LIKE '%德%';
  82.  
  83. -- 查询名字中第2个字是化的人
  84. SELECT * FROM student WHERE NAME LIKE '_化%';
  85. -- 查询名字为3个字的人
  86. 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. -- 统计学生人数,用count(*)
  79. SELECT count(*) FROM student;
  80.  
  81. SELECT
  82. MAX(english) max_score,
  83. MIN(english) min_score,
  84. AVG(english) avg_score,
  85. sum(english) sumAll,
  86. count(english) num
  87. FROM student;
  88.  
  89. -- 按照(总分 desc,英语 desc)排序
  90. SELECT *, (IFNULL(math, 0) + IFNULL(english, 0)) AS total_score from student
  91. ORDER BY total_score DESC, english DESC;
  92.  
  93. -- 页大小为3,数据库中总共有8条数据
  94. SELECT * FROM student LIMIT 0, 3; -- 1 返回3
  95. SELECT * FROM student LIMIT 3, 3; -- 2 返回3
  96. SELECT * FROM student LIMIT 6, 3; -- 3 返回2
  97. 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. DROP TABLE IF EXISTS student;
  81.  
  82. -- 建表时,添加UNIQUE约束
  83. CREATE TABLE student(
  84. name VARCHAR(50) UNIQUE
  85. );
  86.  
  87. CREATE TABLE student(
  88. name VARCHAR(50),
  89. CONSTRAINT uni_name UNIQUE(name)
  90. );
  91.  
  92. -- 删除UNIQUE约束
  93. ALTER TABLE student DROP INDEX name;
  94.  
  95. -- 建表后,添加UNIQUE约束
  96. -- bug: 如果表中有数据,并且指定的列有重复数据,则UNIQUE约束添加失败
  97. ALTER TABLE student MODIFY name VARCHAR(50) UNIQUE;
  98. ALTER TABLE student ADD CONSTRAINT uni_name UNIQUE(name);
  99.  
  100. -- 查看表信息
  101. SHOW CREATE TABLE student;
  102.  
  103. /*
  104. PRIMARY KEY 主键约束
  105. 唯一非空,一张表只能有一个主键约束
  106. 注意点:
  107. PRIMARY KEY != UNIQUE + NOT NULL(因为主键只能有一个,而UNIQUE + NOT NULL可以多个)
  108. */
  109. DROP TABLE IF EXISTS student;
  110.  
  111. -- 建表时,添加PRIMARY KEY约束
  112. CREATE TABLE student(
  113. name VARCHAR(50) PRIMARY KEY
  114. );
  115.  
  116. CREATE TABLE student(
  117. name VARCHAR(50),
  118. PRIMARY KEY(name)
  119. );
  120.  
  121. -- 删除主键
  122. ALTER TABLE student DROP PRIMARY KEY; -- 删除后还有一个NOT NULL约束
  123.  
  124. -- 创建完表后,添加主键
  125. -- bug: 如果表中有数据,并且指定列含有null值或者重复数据,则添加主键失败。
  126. ALTER TABLE student MODIFY name VARCHAR(50) PRIMARY KEY;
  127. ALTER TABLE student ADD PRIMARY KEY (name);
  128.  
  129. -- 查看表:约束
  130. SHOW CREATE TABLE student;
  131.  
  132. /*
  133. 外键约束:
  134. 注意点:
  135. 1.添加外键约束,主表必须存在
  136. 2.表数据约束:
  137. 1.从表不能引用主表中不存在的值
  138. 2.主表不能删除被从表引用的记录
  139. 3.删表:从表引用主表,不能直接删除主表。
  140. */
  141. DROP TABLE IF EXISTS employee;
  142. DROP TABLE IF EXISTS department;
  143.  
  144. CREATE TABLE department(
  145. id INT PRIMARY KEY,
  146. name varchar(50) UNIQUE NOT NULL
  147. );
  148. -- 建表时,添加外键
  149. CREATE TABLE employee(
  150. id INT PRIMARY KEY,
  151. name varchar(50) NOT NULL,
  152. dep_id INT,
  153. CONSTRAINT emp_dep_fk FOREIGN KEY(dep_id) REFERENCES department(id)
  154. );
  155. -- 删除外键
  156. ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;
  157.  
  158. -- 建表后,添加外键
  159. -- bug: 如果从表有数据,并且外键列引用了被引用列没有的值,则添加外键约束失败
  160. ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY(dep_id) REFERENCES department(id);
  161.  
  162. SHOW CREATE TABLE employee;

MySQL约束

黑马MySQL数据库学习day02 表数据CRUD 约束CRUD的更多相关文章

  1. 黑马MySQL数据库学习day03 级联 多表查询 连接和子查询 表约束

    /* 存在外键的表 删表限制: 1.先删除从表,再删除主表.(不能直接删除主表,主表被从表引用,尽管实际可能还没有记录引用) 建表限制: 1.必须先建主表,再建从表(没有主表,从表无法建立外键关系) ...

  2. 向MySql数据库导入excel表数据

    最近要开发一个小的答题系统,如果题目人工录入那确实很麻烦.所以想到是不是可以从用一些现有数据格式的文件导入数据.在网上查了一下,看到有关于将excel的数据导入到mysql的方法.所以将题库数据整理成 ...

  3. MYSQL数据库学习五 表的操作和约束

    5.1 表的基本概念 表示包含数据库中所有数据的数据库对象.一行代表唯一的记录,一列代表记录的一个字段. 列(Columns):属性列,创建表时必须指定列名和数据类型. 索引(Indexes):根据指 ...

  4. 黑马MySQL数据库学习day04 MySQL变量 存储过程 用户和授权管理

    /* MySQL中的变量局部变量,用户变量,会话变量和全局变量. 用户变量不用定义,直接使用. 1.用户变量赋值 set @xxx = 值; 2.查询 select @xxx; 语法帮助: 过程保存在 ...

  5. MySql数据库之单表数据查询

    查询数据 1.查询所有数据: select * from 表名; 2.根据指定条件查询数据:

  6. 黑马MySQL数据库学习day01 MySQL8和MySQL5.5暴力破解密码

  7. 黑马MySQL数据库学习day01 安装多个版本MySQL mysqld.exe工具

  8. linux mysql 数据库操作导入导出 数据表导出导入

    linux mysql 数据库操作导入导出 数据表导出导入 1,数据库导入 mysql -uroot -p show databases; create database newdb; use 数据库 ...

  9. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. Java笔记之利用反射访问或修改private成员

    对于类A.B,A是B的基类,A有一个私有成员name A.java public class A { private String name = "A"; public void ...

  2. Could not get unknown property 'packageForR' for task ':app:processDebugReso

    butterknife 注解框架的问题 删除项目中的有关butterknife 的 apply plgin.classpath 字段 把注解框架改为最新版本 implementation 'com.j ...

  3. Android 启动过程介绍【转】

    本文转载自:http://blog.csdn.net/yangwen123/article/details/8023654 一般开机过程大致可以分为三个大阶段: 1. OS级别,由bootloader ...

  4. sdut oj 1163 C语言实验——排列 (当初不会递归生成排列,这个题目现在才补上 刘汝佳给出了写法 *【模板】 当然有生成全排列的函数存在 )

    C语言实验——排列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 有4个互不相同的数字,请按序输出由其中三个不重复数字组成的排列 ...

  5. Codeforces Round #379 (Div. 2) D. Anton and Chess —— 基础题

    题目链接:http://codeforces.com/contest/734/problem/D D. Anton and Chess time limit per test 4 seconds me ...

  6. python生成图片

    # -*- coding:utf-8 -*- from pylab import * figure(1,figsize=(6,6)) ax = axes([0.1,0.1,0.8,0.8]) frac ...

  7. slim.flatten——将输入扁平化但保留batch_size,假设第一维是batch

    slim.flatten(inputs,outputs_collections=None,scope=None) (注:import tensorflow.contrib.slim as slim) ...

  8. elasticsearch function_score Query——文档排序结果的最后一道墙

    function_score Query The function_score query is the ultimate tool for taking control of the scoring ...

  9. Yii2.0 自动生成 model 层

    yii2.0 里一个表对应一个model,可以自动生成 前台使用的model在frontend(backend)/web目录下的gii生成例如(www.liqiuyue.com/yii /fronte ...

  10. BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量

    BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路 ...