MySQL数据库管理:全面指南_管理mysql-程序员宅基地

技术标签: mysql  数据库  sql  

当谈到MySQL时,我们常常会陷入深奥的技术细节和复杂的数据库操作中。但是,让我们今天换个角度来看待MySQL,就像和一位悠闲的老朋友聊天一样——轻松、愉快而充满乐趣。

MySQL,这个被称为“世界上最受欢迎的开源数据库”的名字,也许在你的生活中扮演着比你想象的更重要的角色。无论是作为网站的后台支持,还是作为应用程序数据的存储引擎,MySQL都以其稳定性和灵活性,默默地赋予着各种系统以生命力。

在MySQL的世界里,数据是如此地流动,就像一条清澈的小溪。我们可以轻松地在其中觅食,捕捉到所需的信息。就像魔术师一样,我们可以通过SQL语句的变化,让数据发生奇妙的变化,创造出无穷无尽的可能性。

所以,让我们一起放松心情,探索MySQL的世界,享受那份轻松愉快的感觉吧!

1·SQL的概述 

structure query language (结构话查询语言)简称为SQL,他被美国国家彼岸准据ANSI确定为关系型数据库的美国彼岸准,后背股计划标准组织(IOS)才乃位欢喜型数据库语言的国际化标准,数据库管理系统可以通过SQL管理数据库,定义和操作数据,维护数据的完成性格和安全性

2·SQL的优点

·简单易学,具有很浅耽搁喝操作性

·绝大多数的数据库管理系统均支持SQL

·高度费过程化;用SQL操作数据库时大部分的工作有DBMS自动完成

3·SQL的分类

·DDL  数据定义语言,用来操作数据库,列,表,等;常用语言;Create ML、alter、drop

·DML   数据操作语言,用来操作数据库中的表里的数据,常用语句;insert、update、delete

·SQLL   数据库岔村语言,用来查询数据,常用语句、select

  • 数据库的三大范式

1·第一范式,是指数据库表的每一列都是不可分割的基本数据线,也就是说,每列的值具有原子性,不可再分隔

2·第二范式,是在第一范式的基础伤害建立起来的,满足杜尔范式必须先满足第一范式,如果是单主键,那么主键以外的列必须完全依赖于主键;如果表示复合主键,那么主键以外的列必须完全依赖于主键

3·第三范式,是在第二范式的基础伤害建立起来的,即满足第三范式必须先满足第二范式,第三范式要求,表中的非主键列和主键直接相关而不能间接相关,也就是说,非主键列之间不能相关依赖

  • 数据库的数据类型

使用MySQL数据库存数数据是,不同的数据类型决定了MySQL存储数防水的不同,为此,MySQL数据库提供了多重数据类型,其中包括证书类型,浮点数类型,定点数类型,日期和时间类型,自字符串类型,二进制类型.....等多重数据类型

1·根据数值取值范围的不同MySQL中的证书类型可分为以下五种,分别是TINYINT,SMALUNT,MEDIUMINT,INT,BIGINT,下图列举了MySQL不同整数类型所对应的字节大小和取值范围而最常用的为INT类型的

数据类型   字节数   无符号数的取值范围   有符号数的取值范围

TINYINT   1   0~255   -128~127

SMALLINT   2   0~65535   -32768~32768

MEDIUMINT  3   0~16777215   -8388608~8388608

INT   4   0~4294967295 -2147483648~ 2147483648

BIGINT   8   0~18446744073709551615   -  9223372036854775808~9223372036854775808

2·浮点数类型和定点数类型

在MySQL数据库中使用浮点数和定点数来存储小数,浮点数的类型有两种,单精度浮点数类型(FLOAT)和双精度浮点数类型(DOUBLE),而定点数类型只有一种即为DECIMAL类型,下图列举了MySQL中浮点数哥定点数类型所对应的字节大小及取值范围

从上图中可以看出:DECIMAL类型的取值范围与DOUBLE类型相同。但是,请注意:DECIMAL类型的有效取值范围是由M和D决定的。其中,M表示的是数据的长 度,D表示的是小数点后的长度。比如,将数据类型为DECIMAL(6,2)的数据6.5243 插入数据库后显示的结果为6.52

3·字符串类型

在MySQL中常用CHAR和VARCHAR表示字符串,两者不同的是,VARCHAR存储可变长度的字符串

当数据为CHAR类型是,不管插入值的长度是多少,实际是多少,他所占用的存储空间都是M个字节,而VARCHAR所对应的数据所占用的字节数为实际长度加1

4·字符串类型

文本类型用于表示大文本数据,例如,文章内容,评论,详情等,他的类型分为如下4种

5·时间与日期类型

