【MySQL简单查询语句与约束】

1. 简单查询语句与约束

1.1. 本文

目录

1. 简单查询语句与约束

1.1. 本文内容介绍

1.2. DQL:查询表中的记录(掌握)

1.2.1. 基本语法

1.2.2. 简单查询语句

1.2.3. 条件查询

1.2.4. 排序查询

1.2.5. 聚合函数

1.2.6. 分组查询

1.2.7. 分页查询

1.3. 约束(理解约束的作用)

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

1.3.2. 非空约束:not null,某一列的值不能为null

1.3.3. 唯一约束:unique,某一列的值不能重复

1.3.4. 主键约束:primary key。

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


内容介绍

1.2. DQL:查询表中的记录(掌握)

* select * from 表名;

1.2.1. 基本语法

select
    字段列表
from
    表名列表
where
    条件列表
group by
    分组字段
having
    分组之后的条件
order by
    排序
limit
    分页限定

1.2.2. 简单查询语句

  1. 多个字段的查询

     select 字段名1,字段名2... from 表名;
    

    注意: 如果查询所有字段,则可以使用*来替代字段列表。

  2. 去除重复:distinct

    注意:只有当查询的所有字段的值都相同,才会认为是重复数据

  3. 计算列

    一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)

    ifnull(表达式1,表达式2):null参与的运算,计算结果都为null

    • 表达式1:哪个字段需要判断是否为null
    • 如果该字段为null后的替换值。
  4. 起别名: as

    • 注意: as也可以省略
  5. 示例:

     -- 查询表中的数据
     SELECT * FROM student ;
    
     -- 按需查询  
     -- 查询学生的姓名 及数学分数
     SELECT    NAME ,math FROM student ;
    
     -- 查询学生的姓名 及数学分数 总分
     SELECT DISTINCT `name` AS 姓名  ,math AS  数学,math+ IFNULL(english,0) AS 总分  FROM student;
    

1.2.3. 条件查询

什么是条件查询?

where子句后跟条件,对查询的结果进行筛选

条件运算符

运算类型 运算符 说明
比较运算 > 、< 、<= 、>= 、= 、<> 例如: age>18 , <>表示不等,在mysql5.x版本可以使用!=
范围运算 BETWEEN 值1 AND 值2 例如: BETWEEN a AND b ,值在a和b之间,含头含尾
集合运算 IN( 集合) 例如: in (1,2,3) ,值在集合之中
模糊运算 LIKE _或者% _:单个任意字符 
%:多个任意字符
空值运算 IS NULL 
IS NOT NULL
字段值为NULL 
字段值不为NULL
逻辑运算 and && 
or ιι 
not !
与 
或 

数据准备

-- 数据准备

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` varchar(5) DEFAULT NULL,
  `address` varchar(100) DEFAULT NULL,
  `math` int(11) DEFAULT NULL,
  `english` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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);

示例代码

-- 查询年龄大于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;

-- 查询年龄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;

-- 查询姓马的学生有哪些? 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.2.4. 排序查询

语法:order by 子句

order by 排序字段1 排序方式1 ,  排序字段2 排序方式2...

排序方式

ASC:升序,默认的。
DESC:降序。

注意:

* 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
* 对含有null值的列进行排序,null永远最小

示例代码:

-- 查询学员信息,按照数学成绩升序排序  如果数学成绩相同按照英语成绩降序
SELECT * FROM student ORDER BY math ASC ,english DESC  ;

-- 查询学生信息,按照英语升序排序
SELECT * FROM student ORDER BY english DESC ; -- 在mysql排序中null值最小

1.2.5. 聚合函数

将一列数据作为一个整体,进行纵向的计算。

1. count:计算个数
    * 一般选择非空的列:主键  `count(id)`
    * count(*)
    * count(1)

2. max:计算最大值

3. min:计算最小值

4. sum:计算和

5. avg:计算平均值

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

1. 选择不包含非空的列进行计算
2. IFNULL函数

示例代码

-- 计算学生的个数
SELECT COUNT(id) FROM student;

SELECT COUNT(english) FROM student;

SELECT COUNT(*) FROM student;

SELECT COUNT(1) FROM student;

-- 计算所有学生的数学平均成绩
SELECT AVG(math) FROM student ;
-- 计算所有学生的数学最高分
SELECT MAX(math) FROM student ;
-- 计算所有学生的数学最低分
SELECT MIN(math) FROM student ;

-- 计算所有学生数学成绩的总和 和英语成绩的总和
SELECT SUM(math) AS 数学成绩 ,SUM(english) 英语成绩 FROM student ;

-- 计算所有学生数学成绩和英语成绩的总和
SELECT SUM(math)+ SUM(english) 成绩总和 FROM student ;

SELECT SUM(math+IFNULL(english,0)) FROM student ;

1.2.6. 分组查询

语法:group by 分组字段

注意:

1. 分组之后查询的字段:分组字段、聚合函数
2. where 和 having 的区别?
    * where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
    * 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;

1.2.7. 分页查询

语法:limit start,size; -- start开始索引,从0 开始算 size 每页显示的条数

公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数

-- 每页显示3条记录

SELECT * FROM student LIMIT 0,3; -- 第1页

SELECT * FROM student LIMIT 3,3; -- 第2页

SELECT * FROM student LIMIT 6,3; -- 第3页

注意: limit 是一个MySQL"方言",只有Mysql数据库有limit.

1.3. 约束(理解约束的作用)

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

约束分为以下四种:

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

1.3.2. 非空约束:not null,某一列的值不能为null

添加非空约束

-- 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);

1.3.3. 唯一约束:unique,某一列的值不能重复

添加唯一约束

-- 在创建表时,添加唯一约束
CREATE TABLE stu(
    id INT,
    phone_number VARCHAR(20) UNIQUE -- 手机号
);

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

删除唯一约束

-- 删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;

注意:

在sql标准中规定唯一约束可以有NULL值,但是只能有一条记录为null ,但是各个数据库厂商对sql标准的实现是有区别的

例如: MYSQL 和 ORACLE 数据库, 唯一约束可以有多个NULL值, SQLSERVER数据库唯一约束就只能有一个NULL值

1.3.4. 主键约束:primary key。

添加主键约束

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

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

删除主键约束

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

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

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

-- 删除自动增长
ALTER TABLE stu MODIFY id INT;

-- 添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

注意:

1. 含义:非空且唯一
2. 一张表主键只能有一个,但是主键字段可以有多个,一个主键多个主键字段的情况我们称为`复合主键`
3. 主键就是表中记录的唯一标识

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

在创建表时,可以添加外键

create table 表名(
    ....
    外键列
    constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);

删除外键

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

创建表之后,添加外键

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

示例代码

-- 准备数据
-- 创建部门表(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, -- 外键对应主表的主键
-- 创建外键约束
constraint emp_depid_fk foreign key (dep_id) references department(id)
)
-- 添加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);


-- 删除外键约束
alter table employee drop foreign key emp_depid_fk;

-- 表创建成功之后添加外键
alter table employee add constraint emp_depid_fk foreign key (dep_id) references department(id);

4. 级联操作(了解)

-- 1. 添加级联操作
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE  ;

分类:
    * 级联更新:ON UPDATE CASCADE
    * 级联删除:ON DELETE CASCADE

示例代码:

-- 表创建成功之后添加外键 添加级联操作
alter table employee add constraint emp_depid_fk foreign key (dep_id) references department(id) ON UPDATE CASCADE ON DELETE CASCADE ;

猜你喜欢

转载自blog.csdn.net/L531003231/article/details/82503540
今日推荐