零基础学 MySQL(基础版)
1. 引出
思考一个问题:
淘宝网,京东、微信,抖音 都有各自的功能,那么当我们退出系统的时候,下次再访问时,为什么信息还存在?
2. 解决之道
2.1 解决之道—文件、数据库
-
为了解决上述问题,使用更加利于管理数据的东东-数据库,它能更有效的管理数据。
-
举一个生活化的案例说明:
如果说 图书馆是保存书籍的,那么数据库就是保存数据的。
2.2 MySQL 数据库的安装和配置(安装演示)
详见我单独发的《MySQL-5.7.19版本安装详解》
2.3 使用命令行窗口连接MYSQL 数据库[示意图]
2.4 操作示意图
3. 图形化MySQL的管理软件
-
在我们实际开发中,会用到一些图形化MySQL的管理软件
-
其中用的比较多的是Navicat和SQLyog
-
这两个软件安装的方式就是傻瓜式安装,不做过多讲解
-
下载地址:
-
Navicat地址:http://www.navicat.com.cn/products/
-
SQLyog下载地址:https://sqlyog.en.softonic.com/
-
-
我这里就先用SQLyog操作了
-
SQLyog安装完以后打开,新建一个本地的MySQL
-
然后电脑ip那里可以填写localhost或者127.0.0.1(电脑本机ip),密码可以填写上去也可以不填,其他都不用动,点连接就行
-
设置完以后,即可登录MySQL;注意:一定要保证MySQL 服务是运行的状态!
4. 数据库三层结构
- 所谓安装Mysql数据库,就是在主机安装一个数据库管理系统(DBMS),这个管理程序可以管理多个数据库。DBMS(database manage system)
- 一个数据库中可以创建多个表,以保存数据(信息)。
- 数据库管理系统(DBMS)、数据库和表的关系如图所示: 示意图如下
5. 数据在数据库中的存储方式
6. SQL 语句分类
- DDL:数据定义语句 [create 表,库…]
- DML: 数据操作语句[增加 insert ,修改 update,删除 delete]
- DQL: 数据查询语句 [select ]
- DCL:数据控制语句[管理数据库: 比如用户权限 grant revoke ]
7. 创建数据库
- 基本语法:
说明:
- CHARACTER SET: 指定数据库采用的字符集,如果不指定字符集,默认utf8
- COLLATE: 指定数据库字符集的校对规则(常用的 utf8_bin[区分大小写]、utf8_general ci[不区分大小写] 注意默认是 utf8_general ci)[举例说明database.sql 文件]
练习:
- 练习:创建一个名称为sys_db01的数据库。[图形化和指令 演示)
- 创建一个使用utf8字符集的sys_db02数据库
- 创建一个使用utf8字符集,并带校对规则的sys_db03数据库
- 演示如下:
#演示创建数据库
#1. 练习:创建一个名称为sys_db01的数据库。[图形化和指令 演示)
#使用指令创建数据库
CREATE DATABASE sys_db01
#删除数据库
DROP DATABASE sys_db01
#2. 创建一个使用utf8字符集的sys_db02数据库
CREATE DATABASE sys_db02 CHARACTER SET utf8
#3. 创建一个使用utf8字符集,并带校对规则的sys_db03数据库
CREATE DATABASE sys_db03 CHARACTER SET utf8 COLLATE utf8_bin
- 直接生成了3个数据库
- 这里稍微提一下校对规则
# 校对规则 utf8_bin 区分大小写 默认utf8_general_ci 不区分大小写
一、当我们在sys_db02数据库中创建一个表t1时,创建时啥都不设置的话,校验规则就是默认utf8_general_ci 不区分大小写
在表t1里面添加两个数据
现在我们进行查询
# 下面是一条查询的sql , selset 查询 * 表示所有字段 FROM 从哪个表查
# WHERE 从哪个字段 NAME = 'jack' 查询名字是 jack
SELECT *
FROM t1
WHERE NAME = 'jack'
查询结果如下
二、当我们在sys_db03数据库中创建一个表t1时,创建时啥都不设置的话,校验规则就是默认utf8_bin区分大小写
在表t1里面添加两个数据(与上面相同)
现在我们进行查询
# 下面是一条查询的sql , selset 查询 * 表示所有字段 FROM 从哪个表查
# WHERE 从哪个字段 NAME = 'jack' 查询名字是 jack
SELECT *
FROM t1
WHERE NAME = 'jack'
查询结果如下
8. 查看,删除数据库
- 基本语法
练习:
- 查看当前数据库服务器中的所有数据库
- 查看前面创建的sys_db01数据库的定义信息
- 删除前面创建的sys_db01数据库
- 演示如下
# 演示删除和查询数据库
#1. 查看当前数据库服务器中的所有数据库
SHOW DATABASES
#2. 查看前面创建的hsp db01数据库的定义信息
SHOW CREATE DATABASE ‘sys_db01‘
#说明:在创建数据库,表的时候,为了规避关键字,可以使用反引号解决
#3. 删除前面创建的hsp db01数据库
DROP DATABASE sys_db01
查看当前数据库服务器中的所有数据库示意图
查看前面创建的hsp db01数据库的定义信息示意图
删除前面创建的hsp db01数据库示意图
9. 备份恢复数据库
-
备份数据库(注意:在DOS执行命令行
mysqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > 文件名.sq
-
恢复数据库(注意: 进入Mysql命令行再执行)
Source 文件名.sgl
练习:
- database03.sql 备份sys_db02 库中的数据,并恢复
- 先删除原先的数据库sys_db02
#删除数据库
DROP DATABASE sys_db02
- 第一个恢复方法:先进入到mysql命令行,然后再mysql命令行输入source f:\bak.sql (source 备份文件的地址+名字)
- 第二个恢复方法:直接打开刚刚备份的bak.sql , 然后将里面的内容全部复制到查询编辑器里面,然后执行就能恢复
#恢复数据库(注意:进入mysql命令行再执行)
source f:\\bak.sql
#第二个恢复方法,直接将bak.sql的内容放到查询编辑器中执行
10. 备份恢复数据库的表
- 备份数据库中的表格就是备份数据库的命令不要输-B,后面写上数据库+表名
mysqldump -u 用户名 -p密码 数据库 表1 表2 表n > d:文件名sq
- 小练习:备份数据库sys_db03中的表t1
#直接在命令行输入mysqldump -U root -p sys_db03 t1 > f:\\table03.sql就备份好了
11. 创建表 (按课程大纲顺序)
- 基本语法
-
注意: sys_db02创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型。
例: 下面那个user表
id 整形 [图形化,指令]
name 字符串
password 字符串
birthday 日期
CREATE TABLE `user`(
id INT,
`name` VARCHAR(255),
`password` VARCHAR(255),
birthday DATE)
CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB;
然后在sys_db02页面执行这行命令,就创建成功了
12. Mysql 常用数据类型(列类型)
12.1 简介
- Mysql 常用数据类型(也叫列类型)分为数值类型、文本类型、二进制类型和时间日期
- 数值类型又分为整型和小数类型:
- 整型有:
- tinyint [1个字节]
- smallint [2个字节]
- mediumint [3个字节]
- int [4个字节]
- bigint [8个字节]
- 小数类型有:
- float [单精度 4个字节]
- double [双精度 8个字节]
- decimal [M,D] [大小不确定,由 M D确定]
- 整型有:
- 文本类型(也叫字符串类型):
- char (0~255)
- varchar (0~25535) [0~2^16-1]
- text [0~2^16-1]
- longtext [0~2^32-1]
- 二进制类型:
- blob [0~2^16-1]
- longblob [0~2^32-1]
- 日期类型:
- date [日期 存放 年月日]
- time [存放 时分秒]
- datetime [存放 年月日 时分秒 YYYY-MM-DD-HH:MM:ss]
- timestamp [时间戳]
- year [存放年]
- 以上就是Mysql 最常用数据类型(列类型)
12.2 数值型(整数)的基本使用
说明
- 使用规范:在能够满足需求的情况下,尽量选择占用空间小的类型
- 应用实例:使用tinyint来演示一下范围
#演示整型
#使用tinyint来演示范围 有符号 -128~127 没有符号 0~255
#表的字符集、校验规则,存储引擎使用默认
# 1. 如果没有指定 unsigned ,则 TINYINT 就是有符号
# 2. 如果指定 unsigned , 则 TINYINT 就是无符号 0-255
CREATE TABLE t3(
id TINYINT);#有符号
CREATE TABLE t4(
id TINYINT UNSIGNED);#无符号
INSERT INTO t3 VALUES(-128);#非常简单的添加语句
INSERT INTO t4 VALUES(0);#非常简单的添加语句
SELECT * FROM t3;
SELECT * FROM t4;
12.3 型如何定义一个无符号的整数
create table t10 (id tinyint ); //默认是有符号的
create table t11 (id tinyint unsigned ); //无符号的
12.4 数值型(bit)的使用
-
基本使用
mysql> create table t05 (num bit(8));
mysql> insert into t05 (1, 3);
mysql> insert into t05 values(2, 65);
-
细节说明
- bit 字段显示时,按照 位 的方式去显示;
- 查询的时候仍然可以用使用 添加的数值;
- 如果一个值只有 0 ,1 可以考虑使用 bit(1) ,可以节约空间;
- 位类型 bit(M) M指定位数,默认值是1,范围是1-64
- 在实际开发中使用的不多
-
演示:
#演示 bit 类型使用
#说明
# 1. bit(m) m在 1-64
# 2. 添加数据范围
# 3. 显示按照bit
# 4. 查询时,仍然可以按照数值来查询
CREATE TABLE t05(num BIT(8));
INSERT INTO t05 VALUES(255);
SELECT * FROM t05;
SELECT * FROM t05 WHERE num = 1;
12.5 数值型(小数)的基本使用
-
FLOAT/DOUBLE [UNSIGNEDI
- Float 单精度精度,
- Double 双精度
-
DECIMAL [M,D] [UNSIGNED]
- 可以支持更加精确的小数位。M是小数位数(精度)的总数,D是小数点(标度)后面的位数。
- 如果D是0,则值没有小数点或分数部分。M最大65。D最大是30。如果D被省略,默认是0。如果M被省略,默认是10。
- 建议:如果希望小数的精度高,推荐使用decimal
-
演示decimal类型、float、double使用
#演示decimal类型、float、double使用
#创建表
CREATE TABLE t06(
num1 FLOAT,
num2 DOUBLE,
num3 DECIMAL(30,20));
#添加数据
INSERT INTO t06 VALUES(88.151351516164161,
88.151351516164161,88.151351516164161);
SELECT * FROM t06
- 可以看到表格显示float精度很低,decimal精度最高
- decimalye可以存放特别大的数,但是float和double不能存放特别大的数
#decimal可以存放很大的数
CREATE TABLE t07(
num DECIMAL(65))
INSERT INTO t07 VALUES(151154111544152148154164616484165184);
SELECT * FROM t07;
- 所以,如果要存放特别大的数,或者精度特别高的数就用decimal;如果要求没那么高的话,一般用double就够用了。
12.6 字符串的基本使用
-
CHAR(size)
固定长度字符串 最大255 字符
-
VARCHAR(size)
0~65535可变长度字符串 最大65532字节 [utf8编码最大21844字符 1-3个字节用于记录大小]
-
应用案例 charVarchar.sql 文件
#演示字符串类型使用 char varchar
#注释的快捷键 shift+ctrl+c
#取消注释 shift+ctrl+r
-- 1. CHAR(size)
-- 固定长度字符串 最大255 字符
-- 2. VARCHAR(size)
-- 0~65535可变长度字符串 最大65532字节 [utf8编码最大21844字符 1-3个字节用于记录大小]
-- 如果表的编码为 utf8 varchar(size)=(65535-3)/3 = 21844
-- 如果表的编码为 gbk varchar(size)=(65535-3)/2 = 32766
CREATE TABLE t08(
`NAME` CHAR(255));
CREATE TABLE t09(
`name` VARCHAR(21844));
CREATE TABLE t10(
`name` VARCHAR(32766) CHARSET gbk);
12.7 字符串使用细节
细节1 charVarcharDetail.sql
- char(4) //这个4表示字符数(最大255),不是字节数不管是中文还是字母都是放四个,按字符计算.
- varchar(4)//这个4表示字符数,不管是字母还是中文都以定义好的表的编码来存放数据
- 不管是 中文还是英文字母,都是最多存放4个,是按照字符来存放的
细节2
- char(4)是定长(固定的大小),就是说,即使你 插入aa’,也会占用 分配的4个字符的空间.
- varchar(4)是变长(变化的大小),就是说,如果你插入了aa’实际占用空间大小并不是4个字符,而是按照实际占用空间来分配
- (说明:varchar本身还需要占用1-3个字节来记录存放内容长度) L(实际数据大小)+(1-3)字节
细节3
什么时候使用 char,什么时候使用varchar1.
- 如果数据是定长,推荐使用char,比如md5的密码,邮编,手机号,身份证号码等char(32)
- 如果一个字段的长度是不确定,我们使用varchar ,比如留言,文章
- 查询速度: char > varchar
细节4
- 在存放文本时,也可以使用Text 数据类型.可以将TEXT列视为VARCHAR列,注意 Text 不能有默认值.大小 0-2^16 字节
- 如果希望存放更多字符,可以选择MEDIUMTEXT 0-2^24 或者 LONGTEXT O~2^32
#细节1:char(4)和varchar(4) 这个4表示的是字符,而不是字节
CREATE TABLE t11(
`name` CHAR(4));
INSERT INTO t11 VALUES('abcd');#如果是5个就存放失败
SELECT * FROM t11;
CREATE TABLE t12(
`name` VARCHAR(4));
INSERT INTO t12 VALUES('大家好a')#如果是5个就存放失败
SELECT * FROM t12;
#细节4:
#如果varchar不够用,可以考虑mediumtext或者longtext
#如果想简单点,可以直接使用text
CREATE TABLE t13(content1 TEXT,content2 MEDIUMTEXT,content3 LONGTEXT);
INSERT INTO t13 VALUES('sys学java','sys学java加油','sys学java~~~');
SELECT * FROM t13;
12.8 日期类型的基本使用
CREATE TABLE birthday6(
t1 DATE, t2 DATETIME,
t3 TIMESTAMP NOT NULL DEFAULT
CURRENT TIMESTAMP ON UPDATE
CURRENT TIMESTAMP ); timestamp时间截
mysql> INSERT INTO birthday (t1,t2)
VALUES(‘2022-11-11’,‘2022-11-11 10:10:10’);
日期类型的细节说明
TimeStamp在Insert和update时,自动更新datetime.sql
#演示时间相关的类型
#创建一张表 , date ,datetime , timestamp
CREATE TABLE t14(
birthday DATE,-- 生日
job_time DATETIME,-- 记录年月日 时分秒
login_time TIMESTAMP
NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);-- 登陆时间,如果希望login_time列自动更新
SELECT * FROM t14;
INSERT INTO t14 (birthday,job_time)
VALUES('2023.6.1','2023.6.1 10:10:10');
-- 如果我们更新了 t14表的某条记录,login_time列会自动的以当前的时间进行更新
13. 创建表练习
创建一个员工表 emp (课堂练习),选用适当的数据类型 createtable.sql
代码如下:
#创建一个员工表 emp (课堂练习),选用适当的数据类型
-- 字段 属性
-- id 整形
-- name 字符型
-- sex 字符型
-- brithday 日期型(DATE)
-- entry date 日期型(DATE)
-- job 字符型
-- Salary 小数型
-- resume 文本型
CREATE TABLE `emp`(
id INT,
`name` VARCHAR(32),
sex CHAR(1),
birthday DATE,
entry_date DATETIME,
job VARCHAR(32),
salary FLOAT,
`resume` TEXT)
CHARSET utf8 COLLATE utf8_bin ENGINE INNODB;
-- 添加一条记录
INSERT INTO `emp`
VALUES(168,'张三','男','1993-11-26',
'2023-7-11 8:00:00','java','15000','java');
-- 查询
SELECT * FROM `emp`;
效果如下:
14. 修改表
14.1 基本介绍
使用 ALTER TABLE 语句追加,修改,或删除列的语法:
修改表名: Rename table 表名 to 新表名
修改表字符集: alter table 表名 character set 字符集:
修改表列名:alter table user change column name username varchar(20);
14.2 应用实例
- 员工表emp的上增加一个image列,varchar类型(要求在resume后面)
- 修改job列,使其长度为60。
- 删除sex列。
- 表名改为employee。
- 修改表的字符集为utf8
- 列名name修改为user name
- 代码演示如下:
#修改表的操作练习
-- 1. 员工表emp的上增加一个image列,varchar类型(要求在resume后面)
ALTER TABLE emp -- 修改表emp
-- 增加 image列,varchar类型,不允许为空,后面加个空字符串
ADD image VARCHAR(32) NOT NULL DEFAULT ''
AFTER RESUME -- 加在resume字段后面
DESC employee -- 显示表结构,可以查看表的所有列
-- 2. 修改job列,使其长度为60。
ALTER TABLE emp
MODIFY job VARCHAR(60) NOT NULL DEFAULT''
-- 3. 删除sex列。
ALTER TABLE emp
DROP sex
-- 4. 表名改为employee。
RENAME TABLE emp TO employee
-- 5. 修改表的字符集为utf8
ALTER TABLE employee CHARACTER SET utf8
-- 6. 列名name修改为user name
ALTER TABLE employee
CHANGE `name` user_name VARCHAR(64) NOT NULL DEFAULT ''
15. 数据库CRUD语句(增删改查)
数据库C[create]R[read]U[update]D[delete]语句
- Insert语句 (添加数据)
- Update语句 (更新数据)
- Delete语句 (删除数据)
- Select语句 (找数据)
15.1 Insert 语句
- 使用 INSERT 语句向表中插入数据。insert.sql
练习1:
- 创建一张商品表goods (id int,goods_name varchar(10) ,price double );
- 添加2条记录
# 练习 insert 语句
-- 1. 创建一张商品表goods (id int,goods_name varchar(10) ,price double );
-- 2. 添加2条记录
CREATE TABLE goods(
id INT,
goods_name VARCHAR(10),
price DOUBLE);
-- 添加数据
INSERT INTO `goods`(id,goods_name,price)
VALUES(1,'小米手机',1999);
INSERT INTO `goods`(id,goods_name,price)
VALUES(2,'苹果手机',9999);
-- 查阅
SELECT * FROM goods;
效果如下
练习2:
- 使用insert 语句向上面做的表employee 中插入 2 个员工的信息。
15.2 insert 细节说明
-
插入的数据应与字段的数据类型相同。
– 比如 把 ‘abc’ 添加到 int 类型会错误
-
数据的长度应在列的规定范围内,例如:不能将一个长度为 80 的字符串加入到长度为 40 的列中。
-
在 values 中列出的数据位置必须与被加入的列的排列位置相对应。
-
字符和日期型数据应包含在单引号中。
-
列可以插入空值[前提是该字段允许为空],insert into table value(null)
-
insert into tab_name (列名…) values (),(),() 形式添加多条记录
-
如果是给表中的所有字段添加数据,可以不写前面的字段名称
-
默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错
– 如果某个列 没有指定 not null ,那么当添加数据时,没有给定值,则会默认给 null
– 如果我们希望指定某个列的默认值,可以在创建表时指定
-
演示如下:
#说明 insert 语句的细节
CREATE TABLE goods2(
id INT,
goods_name VARCHAR(10),
price DOUBLE NOT NULL DEFAULT 100);
-- 1. 插入的数据应与字段的数据类型相同。
-- 比如 把 'abc' 添加到 int 类型会错误
INSERT INTO `goods2`(id,goods_name,price)
VALUES('abc','小米手机',1999);-- 会直接报错
-- 2. 数据的长度应在列的规定范围内,例如:不能将一个长度为 80 的字符串加入到长度为 40 的列中。
INSERT INTO `goods2`(id,goods_name,price)
VALUES(3,'锤子手机锤子手机锤子手机锤子手机',1999);-- goods_name的长度为10,超过范围
-- 3. 在 values 中列出的数据位置必须与被加入的列的排列位置相对应。
INSERT INTO `goods2`(id,goods_name,price)
VALUES('小米手机',1,1999);-- 位置不对应
-- 4. 字符和日期型数据应包含在单引号中。
INSERT INTO `goods2`(id,goods_name,price)
VALUES(1,小米手机,1999);-- varchar 不用单引号会报错
-- 5. 列可以插入空值[前提是该字段允许为空],insert into table value(null)
INSERT INTO `goods2`(id,goods_name,price)
VALUES(NULL,'小米手机',1999);-- 在定义字段属性的时候后面没有写 not null就可以填空值
-- 6. insert into tab_name (列名..) values (),(),() 形式添加多条记录
INSERT INTO `goods2`(id,goods_name,price)
VALUES(2,'榔头手机',2999),(3,'菠萝手机',2199);
-- 7. 如果是给表中的所有字段添加数据,可以不写前面的字段名称
INSERT INTO `goods2`
VALUES(4,'砖头手机',1999);
-- 8. 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错
-- 如果某个列 没有指定 not null ,那么当添加数据时,没有给定值,则会默认给 null
-- 如果我们希望指定某个列的默认值,可以在创建表时指定
INSERT INTO `goods2`(id,goods_name)
VALUES(5,'椰子手机');
SELECT * FROM goods2;
表格如下:
15.3 update 语句
1. 基本语法
2. 基本使用
要求:在上面创建的employee表中修改表中的纪录
- 将所有员工薪水修改为5000元。
- 将姓名为 张三的员工薪水修改为3000元
- 将小明的薪水在原有基础上增加1000元
#演示update语句
-- 1. 将所有员工薪水修改为5000元。
-- [如果没有带where条件,会修改所有的记录,因此用的时候要小心]
UPDATE employee SET salary = 5000
-- 2. 将姓名为 张三的员工薪水修改为3000元
UPDATE employee
SET salary = 3000
WHERE user_name = '张三';
-- 3. 将小明的薪水在原有基础上增加1000元
UPDATE employee
SET salary = salary + 1000
WHERE user_name = '小明';
#查阅
SELECT * FROM employee;
修改后的表格如下:
3. 使用细节
- UPDATE语法可以用新值更新原有表行中的各列。
- SET子句指示要修改哪些列和要给予哪些值。
- WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行(记录),因此操作的时候一定小心。
- 如果需要修改多个字段,可以通过 set 字段1=值1,字段2=值2…
- 例如下面:
-- 4. 可以修改多个值
UPDATE employee
SET salary = salary + 1000,job = '法官'
WHERE user_name = '小明';
15.4 delete 语句
1. 基本语法
2. 基本使用
- 删除表中名称为’小红’的记录。
- 删除表中所有记录。
#delete演示
-- 1. 删除表中名称为’小红’的记录。
DELETE FROM employee
WHERE user_name = '小红';
-- 2. 删除表中所有记录。
DELETE FROM employee
SELECT * FROM employee;
3. 使用细节
- 如果不使用where子句,将删除表中所有数据
- Delete语句不能删除某一列的值 (可使用update 设为 null 或者’')
-- Delete语句不能删除某一列的值 (可使用update 设为 null 或者'')
UPDATE employee SET job = ''
WHERE user_name = '小明';
- 使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。drop table 表名
-- 使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。drop table 表名
DROP TABLE employee;
15.5 select 语句
1. 基本语法
2. 注意事项 (创建测试表学生表 )
- Select 指定查询哪些列的数据。
- column指定列名。
- *号代表查询所有列
- From指定查询哪张表
- DISTINCT可选,指显示结果时,是否去掉重复数据
3. 基本使用
- 查询表中所有学生的信息。
- 查询表中所有学生的姓名和对应的英语成绩
- 过滤表中重复数据 distinct 。
- 要查询的记录,每个字段都相同,才会去重
-- select 语句【重点 难点】
CREATE TABLE student(
id INT NOT NULL DEFAULT 1,
`NAME` VARCHAR(20) NOT NULL DEFAULT '',
chinese FLOAT NOT NULL DEFAULT 0.0,
english FLOAT NOT NULL DEFAULT 0.0,
math FLOAT NOT NULL DEFAULT 0.0);
INSERT INTO student(id,`name`,chinese,english,math)
VALUES(1,'孙裕松',88,85,92),(2,'张飞',78,66,98),
(3,'关羽',78,75,82),(4,'刘备',98,86,96),
(5,'吕布',86,90,86),(6,'赵云',92,88,95);
-- 1. 查询表中所有学生的信息。
SELECT * FROM student;
-- 2. 查询表中所有学生的姓名和对应的英语成绩
SELECT `name`,english FROM student;
-- 3. 过滤表中重复数据 distinct 。
SELECT DISTINCT * FROM student
-- 4. 要查询的记录,每个字段都相同,才会去重
SELECT DISTINCT chinese FROM student
4. 使用表达式对查询的列进行运算
5. 在select 语句中可使用 as 语句
6. 练习 select02.sql
- 统计每个学生的总分
- 在所有学生总分加10分的情况
- 使用别名表示学生分数。
-- select 语句【重点 难点】
-- 1. 统计每个学生的总分
SELECT `name`,(chinese+english+math) FROM student
-- 2. 在所有学生总分加10分的情况
SELECT `name` ,(chinese+english+math+10) FROM student
-- 3. 使用别名表示学生分数。
SELECT `name`,(chinese+english+math+10) AS total_score FROM student
效果如下:
7. 在where 子句中经常使用的运算符
8. 练习题:使用where 子句,进行过滤查询 select03.sql
练习题1:
- 查询姓名为赵云的学生成绩
- 查询英语成绩大于90分的同学
- 查询总分大于200分的所有同学
使用where子句:
- 查询math大于60 并且(and) id大于90的学生成绩
- 查询英语成绩大于语文成绩的同学
- 查询总分大于200分 并且 数学成绩小于语文成绩,的
- 姓孙的学生
-- select 语句【重点 难点】
-- 1. 查询姓名为赵云的学生成绩
SELECT * FROM student
WHERE `name` = '赵云';
-- 2. 查询英语成绩大于90分的同学
SELECT * FROM student
WHERE english > 90;
-- 3. 查询总分大于200分的所有同学
SELECT * FROM student
WHERE (chinese+english+math)>200;
-- 使用where子句:
-- 1. 查询math大于60 并且(and) id大于5的学生成绩
SELECT * FROM student
WHERE math > 90 AND id > 5;
-- 2. 查询英语成绩大于语文成绩的同学
SELECT * FROM student
WHERE english > chinese;
-- 3. 查询总分大于200分 并且 数学成绩小于语文成绩,的姓刘的学生
-- 刘% 表示名字以 刘开头的就可以
SELECT * FROM student
WHERE (chinese+english+math)>200 AND
math < chinese AND `name` LIKE '刘%'
练习题2:
- 查询英语分数在 80- 90之间的同学
- 查询数学分数为89,90,91的同学。
- 查询所有姓李的学生成绩。
- 查询数学分>80,语文分>80的同学
-- 练习题2:
-- 1. 查询英语分数在 80- 90之间的同学
SELECT * FROM student
WHERE english >= 80 AND english <= 90;
SELECT * FROM student
WHERE english BETWEEN 80 AND 90;
-- 2. 查询英语分数为89,90,91的同学。
SELECT * FROM student
WHERE english = 89 OR english = 90 OR english = 91;
SELECT * FROM student
WHERE english IN (89 , 90 , 91);
-- 3. 查询所有姓李的学生成绩。
SELECT * FROM student
WHERE `name` LIKE '孙%';
-- 4. 查询数学分>80,语文分>80的同学
SELECT * FROM student
WHERE math >80 AND chinese > 80;
练习题3:
- 查询语文分数在 70 - 80之间的同学
- 查询总分为189,190,191的同学
- 查询所有姓赵 或者 姓张的学生成绩
- 查询数学比语文多30分的同学
-- 练习题3:
-- 1. 查询语文分数在 70 - 80之间的同学
SELECT * FROM student
WHERE chinese IN (70,80);
-- 2. 查询总分为189,190,191的同学
SELECT * FROM student
WHERE (chinese+english+math) IN (189,190,191);
-- 3. 查询所有姓赵 或者 姓张的学生成绩
SELECT * FROM student
WHERE `name` LIKE '赵%' OR `name` LIKE '张%';
-- 4. 查询数学比语文多30分的同学
SELECT * FROM student
WHERE (math-chinese) >= 30;
9. 使用order by 子句排序查询结果
- 基本语法
-
基本介绍
- Order by 指定排序的列,排序的列既可以是表中的列名,也可以是select语句后指定的列名。
- Asc 升序[默认]、Desc 降序
- ORDER BY 子句应位于SELECT语句的结尾
-
练习:
- 对数学成绩排序后输出[升序]
- 对总分按从高到低的顺序输出
- 对姓李的学生成绩排序输出(升序)
-- 演示 order by使用 -- 1. 对数学成绩排序后输出[升序] SELECT * FROM student ORDER BY math; -- 2. 对总分按从高到低的顺序输出 SELECT `name`,(chinese+english+math) AS total_score FROM student ORDER BY total_score DESC; -- 3. 对姓张的学生成绩排序输出(升序) SELECT `name` ,(chinese + english + math) AS total_score FROM student WHERE `name` LIKE '张%' ORDER BY total_score ASC;
16. 函数
16.1 合计/统计函数
1. count
1. 基本语法
2. 情景案例
- 统计一个班级共有多少学生?
- 统计数学成绩大于90的学生有多少个?
- 统计总分大于250的人数有多少?
- count(*)和 count(列) 的区别
# 演示 mysql 的统计函数的使用
-- 1. 统计一个班级共有多少学生?
SELECT COUNT(*) FROM student;
-- 2. 统计数学成绩大于90的学生有多少个?
SELECT COUNT(*) FROM student
WHERE math > 90;
-- 3. 统计总分大于250的人数有多少?
SELECT COUNT(*) FROM student
WHERE (chinese + english + math) > 250;
-- 4. count(*)和 count(列) 的区别
-- count(*) 返回满足条件的记录的行数
-- count(列):统计满足条件的某列有多少个,但是会排出null
CREATE TABLE t15(
id VARCHAR(10));
INSERT INTO t15 VALUES ('jack');
INSERT INTO t15 VALUES ('lucy');
INSERT INTO t15 VALUES ('john');
INSERT INTO t15 VALUES ('hebe');
INSERT INTO t15 VALUES (NULL);
SELECT * FROM t15;
SELECT COUNT(*) FROM t15;-- 5
SELECT COUNT(id) FROM t15;-- 4
2. sum
1. 基本语法
Sum函数返回满足where条件的行的和: 一般使用在数值列
2. 情景案例
- 统计一个班级数学总成绩?
- 统计一个班级语文、英语、数学各科的总成绩
- 统计一个班级语文、英语、数学的成绩总和
- 统计一个班级语文成绩平均分
注意:sum仅对数值起作用,没有意义
注意:对多列求和,“,”号不能少。
-- 演示 sum的使用
-- 1. 统计一个班级数学总成绩?
SELECT SUM(math) FROM student;
-- 2. 统计一个班级语文、英语、数学各科的总成绩
SELECT SUM(math) AS math_total,SUM(english) AS english_total,
SUM(chinese) AS chinese_total FROM student;
-- 3. 统计一个班级语文、英语、数学的成绩总和
SELECT SUM(math + english + chinese) AS total_score FROM student;
-- 4. 统计一个班级语文成绩平均分
SELECT SUM(chinese)/COUNT(*) FROM student;
3. avg
1. 基本语法
AVG函数返回满足where条件的一列的平均值
2. 情景案例
- 求一个班级数学平均分?
- 求一个班级总分平均分
-- 演示avg的使用
-- 1. 求一个班级数学平均分?
SELECT AVG(math) FROM student;
-- 2. 求一个班级总分平均分
SELECT AVG(math + chinese + english) FROM student;
4. max/min
1. 基本语法
Max/min函数返回满足where条件的一列的最大/最小值
2. 情景案例
- 求班级最高分和最低分(数值范围在统计中特别有用)
- 求班级数学最高分和最低分
-- 演示 max/min 的使用
-- 1. 求班级最高分和最低分(数值范围在统计中特别有用)
SELECT