MySQL提供的表示日期和是假的呢数据类型分别是,YEAR,DATE,TIME,DATETIME,TIMESTAMP,下图列举了日期和时间类型所对应的字节数,取值范围,日期格式以及零值

5.1 YEAR类型

YEAR类型用于表示年份,在MySQL中,可以使用以下三种格式指定YEAR类型 的值。

1、使用4位字符串或数字表示,范围为’1901’—'2155’或1901—2155。例如,输入 ‘2019’或2019插入到数据库中的值均为2019。

2、使用两位字符串表示,范围为’00’—‘99’。其中,‘00’—'69’范围的值会被转换为 2000—2069范围的YEAR值,‘70’—'99’范围的值会被转换为1970—1999范围的YEAR 值。例如,输入’19’插入到数据库中的值为2019。

3、使用两位数字表示,范围为1—99。其中,1—69范围的值会被转换为2001— 2069范围的YEAR值,70—99范围的值会被转换为1970—1999范围的YEAR值。例 如,输入19插入到数据库中的值为2019。

请注意:当使用YEAR类型时,一定要区分’0’和0。因为字符串格式的’0’表示的YEAR值是2000而数字格式的0表示的YEAR值是0000。

5.2 TIME类型

TIME类型用于表示时间值,它的显示形式一般为HH:MM:SS,其中,HH表示小时, MM表示分,SS表示秒。在MySQL中,可以使用以下3种格式指定TIME类型的值。

1、以’D HH:MM:SS’字符串格式表示。其中,D表示日可取0—34之间的值, 插入数据时,小时的值等于(DX24+HH)。例如,输入’2 11:30:50’插入数据库中的日期为59:30:50。

2、以’HHMMSS’字符串格式或者HHMMSS数字格式表示。 例如,输入’115454’或115454,插入数据库中的日期为11:54:54

3、使用CURRENT_TIME或NOW()输入当前系统时间。

5.3 DATETIME类型

DATETIME类型用于表示日期和时间,它的显示形式为’YYYY-MM-DD HH: MM:SS’,其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分,SS 表示秒。在MySQL中,可以使用以下4种格式指定DATETIME类型的值。

以’YYYY-MM-DD HH:MM:SS’或者’YYYYMMDDHHMMSS’字符串格式表示的日期和时间,取值范围为’1000-01-01 00:00:00’—‘9999-12-3 23:59:59’。例如,输入’2019-01-22 09:01:23’或 ‘20140122_0_90123’插入数据库中的 DATETIME 值都为 2019-01-22 09:01:23。

1、以’YY-MM-DD HH:MM:SS’或者’YYMMDDHHMMSS’字符串格式表示的日期和时间,其中YY表示年,取值范围为’00’—‘99’。与DATE类型中的YY相同,‘00’— '69’范围的值会被转换为2000—2069范围的值,‘70’—'99’范围的值会被转换为1970—1999范围的值。

2、以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期 和时间。例如,插入20190122090123或者190122090123,插入数据库中的DATETIME值都 为 2019-01-22 09:01:23。

3、使用NOW来输入当前系统的日期和时间。

5.4 TIMESTAMP类型

TIMESTAMP类型用于表示日期和时间,它的显示形式与DATETIME相同但取值范围比DATETIME小。在此,介绍几种TIMESTAMP类型与DATATIME类型不同的形式:

1、使用CURRENT_TIMESTAMP输入系统当前日期和时间。

2、输入NULL时系统会输入系统当前日期和时间。

3、无任何输入时系统会输入系统当前日期和时间。

6·二进制类型

在MySQL中常用的BLOB存储二进制类型的数据,例如,图片,PDF文档等,BLOB类型分为如下四种

4·数据库,数据表的基本操作

MySQL安装完成后,要想将数据存储到数据库的表中,首先要创建一个数据库,创建数据库就是在数据库系统中划分一块空间存储数据,语法如下

create database 数据库名称;

创建一个叫做pengpeng的数据库

create database pengpeng;

创建数据库后查看该数据库基本信息的MySQL命令

show create database pengpeng;

删除数据库MySQL的命令

drop database pengpeng;

查询出MySQL中所有的数据库MySQL命令

show databases ;

将数据库的字符集修改为gbk MySQL命令 

alter database pengpeng character set gbk:

切换数据库的命令 

use msyql;

查看当前使用数据库的命令

select database():

1·数据库的表操作

数据库创建成功后可在该数据库中创建数据表,简称为表,请注意,在操作数据表之前应使用use数据库名指定就如到某个库中再进行相关操作,否则就是出现 No database selected 错误

语法如下:

create table 表名(

           字段1 字段类型,

           字段2  字段类型,

           字段N   字段类型

 );

1-1·创建数据表 

