MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】

  1. MySQL学习笔记01【数据库概念、MySQL安装与使用】
  2. MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】
  3. MySQL学习笔记03【数据库表的CRUD操作、数据库表中记录的基本操作、客户端图形化界面工具SQLyog】

  4.  

目录

数据库 终端 操作 报错

07 数据库的查询操作

DQL_基础查询

去除重复结果集

计算分数之和

起别名

DQL_条件查询

DQL_基础查询_模糊查询

今日内容

DQL_排序查询

DQL_聚合函数

DQL_分组查询

DQL_分页查询

08 表的约束

约束_概述

约束_非空约束

约束_唯一约束

约束_主键约束

约束_主键约束_自动增长

约束_外键约束

外键约束——缺陷举例

外键约束 相关概念

约束_外键约束_级联操作

级联更新

级联删除


数据库 终端 操作 报错

报错的命令:ERROR 1366 (HY000): Incorrect string value: '\xC3\xFB\xD7\xD6' for column 'n

解决方法(原文链接):https://blog.csdn.net/u013317172/article/details/82778785

很多人在安装完Mysql数据库,往表里面插入中文数据的时候就会出现这个错误。
ERROR 1366 (HY000): Incorrect string value: ‘\xD5\xC5\xD0\xA1\xC3\xF7’ for column ‘NAME’ at row 1
在这里插入图片描述

解决方案:

1.先找到Mysql数据库安装路径,如下图:

在这里插入图片描述

2.找到这个文件夹里面的 my.ini 文件,在里面找到 “default-character-set=utf8”,把uft8修改成gbk。

在这里插入图片描述

重新登陆到mysql数据库就可以添加中文数据了。

07 数据库的查询操作

DQL_基础查询

1. 多个字段的查询

  • select 字段名1,字段名2... from 表名;
  • 注意:如果查询所有字段,则可以使用*来替代字段列表。

2. 去除重复:

  • distinct

3. 计算列

  • 一般可以使用四则运算计算一些列的值(一般只会进行数值型的计算)。
  • ifnull(表达式1,表达式2):null参与的运算,计算结果都为null。
    • 表达式1:哪个字段需要判断是否为null
    • 如果该字段为null后的替换值。

4. 起别名:

  • as:as可以省略。
CREATE TABLE student (
  id INT,
  -- 编号
  NAME VARCHAR (20),
  -- 姓名
  age INT,
  -- 年龄
  sex VARCHAR (5),
  -- 性别
  address VARCHAR (100),
  -- 地址
  math INT,
  -- 数学
  english INT-- 英语
) ;

INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES 
(1,'马云',55,'男','杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);

SELECT * FROM student;

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第1张图片   MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第2张图片

去除重复结果集

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第3张图片

计算分数之和

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第4张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第5张图片

起别名

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第6张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第7张图片

DQL_条件查询

1. where子句后跟条件

2. 运算符

  • > 、< 、<= 、>= 、= 、<>
  • BETWEEN...AND  
  • IN( 集合) 
  • LIKE:模糊查询
    • 占位符:
      • _:单个任意字符
      • %:多个任意字符
  • IS NULL  
  • and  或 &&
  • or  或 || 
  • not  或 !
-- 查询年龄大于20岁
SELECT 
  * 
FROM
  student 
WHERE age > 20 ;
SELECT * FROM student WHERE age >= 20;

-- 查询年龄等于20岁
SELECT * FROM student WHERE age = 20;

-- 查询年龄不等于20岁
SELECT * FROM student WHERE age != 20;
SELECT * FROM student WHERE age <> 20;

-- 查询年龄大于等于20 小于等于30
SELECT * FROM student WHERE age >= 20 &&  age <=30;
SELECT * FROM student WHERE age >= 20 AND  age <=30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30; -- 闭区间[20, 30]

-- 查询年龄22岁,18岁,25岁的信息
SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25
SELECT * FROM student WHERE age IN (22,18,25);

-- 查询英语成绩为null
SELECT * FROM student WHERE english = NULL; -- 错误!null值不能使用 = (!=) 判断

SELECT * FROM student WHERE english IS NULL;

-- 查询英语成绩不为null
SELECT * FROM student WHERE english  IS NOT NULL;

DQL_基础查询_模糊查询

LIKE:模糊查询

  • 占位符:
    • _:单个任意字符
    • %:多个任意字符
-- 查询姓马的有哪些? like
SELECT 
  * 
FROM
  student 
WHERE NAME LIKE '马%' ;

-- 查询姓名第二个字是化的人
SELECT * FROM student WHERE NAME LIKE "_化%";

-- 查询姓名是3个字的人
SELECT * FROM student WHERE NAME LIKE '___';

-- 查询姓名中包含德的人
SELECT * FROM student WHERE NAME LIKE '%德%';

今日内容

  1. DQL:查询语句
    1. 排序查询
    2. 聚合函数
    3. 分组查询
    4. 分页查询
  2. 约束
  3. 多表之间的关系
  4. 范式
  5. 数据库的备份和还原

DQL_排序查询

1. 排序查询

  • 语法:order by 子句
    • order by 排序字段1 排序方式1 ,  排序字段2 排序方式2...
  • 排序方式:
    • ASC:升序(默认)。
    • DESC:降序。
  • 注意:
    • 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第8张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第9张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第10张图片

DQL_聚合函数

2. 聚合函数:将一列数据作为一个整体,进行纵向的计算。

  1. count:计算个数
    1. 一般选择非空的列:主键
    2. count(*)
  2. max:计算最大值
  3. min:计算最小值
  4. sum:计算和
  5. avg:计算平均值

注意:聚合函数的计算,排除null值。

解决方案:1、选择不包含非空的列进行计算;2、IFNULL函数。

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第11张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第12张图片  MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第13张图片

DQL_分组查询

3. 分组查询:

  1. 语法:group by 分组字段;
  2. 注意:
    1. 分组之后查询的字段:分组字段、聚合函数
    2. where 和 having 的区别?
      1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
      2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
-- 按照性别分组。分别查询男、女同学的平均分
SELECT sex , AVG(math) FROM student GROUP BY sex;
		
-- 按照性别分组。分别查询男、女同学的平均分,人数
SELECT sex , AVG(math), COUNT(id) FROM student GROUP BY sex;
		
-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组
SELECT sex , AVG(math), COUNT(id) FROM student WHERE math > 70 GROUP BY sex;

-- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组,分组之后。人数要大于2个人
SELECT sex , AVG(math), COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
SELECT sex , AVG(math), COUNT(id) 人数 FROM student WHERE math > 70 GROUP BY sex HAVING 人数 > 2;

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第14张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第15张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第16张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第17张图片

DQL_分页查询

4. 分页查询

  1. 语法:limit 开始的索引,每页查询的条数;
  2. 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
    1. 每页显示3条记录 
    2. SELECT * FROM student LIMIT 0,3; -- 第1页:从0开始查,查3条记录
    3. SELECT * FROM student LIMIT 3,3; -- 第2页:从3开始查,查3条记录
    4. SELECT * FROM student LIMIT 6,3; -- 第3页:
  3. limit 是一个MySQL"方言"

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第18张图片

08 表的约束

约束_概述

概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。    

分类:

  1. 主键约束:primary key
  2. 非空约束:not null
  3. 唯一约束:unique
  4. 外键约束:foreign key

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第19张图片

约束_非空约束

非空约束:not null,值不能为nul

    1. 创建表时,添加约束
        CREATE TABLE stu(
            id INT,
            NAME VARCHAR(20) NOT NULL -- name为非空
        );
    2. 创建表后,再添加非空约束:ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

    3. 删除name的非空约束:ALTER TABLE stu MODIFY NAME VARCHAR(20);

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第20张图片  MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第21张图片

约束_唯一约束

唯一约束:unique,值不能重复。

    1. 创建表时,添加唯一约束
        CREATE TABLE stu(
            id INT,
            phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束
        );
        * 注意mysql中,唯一约束限定的列的值可以有多个null。

    2. 删除唯一约束:ALTER TABLE stu DROP INDEX phone_number;

    3. 在创建表后,添加唯一约束:ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第22张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第23张图片

约束_主键约束

主键约束:primary key

    1. 注意:
        1. 含义:非空且唯一
        2. 一张表只能有一个字段为主键
        3. 主键就是表中记录的唯一标识

    2. 在创建表时,添加主键约束
        create table stu(
            id int primary key,-- 给id添加主键约束
            name varchar(20)
        );

    3. 删除主键
        -- 错误 alter table stu modify id int ;
        ALTER TABLE stu DROP PRIMARY KEY;

    4. 创建完表后,添加主键
        ALTER TABLE stu MODIFY id INT PRIMARY KEY;

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第24张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第25张图片

约束_主键约束_自动增长

    5. 自动增长:
        1. 概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长

        2. 在创建表时,添加主键约束,并且完成主键自增长
        create table stu(
            id int primary key auto_increment,-- 给id添加主键约束
            name varchar(20)
        );

        3. 删除自动增长:ALTER TABLE stu MODIFY id INT;

        4. 添加自动增长:ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第26张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第27张图片

约束_外键约束

外键约束——缺陷举例

CREATE TABLE emp ( -- 创建employe表
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(30),
	age INT,
	dep_name VARCHAR(30), -- 部门名称
	dep_location VARCHAR(30) -- 部门地址
);

-- 添加数据
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '销售部', '深圳');

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第28张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第29张图片

-- 解决方案:分成 2 张表

-- 创建部门表(id,dep_name,dep_location)
-- 一方,主表
CREATE TABLE department(
	id INT PRIMARY KEY AUTO_INCREMENT,
	dep_name VARCHAR(20),
	dep_location VARCHAR(20)
);

-- 创建员工表(id,name,age,dep_id)
-- 多方,从表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT,
	dep_id INT -- 外键对应主表的主键
);

-- 添加 2 个部门
INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳');
SELECT * FROM department;

-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);

SELECT * FROM employee;
SELECT * FROM department;

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第30张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第31张图片

外键约束 相关概念

* 外键约束:foreign key,让表与表产生关系,从而保证数据的正确性。

    1. 在创建表时,可以添加外键
        * 语法:
            create table 表名(
                ....
                外键列
                constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
            );

    2. 删除外键
        ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

    3. 创建表之后,添加外键
        ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称); // 主键列、唯一约束列

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第32张图片

CREATE TABLE employee(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20),
    age INT,
    dep_id INT, -- 外键对应主表的主键
    CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) -- 外键约束
);

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第33张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第34张图片

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第35张图片 MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第36张图片

约束_外键约束_级联操作

4. 级联操作
    1. 添加级联操作
        语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 
                    FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE  ;
    2. 分类:
        1. 级联更新:ON UPDATE CASCADE 
        2. 级联删除:ON DELETE CASCADE 

级联更新

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第37张图片

级联删除

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第38张图片

开春,开的是什么?开视野、开心胸、开智慧、开格局!

立春,立的是什么?立仁、立义、立忠、立诚、立精神!

MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】_第39张图片

你可能感兴趣的:(MySQL,数据库,mysql,sql,查询,distinct)