实例:创建学生表MySQL命令 

create table student(

 id int,

 name varchar(20),

 gender varchar(10),

 birthday date

 );

1-2查看数据表

示例·查看当前数据中所有表MySQL命令

show tables;

运行示例效果

示例,查看表的基本信息MySQL命令;

show create table mysql;

示例,查看表的字段信息

desc mysql.user;

1-3.修改数据表

有时,希望对表中的某些信息进行修改,例如,修改表名,修改字段名,修改字段,修改数据类型等等,在MySQL中使用alter table修改数据表;

修改表名

alter table student rename to my;

修改字段名称

alter table my change name sname varchar(10);

修改字段数据类型 

alter table my modify sname int;

增加字段名称

alter table my add address varchar(50);

删除字段名称

alter table my drop address;

1-4,删除数据表

drop table 表名;

示例,删除mysql表

drop table mysql;

2·数据表的约束 

为防止错误的数据被插入到数据表 ,MySQL中定义了一些维护数据库完成性的规则,这些规则常称为表的约束,常见约束如下;

1·主键约束

主键约束即primary key用于唯一的标识表中的每一行,被标识为逐渐的数据在表中是唯一的且其值不能为空,这点类似于我们每个人都有一个身份证号,并且这个身份证号是唯一的

主键约束基本语法;

字段名 数据类型 primary key ;

设置主键约束(primary key)的第二种方式

示例:MySQL命令

create table student01(

id int

name varchar(20)

primary key(id)

);

2·非空约束

非空约束即not null 值得是字段的值不能为空,基本的语法格式如下所示,

字段名 数据类型 not null;

示例,MySQL命令;

create table student02(

id int 

name varchar(20)not null

);

3·默认值约束

默认值约束即default用于给数据表中的字段指定默认值,即当在表中插入一条新纪录弱未给该字段赋值,那么,数据库系统会自动为这个字段插入默认值,其基本的语法格式如下所示;

字段名 数据类型 default 默认值;

示例 

create table student 03(

id int ,

name varchar(20),

gender varchar(10) default ‘male’

);

4·唯一性约束

唯一性约束即UNIQUE用于保证数据表中字段的唯一性,即表中字段的值不能重复出现,用基本的语法格式如下

字段名 数据类型 UNIQUE;

create table student04(

id int ,

name varchar(20) unique

);

5·外键约束

外键约束即FOREIGN KEY常用于多张表之间的约束,基本语法如下;

-- 在创建数据表时语法如下:

CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)

-- 将创建数据表创号后语法如下:

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

示例,创建一个学生表

create table student05(

id int primary key,

name varchar(20)

);

示例,创建一个班级表

create table class(

classid int primary key,

studentid int

);

示例,学生表为主表,班级表为附表,设置外键

alter table class add constraint fk_class_studentid foreign key(studentid) references student05(id);

6·1 数据一致性概念

大家知道,建立外键是为了保证数据的完整和统一性,但是,如果主表中的数据被删除或修改从表中对应的数据该怎么办呢,很明显,从表中对应的数据也应该被删除,否则数据库中会存在很多无意义的垃圾数据

6·2 删除外键

alter table 从表名 drop foreign key 外键名;

示例,删除外键

alter table class drop foreign key fk_class_studentid;

6-3 关于外键约束需要注意的细节

1·从表里的外键通常为主表的主键

2·从表发生变化时应注意主表从表的数据一致性问题

3·主表发生变化时应注意主表从表的数据一致性问题

5·数据表插入数据

在MySQL通过insert语句像数据表中插入数据,因此,我们准备一张学生表,

 create table student(

 id int,

 name varchar(30),

 age int,

 gender varchar(30)

 );

1·为表中所有字段插入数据

每个字段与其值是严格一一对应的,也就是说,每个值,值的顺序,值的类型,必须与对应的字段相匹配。但是,各字段也无需与其在表中定义的顺序一致,他们只要与VALUES中的值的顺序一致即可

INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);

向学生表中插入一条学生命令 

insert into student (id,name,age,gender) values (1,'bob',16,'male');

2·为表中指定字段插入数据

INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);

插入数据的方法基本和为表中所有字段插入数据一样,只是需要插入的字段由你自己指定

3·同时插入多条记录

INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;

在该方式中(字段一 字段二...)是可选的,它用于指定插入的字段名;(值1,值2),(值1,值2)表是要插入的记录,该记录可有多条并且每条记录之间都用逗号隔开

示例,向学生表中插入多条学生信息

insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male');

6·更新数据 

在MySQL通过update语句更新数据表中的数据,在此,我们将就用学生表

1·update基本语法

update 表名 set 字段名1=值1[字段名2=值2,[where 条件表达式];

在该语法中,字段1,字段2,用于指定要更新的字段名称,值1,值2,用于表示字段的新数据;where条件表达式是可选的,它用于指定更新数据需要满足的条件

2·update更新部分数据

实例;将name为tom的记录的age设置为20,并将gender设置为female MySQL命令

update student set age=20,gender=‘female’ where name=‘tom’;

3·update更新全部数据

实例:将所有记录的age设置为18 MySQL命令;

update student set age=18;

7·删除数据

在MySQL通过delete语句删除数据表中的数据,在此,我们准备一张数据表

- 创建学生表

 create table student(

 id int,

 name varchar(30),

 age int,

 gender varchar(30)

 );

 -- 插入数据

 insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male'),(5,'sal',19,'female'),(6,'sun',20,'male')

,(7,'sad',13,'female'),(8,'sam',14,'male');

  1. delete基本语法

在改语法中,表名用于指定要执行删除操作的表,where条件表达式为可选参数用于指定删除的条件

delete from 表名 [where 条件表达式];

  1. delete删除部分数据

示例:删除age等于14的所有记录MySQL命令:

delete from student where age=14;

  1. delete删除全部数据

示例:删除student表中的所有记录MySQL命令

delete from student;

  1. truncate和delete的区别

truncate和delete都能实现删除表中的所有数据的功能,但两者也是有区别的

1·delete语句后可跟where子句,可通过where子句中的条件表达式只删除满足条件的部分记录,但是,truncate语句只能用于删除表中的所有记录

2·使用truncate语句删除表中的数据后,再次向表中添加剂李时自动增加字段的默认初始值重新由1开始,使用delete语句删除表中所有记录后,再次向表中添加记录时自动增加字段的值为删除时由该字段的最大值+1

3·delete语句是DML语句,truncate语句通常被认为是DDL语句

8·MySQL数据表简单查询

简单穿及不含where的select语句,再次,我们讲解简单查询中最常用的两种查询,查询所有字段和查询指定字段

在此,我们准备测试数据:

-- 创建数据库

DROP DATABASE IF EXISTS mydb;

CREATE DATABASE mydb;

USE mydb;

-- 创建student表

CREATE TABLE student (

    sid CHAR(6),

    sname VARCHAR(50),

    age INT,

    gender VARCHAR(50) DEFAULT 'male'

);

-- 向student表插入数据

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');

1、查询所有字段

查询所有字段MySQL命令

select * from student;

2、查询指定字段 

查询指定字段,sid,name,MySQL命令

select sid,name from stude;

3、常用的查询

在select中除了书写列名,还可以书写常数,可以用于标记

常数的查询日期标记MySQL命令

select sid,sname,'2021-03-02' from student;

4、从查询结果中过滤重复数据

在使用distinct时需要注意

在select查询语句中distinct关键字只能用在第一个所查列名之前

select distinct gender from student;

5、算术运算符(举例加运算符)

在select查询语句中还可以使用加减乘除运算符

查询学生10年后的年龄

select sname,age+10 from student;

9·函数

在此,我们先准备测试数据

-- 创建数据库

DROP DATABASE IF EXISTS mydb;

CREATE DATABASE mydb;

USE mydb;

-- 创建student表

CREATE TABLE student (

    sid CHAR(6),

    sname VARCHAR(50),

    age INT,

    gender VARCHAR(50) DEFAULT 'male'

);

-- 向student表插入数据

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');

1、聚合函数

在开发中,我们常常有类似的需求,统计某个字段的最大值,最小值,平均值等等,为此,MySQL中提供了聚合函数来实现这些功能,所谓聚合,就是将多行汇总成一行,其实,所有的聚合函数均如此,输入多行,输出一行,聚合函数具有自动滤空的功能,若某一个值为null,那么会自动将其过滤使其不参与运算

聚合函数使用规则

只有select子句和having子句,order by子句能够使用聚合函数,例如,在where字居中使用聚合函数是错误的

接下来我们来学习常用的聚合函数 

1-1 count ()

统计表中数据的行数或者统计指定列其值不为null的数据个数

查询有多少该表中有多少人

select count(*) from student;

1-2 max()

计算指定列的最大值,如果指定列是字符串类型则使用字符串排序运算

查询该学生表中年纪最大的学生 

select  max(age) from student;

1-3  min()

计算指定列的最小值,如果指定列是字符串类型则使用字符串排序运算

select sname,min(age) from student;

1-4 sum()

计算指定列的数值和,如果指定列类型不知数值类型则计算结果为0

select sum(age) from student;

1-5 avg()

计算指定列的平均值,如果指定列类型不是数值类型则计算结果为

select avg(age) from student;

****其他常用函数,混个眼熟即可,以后用到再说

2-1  时间函数

SELECT NOW();

SELECT DAY (NOW());

SELECT DATE (NOW());

SELECT TIME (NOW());

SELECT YEAR (NOW());

SELECT MONTH (NOW());

SELECT CURRENT_DATE();

SELECT CURRENT_TIME();

SELECT CURRENT_TIMESTAMP();

SELECT ADDTIME('14:23:12','01:02:01');

SELECT DATE_ADD(NOW(),INTERVAL 1 DAY);

SELECT DATE_ADD(NOW(),INTERVAL 1 MONTH);

SELECT DATE_SUB(NOW(),INTERVAL 1 DAY);

SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH);

SELECT DATEDIFF('2019-07-22','2019-05-05');

2-2 字符串函数

--连接函数

SELECT CONCAT ()

--

SELECT INSTR ();

--统计长度

SELECT LENGTH();

2-3 数学函数

-- 绝对值

SELECT ABS(-136);

-- 向下取整

SELECT FLOOR(3.14);

-- 向上取整

SELECT CEILING(3.14);

3-1  条件查询

数据库中存有大量数据,我们可以根据需求获取指定的数据,此时,我们可在查询语句中通过where子句指定查询条件度查询结果进行过滤

再开始学习条件查询之前,我们先准备测试数据,代码如下

-- 创建数据库

DROP DATABASE IF EXISTS mydb;

CREATE DATABASE mydb;

USE mydb;

-- 创建student表

CREATE TABLE student (

    sid CHAR(6),

    sname VARCHAR(50),

    age INT,

    gender VARCHAR(50) DEFAULT 'male'

);

-- 向student表插入数据

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1012', 'lili', 14, 'male');

INSERT INTO student (sid,sname,age,gender) VALUES ('S_1013', 'wang', 15, 'female');

4-1使用关系运算符查询

在where中可使用关系运算符进行条件查询,常用的关系运算符如下所示

查询年龄等于或大于17的学生的信息 

select * from student where age>=17

2·使用IN关键字查询

IN关键字用于判断某个字段的值是否在指定集合中,如果字段的值恰好在指定的集合中,则将字段所在的记录将查询出来

查询sid为S_1002和S_1003的学生信息 

select * from student where sid in (’S_1002,S_1003‘)

查询sid为S_1001以外的学生的信息

select * from student where sid not in (’S_1001‘)

3·使用BEYWEEN AND关键字查询

BETWEEN AND用于判断某个字段的值是否在指定的范围之内,如果字段的值再指定范围内,则将所在的记录查询出来

查询15到18的学生信息

select * from student where age between 15 and 18 ;

查询不是15到18的学生信息 

select * from student where age not between 15 and 18;

4·使用空值查询 

在MySQL中,使用IS NULL关键字判断字段的值是否为空值,请注意,空值NULL不同于0,也不同于空字符串

由于student 表没有控制就不演示查询空值的了

查询sname不为空值的学生信息

select * from student where sname is not null;

5·使用AND关键字查询

在MySQL中可使用AND关键字可以连接两个或者多个查询条件

查询年龄大于15且性别为male的学生信息

select * from student where age>15 and gender=’male‘;

6·使用OR关键字查询

在使用select语句查询数据时可使用OR关键字链接多个查询条件,在使用OR关键字时,只要记录满足其中任意一个条件就会被查询出来 

查询年纪大于15或者性别为male的学生信息

select * from student where age>15 or gender=’male‘;

7·使用like关键字查询 

MySQL中可使用like关键字可以判断两个字符串是否相匹配 

7-1 普通字符串 

查询sname中与wang匹配的学生信息 

select * from student where sname like ’wang‘;

7-2 含有%通配的字符串

%用于匹配任意长度的字符串,例如,字符串a%匹配以字符a开始任意长度的字符串

查询学生姓名以ll开始的记录

select * from student where sname like ’li%‘;

查询学生姓名以g结尾的记录

select * from student where sname like ’%g‘;

查询学生姓名包含s的记录

select * from student where sname like '%s%';

7-3  含有_通配的字符串 

下换线通配符只匹配单个字符,如果要匹配多个字符,需要联系使用多个下换线通配符,例如,字符串ab_匹配以字符串ab开始长度为3的字符串,如abc,abp等等,字符串a_d匹配在字符a和d之间包含两个自负的字符串。如abcd,atud等等

查询学生姓名以zx开头且长度为4的记录

select * from student where sname like 'zx__';

查询学生姓名以g结尾且长度为4的记录 

select * from student where sname like '___g';

8 · 使用LIMIT限制查询结果的数量 

在执行查询数据时可能会返回很多条记录,而用户需要的数据可能只是其中的一条或者几条

查询学生表中年级最小的三位同学

select * from student order by age asc limit 3;

9·使用GROUP BY进行分组查询 

GROUP BY子句可像切蛋糕一眼将表中的数据进行分组,再进行查询等操作,换言之,可通俗地理解为:通过GROUP BY将原来的表拆分成了几张小表

接下来,学习一下GROUP BY 

-- 创建数据库

DROP DATABASE IF EXISTS mydb;

CREATE DATABASE mydb;

USE mydb;

-- 创建员工表

CREATE TABLE employee (

    id int,

    name varchar(50),

    salary int,

    departmentnumber int

);

-- 向员工表中插入数据

INSERT INTO employee values(1,'tome',2000,1001); 

INSERT INTO employee values(2,'lucy',9000,1002); 

INSERT INTO employee values(3,'joke',5000,1003); 

INSERT INTO employee values(4,'wang',3000,1004); 

INSERT INTO employee values(5,'chen',3000,1001); 

INSERT INTO employee values(6,'yukt',7000,1002); 

INSERT INTO employee values(7,'rett',6000,1003); 

INSERT INTO employee values(8,'mujk',4000,1004); 

INSERT INTO employee values(9,'poik',3000,1001);

9-1 GROUP BY 和聚合函数一起使用 

统计各部门员工个数

select count(*), departmentnumber from employee group by departmentnumber;

统计部门编号大于1001的各部门员工个数

select count(*), departmentnumber from employee where departmentnumber>1001 group by departmentnumber;

9-2 GROUP BY 和聚合函数以及HAVING一起使用 

统计工资总和大于8000的部门

select sum(salary),departmentnumber from employee group by departmentnumber having sum(salary)>8000;

10·使用ORDER BY 对查询结果排序

从表中查询出来的数据可能是无序的或者其排列顺序不是我们期望的,因此,我们尅使用ORDER BY 对查询结果进行排序 

语法如下 

SELECT 字段名1,字段名2,…

FROM 表名

ORDER BY 字段名1 [ASC 丨 DESC],字段名2 [ASC | DESC];

在该语法中,字段1,字段2是查询结果排序的依据,参数ASC表是按照升序排序,DESC表示按照降序排序,默认情况下,按照ASC方式排序,通常情况下,ORDER BY 子句位于整个select语句的末尾

查询所有学生并按照年纪大小升序排列

select * from student order by age asc;

查询所有学生并按照年纪大小降序排列

select * from student order by age desc;

10· 别名设置

在查询数据时可为表和字段取别名,该别名代替表和字段的原名参与查询操作

操作的表要事先准备 

1·为表取别名

在查询操作时,假若表名很长使用起来就不太方便,此时可为表取一个别名,用该别名来代替表的名称,语法格式如下

SELECT * FROM 表名 [AS] 表的别名 WHERE .... ;

将student改为stu查询整表

select * from student as stu

1、在查询操作时,假若字段名很长,使用起来不太方便,此时可该字段取一个别名,用该别名来代替字段的名称

SELECT 字段名1 [AS] 别名1 , 字段名2 [AS] 别名2 , ... FROM 表名 WHERE ... ;

将student中的name取别名为姓名查询整表

select name as '姓名',id from student;

11· 表的关联关系

在实际开发的数据表之间存在各种关联关系,再次,介绍MySQL中数据表的三种关联关系

多对一

多对一也可以叫成一对多,是数据表中常见的一种关系,例如,员工与部门之间的关系,一个部门可以有多个员工,而一个员工不能属于多个部门只属于某个部门,在多对一的表关系中,应将外键建在多的一方,否则会造成数据的冗余

多对多

多对多是数据表中常见的一种关系,例如,学生与老师之间的关系,一个学生可以有多个老师而且一个老师有多个学生,通常情况下,为了实现这种关系需要定义一张中间表,简称为链接表,该表会存在两个外键分别参照老师表和学生表

一对一

在开发过程中,一对一的关联关系在数据库中并不常见,因为以这种方式存储的信息通常会放在同一张表中

接下来,我们来学习在一对多的关联关系中如果添加和删除数据,先准备一些测试数据

DROP TABLE IF EXISTS student;

DROP TABLE IF EXISTS class;

-- 创建班级表

CREATE TABLE class(

    cid int(4) NOT NULL PRIMARY KEY,

    cname varchar(30) 

);

-- 创建学生表

CREATE TABLE student(

    sid int(8) NOT NULL PRIMARY KEY,

    sname varchar(30),

    classid int(8) NOT NULL

);

-- 为学生表添加外键约束

ALTER TABLE student ADD CONSTRAINT fk_student_classid FOREIGN KEY(classid) REFERENCES class(cid);

-- 向班级表插入数据

INSERT INTO class(cid,cname)VALUES(1,'Java');

INSERT INTO class(cid,cname)VALUES(2,'Python');

-- 向学生表插入数据

INSERT INTO student(sid,sname,classid)VALUES(1,'tome',1);

INSERT INTO student(sid,sname,classid)VALUES(2,'lucy',1);

INSERT INTO student(sid,sname,classid)VALUES(3,'lili',2);

INSERT INTO student(sid,sname,classid)VALUES(4,'domi',2);

1、关联查询

查询Java班的所有学生

select * from student where classid=(select cid from class where cname='Java');

1、关于关联关系的删除数据

2、请从班级表中删除Java班级,在此,请注意,班级表和学生表之间存在关联关系,要删除Java班级,应该先删除学生表中与该班相关联的学生,否则,假若先删除Java班那么学生表中的cid就失去了关联

删除Java班

delete from student where classid=(select cid from class where cname='Java');

delete from class where cname='Java';

12· 多表连接查询

1、交叉连接查询

交叉连接返回的结果是被连接两个表中所有的数据航的笛卡尔积;比如:集合A={a,b},集合B={0,1,2},则集合A和B的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。所以,交叉连接也被称为笛卡尔连接

SELECT * FROM 表1 CROSS JOIN 表2;

 在该语法中:CROSS JOIN 用于连接两个要查询的表,通过该语句可以查询两个表中所有的数据组合

由于这个交叉连接查询在实际中运用没有任何意义,所以只作为了解即可

2、内连接查询

内连接又称为简单简洁或自然连接,是一种非常常见的链接查询,内连接使用比较运算符对两个表中的数据进行比较并列出与链接条件匹配的数据行,组成新的记录,也就是说再内连接查询中只有满足条件的记录才能出现在查询结果中

SELECT 查询字段1,查询字段2, ... FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段=表2.关系字段

在该语法中,INNER JOIN用于连接两个表,ON来指定连接条件,其中INNER可以省略

准备数据,代码如下

-- 若存在数据库mydb则删除

DROP DATABASE IF EXISTS mydb;

-- 创建数据库mydb

CREATE DATABASE mydb;

-- 选择数据库mydb

USE mydb;

-- 创建部门表

CREATE TABLE department(

  did int (4) NOT NULL PRIMARY KEY, 

  dname varchar(20)

);

-- 创建员工表

CREATE TABLE employee (

  eid int (4) NOT NULL PRIMARY KEY, 

  ename varchar (20), 

  eage int (2), 

  departmentid int (4) NOT NULL

);

-- 向部门表插入数据

INSERT INTO department VALUES(1001,'财务部');

INSERT INTO department VALUES(1002,'技术部');

INSERT INTO department VALUES(1003,'行政部');

INSERT INTO department VALUES(1004,'生活部');

-- 向员工表插入数据

INSERT INTO employee VALUES(1,'张三',19,1003);

INSERT INTO employee VALUES(2,'李四',18,1002);

INSERT INTO employee VALUES(3,'王五',20,1001);

INSERT INTO employee VALUES(4,'赵六',20,1004);

查询员工姓名及各所属部门名称 

select employee.ename,department.dname from department inner join employee on department.did=employee.departmentid;

  1. 外连接查询
  2. 在使用内连接查询时我们发现,返回的结果只包含符合查询条件和连接条件的数据,但是,有事还需要在返回查询结果中不仅包含符合条件的数据,而且还包括左表,右表或两个表中的所有数据,此时,我们就需要使用外连接查询,外连接又分为做外链接和右外连接,语法格式如下

SELECT 查询字段1,查询字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.关系字段=表2.关系字段 WHERE 条件

由此可见,外连接语法格式与内连接语法格式非常相似,只不过使用的是LEFT[OUTER]JOIN,RIGHT[OUTER]JOIN关键字,其中,关键字左边的表被称为左表,关键字右边的表本称为右表,OUTER可以省略

在使用左外连接和右外连接查询时,查询结果是不一致的

1、LEFT [OUTER] JOIN 左(外)连接:返回包括左表中的所有记录和右表中符合连接条件的记录。

2、RIGHT [OUTER] JOIN 右(外)连接:返回包括右表中的所有记录和左表中符合连接条件的记录。

先准备数据

-- 若存在数据库mydb则删除

DROP DATABASE IF EXISTS mydb;

-- 创建数据库mydb

CREATE DATABASE mydb;

-- 选择数据库mydb

USE mydb;

-- 创建班级表

CREATE TABLE class(

  cid int (4) NOT NULL PRIMARY KEY, 

  cname varchar(20)

);

-- 创建学生表

CREATE TABLE student (

  sid int (4) NOT NULL PRIMARY KEY, 

  sname varchar (20), 

  sage int (2), 

  classid int (4) NOT NULL

);

-- 向班级表插入数据

INSERT INTO class VALUES(1001,'Java');

INSERT INTO class VALUES(1002,'C++');

INSERT INTO class VALUES(1003,'Python');

INSERT INTO class VALUES(1004,'PHP');

-- 向学生表插入数据

INSERT INTO student VALUES(1,'张三',20,1001);

INSERT INTO student VALUES(2,'李四',21,1002);

INSERT INTO student VALUES(3,'王五',24,1002);

INSERT INTO student VALUES(4,'赵六',23,1003);

INSERT INTO student VALUES(5,'Jack',22,1009);

准备这组数据有一定的特点,为的是大家直观的看出左连接与右链接的不同之处

1·班级编号为1004的PHP班级没有学生

2·学号为5的学生JACK班级编号为1009,该班级编号并不在班级表中

3.1 左外连接查询

左外连接 的结果包括LEFT JOIN字句中制动的左表的所有记录,以及所有满足连接条件的记录,如果左表的某条记录在右表中不存在则在右表中显示为空

查询每个班的班级ID、班级名称及该班的所有学生的名字

select class.cid,class.cname,student.sname from class left outer join student on class.cid=student.classid;

3-2 右外连接查询

右外连接的结果包括RIGHT JOIN子句中指定的右表的左右记录,以及所有满足连接条件的查询,如果由标的某条记录在左表中没有匹配,则左表将返回空值

查询每个班的班级ID,班级名称及该班的所有学生的名字

select class.cid,class.cname,student.sname from class right outer join student on class.cid=student.classid;

13· 子查询

子查询是指一个查询语句嵌套在另一个查询语句内部的查询,该查询语句可以嵌套在一个select select...into   insert  into 等语句中,在执行查询时,首先会执行查询中的语句,再将犯规的结果作为外层查询的过滤条件,在子查询中通常可以使用比较运算符和IN   EXISTS ANY   ALL等等关键字

准备数据

DROP TABLE IF EXISTS student;

DROP TABLE IF EXISTS class;

-- 创建班级表

CREATE TABLE class(

  cid int (4) NOT NULL PRIMARY KEY, 

  cname varchar(20)

);

-- 创建学生表

CREATE TABLE student (

  sid int (4) NOT NULL PRIMARY KEY, 

  sname varchar (20), 

  sage int (2), 

  classid int (4) NOT NULL

);

-- 向班级表插入数据

INSERT INTO class VALUES(1001,'Java');

INSERT INTO class VALUES(1002,'C++');

INSERT INTO class VALUES(1003,'Python');

INSERT INTO class VALUES(1004,'PHP');

INSERT INTO class VALUES(1005,'Android');

-- 向学生表插入数据

INSERT INTO student VALUES(1,'张三',20,1001);

INSERT INTO student VALUES(2,'李四',21,1002);

INSERT INTO student VALUES(3,'王五',24,1003);

INSERT INTO student VALUES(4,'赵六',23,1004);

INSERT INTO student VALUES(5,'小明',21,1001);

INSERT INTO student VALUES(6,'小红',26,1001);

INSERT INTO student VALUES(7,'小亮',27,1002);

  1. 比较运算符前面我们提到过,就是>  < =  >=  <= !=等等

查询张三同学所在的班级信息

select * from class where cid=(select classid from student where sname='张三');

查询张三同学所在班级编号还大的班级的信息

select * from class where cid>(select classid from student where sname='张三');

2·带EXISTS关键字的子查询

EXISTS关键字后面的参数可以试试任意一个子查询,他不产生任何数据只返回TRUE或FALSE,当返回值为TRUE是外层查询才会执行

select * from class where exists (select * from student where sname='王五');

3·带ANY关键字的子查询

ANY关键字标志满足其中任意一个条件就返回一个结果作为外层查询条件

查询任一学生所属班级号还大的班级编号

select * from class where cid > any (select classid from student);

4·带ALL关键字的子查询

ALL关键字与ANY有点类似,只不过带ALL关键字的子查询返回的结果需同时满足所有内层查询的条件

查询比所有学生所属班级号还大的班级编号 

select * from class where cid > all (select classid from student);

总结

重要(要从关键字分析)

查询语句的书写顺序和执行顺序

select ===> from ===> where ===> group by ===> having ===> order by ===> limit

查询语句的执行顺序

from ===> where ===> group by ===> having ===> select ===> order by ===> limi

基于学习,乐于分享

如有雷同,纯属巧合!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pengpeng0121/article/details/134987638

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签