----> B站MySQL数据库视频 <----视频点击这里哦
1.数据库的基本概念
1)数据库的英文单词:DataBase 简称:DB
2)什么是数据库?
用于存储和管理数据的仓库(内存也存储数据是临时性数据,关机或断电数据就消失了,数据不能持久)
3)数据库的特点
1.持久化存储数据的,其实数据库就是一个文件系统,类似1.txt文件方式存储(与文件存储一样)
2.方便存储和管理数据
3.使用了统一的方式操作数据库 ----- 即SQL语句
4)常见的数据库软件
数据库与数据库软件:类似买汽车,具体品牌具体型号的汽车才是真正的汽车产品,类似宝马X3才是具体化的车产品(类似:汽车=数据库、宝马x3=mysql5.8)
MySqL:开源免费的数据库,小型的数据库。MySqL6.x版本也开始收费。
Qracle:收费的大型数据库,Oracle公司的产品,SUN公司收购了MySQL,Oracle又收购了SUN公司(所以MySQL也变成了Oracle公司的产品)
DB2:IBM公司的数据库产品,常应用于银行系统中
SQLServer:微软公司收费的中型数据库
SQLite:嵌入式的小型数据库,应用在手机端,保存浏览器用户的配置信息
2.MySQL数据库软件
1)MySQL安装
选择与电脑相对应的64位操作系统
下载的MySQL软件包版本尾号64或32要与电脑的操作系统版本保持一致
注意:下面自定义安装目录名称不要有中文字符
不同电脑会由于分辨率与不兼容问题,导致下面安装框不在屏幕内,使用TAB键可以切换选项,再回车安装
下面勾选:是否运行MySQL的运行实例,点击完成后,出现配置界面
下图密码为第一个:root,第二个为确认密码:root
当点击Execute后,下面4个选项头部圆圈内出现蓝色√号即为安装成功,出现红色×号,即为相应步骤安装失败
遇到报错:Dindows+r
1.清理以下三个目录:
a. HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL
b. HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL
c. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL
MySQL注册表中的ControlSet001,ControlSet002,不一定是001和002,可能是ControlSet005、006之类,删除的时候,都删除就可以
2.检查C:\WINDOWS目录下是否有my.ini文件,将其删除
3.在c盘查询MySQL(可能会隐藏,显示隐藏文件就行了),全部删除
4.重新安装MySQL,配置过程中选择之前未用过的名字(MySql4,若仍使用原来的MySql,则无法启动服务)
2)MySQL卸载
mysql的安装目录找到my.ini
复制“datadir=/ProgramData”行,默认安装到C盘,找到对应的目录
卸载mysql
删除C盘下:/ProgramData目录下的MySQL文件夹
3)MySQL配置
MySQL启动
1.手动
2.cmd-->services.msc 打开服务窗口
3.使用管理员打开cmd,启动MySQL:net start mysql <-->停止MySQL:net stop mysql
MySQL登录
第一种:mysql -uroot -proot
-u指定登陆用户,-p登录密码,使用root用户登录,密码是自己设置的root
mysql -uroot -p 回车,密文输入密码
第二种:mysql -h127.0.0.1 -uroot -p连接目标的密码
-h连接目标的IP,下面案例为连接本地127.0.0.1
第三种:mysql --host=127.0.0.1 --user=root --password=root
MySQL退出
exit、quit,下图演示exit效果,quti相同的效果,切记:Ctrl+c为强制中断服务退出,会中断MySQL服务。
MySQL目录结构
安装目录
my.ini存放配置文件信息
bin 二进制目录,存放二进制的可执行文件
data 数据目录,存放日志文件、数据文件
include 存放C语言头信息
lib 存放MySQL运行需要的库文件
share 存放MySQL的一些错误信息
数据目录
C:\ProgramData\MySQL 默认是隐藏的,可以在<查看>中设置,显示隐藏文件
数据库就是一个文件夹,表就是对应数据库(文件夹)内的文件
数据库:文件夹
表:文件
数据:文件内存储的数据
3.SQL语句
(Structured Query Language:结构化查询语言)
1)什么是SQL
SQL其实就是定义了操作所有关系型数据库的规则,每一种数据库操作的方式存在不一样的地方,称为“方言”,类似家乡话只有故乡的人才能听懂。
2)SQL通用语法
1.SQL语句可以单行或多行书写,以分号;结尾
2.可使用空格和缩进来增强语句的可读性
3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
4.3种注释
单行注释:-- 注释内容 或 # 注释内容(mysql特有,注意--后面要接一个空格,#后面可接可不接)
多行注释:/* 注释 */
mysql> SHOW DATABASES;-- 查询数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> SHOW DATABASES;# 查询数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> SHOW DATABASES;#查询数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> SHOW DATABASES;/* 查询数据库 */ +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec)
3)SQL分类
1)DDL(Data Definition Languge)数据定义语言
用来定义数据库对象:数据库,表,列等。关键字:create,drop,alter等
2)DML(Data Manipulation Languge)数据操作语言
用来对数据库中表的数据进行增删改。关键字:insert,delete,update等
3)DQL(Data Query Languge)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select,where等
4)DCL(Data Control Languge)数据控制语言
用来定义数据库的访问权限和安全级以及创建用户,关键字:GRANT,REVOKE等
4.DDL:操作数据库、表
1)操作数据库:CRUD
1.C(Create):创建,添加,新增
①CREATE DATABASE 数据库名称;
mysql> CREATE DATABASE db1;
Query OK, 1 row affected (0.01 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> SHOW CREATE DATABASE db1; # 查询创建数据库语句
+----------+--------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------+
| db1 | CREATE DATABASE db1 /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> CREATE DATABASE db1; # 再次创建会报错1007
ERROR 1007 (HY000): Can't create database 'db1'; database exists
②创建数据库,判断不存在再创建,已存在不报错
mysql> CREATE DATABASE if not exists db1; # 加上if判断,创建数据库,如果已存在不报错,如果不存在则创建 Query OK, 1 row affected, 1 warning (0.00 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) mysql> CREATE DATABASE if not exists db2; # 加上判断创建新的数据库 Query OK, 1 row affected (0.00 sec) mysql> SHOW DATABASES;# db2之前不存在,创建成功 +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | db2 | | mysql | | performance_schema | | test | +--------------------+ 6 rows in set (0.00 sec)
③创建数据库并指定字符集
mysql> CREATE DATABASE db3 character set gbk;
Query OK, 1 row affected (0.00 sec)
mysql> SHOW CREATE DATABASE db3;
+----------+-------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------+
| db3 | CREATE DATABASE db3 /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+-------------------------------------------------------------+
1 row in set (0.00 sec)
④创建数据库,判断不存在再创建,已存在不报错并指定字符集
mysql> CREATE DATABASE if not exists db4 character set gbk;
Query OK, 1 row affected (0.00 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| db2 |
| db3 |
| db4 |
| mysql |
| performance_schema |
| test |
+--------------------+
8 rows in set (0.00 sec)
mysql> SHOW CREATE DATABASE db4;
+----------+-------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------+
| db4 | CREATE DATABASE db4 /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+-------------------------------------------------------------+
1 row in set (0.00 sec)
2.R(Retrieve):查询
①查询所有数据库名称
SHOW DATABASES;
information schema库:描述mysql数据库中的信息,有哪些库哪些表名字,并不存在真正对应的物理文件
mysql库:核心数据库,存放核心数据
performamce_ schema库:性能库,对性能提升做操作的库
②查询某个数据库的字符集、查询某个数据库的创建语句
SHOW CREATE DATABASE 数据库名称;
mysql> SHOW CREATE DATABASE mysql; # 查询创建mysql数据库的语法
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| mysql | CREATE DATABASE mysql /*!40100 DEFAULT CHARACTER SET utf8 */ | # /**/注释,安装数据库时默认选择字符集为utf8
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
3.U(Update):修改
①修改数据库字符集
ALTER DATABASE 数据库名称 character set 新字符集名称;
mysql> SHOW CREATE DATABASE db3;
+----------+-------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------+
| db3 | CREATE DATABASE db3 /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+-------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> ALTER DATABASE db3 character set utf8;
Query OK, 1 row affected (0.00 sec)
mysql> SHOW CREATE DATABASE db3;
+----------+--------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------+
| db3 | CREATE DATABASE db3 /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
1 row in set (0.00 sec)
4.D(Delete):删除
①DROP DATABASE 数据库名称;
mysql> DROP DATABASE db3;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| db2 |
| db4 |
| mysql |
| performance_schema |
| test |
+--------------------+
7 rows in set (0.00 sec)
mysql> DROP DATABASE db3;# 不能重复删除,会报错
ERROR 1008 (HY000): Can't drop database 'db3'; database doesn't exist
②删除数据库,判断存在则删除,不存在不报错
mysql> DROP DATABASE if exists db3;# 即使db3数据库已不存在也不报错
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> DROP DATABASE if exists db4;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW DATABASES;# db4数据库已删除
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| db2 |
| mysql |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.00 sec)
5.使用数据库
类似点击windows中的文件目录进入到文件目录中才能操作文件目录下的文件
①查询正在使用的数据库名称
SELECT DATABASE();
mysql> SELECT DATABASE();# 此时还未使用数据库,所以不显示
+------------+
| DATABASE() |
+------------+
| NULL |
+------------+
1 row in set (0.00 sec)
②使用数据库USE
USE 数据库名称;
mysql> USE db1;# 使用、切换数据库
Database changed
mysql> SELECT DATABASE();# 当前使用数据库名称
+------------+
| DATABASE() |
+------------+
| db1 |
+------------+
1 row in set (0.00 sec)
2)操作表
1.C(Create):创建,添加,新增
①语法:
CREATE TABLE 表名(
列名1 数据类型1,
列名2 数据类型2,
...........
列名n 数据类型n
);
注意:最后一列,不需要逗号(,)
②数据类型:
1.int(integer) 整数类型
age int,
2.double 小数类型
score double(5,2) 其中5 最多小数点后5位,2 小数点后保留2位小数
3.data 日期类型,只包含年月日,yyyy-MM-dd
4.datatime 日期,包含年月日时分秒yyyy-MM-dd HH:mm:ss
5.timestamp 时间戳类型,包含年月日时分秒yyyy-MM-dd HH:mm:ss
如果指定是timestamp字段,若将来不给这个字段赋值或赋值为null,则默认使用当前的系统时间来自动赋值
6.varchar 字符串类型,超过规定最大字符串长度会报错
name varchar(20):表示姓名最大20个字符
zhangsan 8个字符 张三 2个字符
③创建表
create table student(
id int,
name varchar(32),
age int,
score double(4,1),
birthday date,
insert_time timestamp
);
mysql> use db1;
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| db1 |
+------------+
1 row in set (0.00 sec)
mysql> create table student( id int, name varchar(32), age int, score double(4,1), birthday date, insert_time timestamp);
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| student |
+---------------+
1 row in set (0.00 sec)
mysql> desc student;
+-------------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+-------------------+-----------------------------+
| id | int(11) | YES | | NULL | |
| name | varchar(32) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| score | double(4,1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| insert_time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------------+-------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.01 sec)
④复制表内容
CREATE TABLE 表名 like 被复制的表名;
mysql> CREATE TABLE stu like student;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW TABLES;
+---------------+
| Tables_in_db1 |
+---------------+
| stu |
| student |
+---------------+
2 rows in set (0.00 sec)
数据库与execl表格类似,当我们创建execl表格时,会先创建表名,表里有很多行,第一行为表头行,在表头行有很多列,每一列代表的含义不一样,按照每列的头部信息写入数据(头部信息例如:姓名、年龄,身高等)(数据库顺序:创建表,先指定表名、每一列名字、那一列将要存储什么样的数据格式)
2.R(Retrieve):查询
①查询数据库中所有表的名称 SHOW TABLES;
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| NULL |
+------------+
1 row in set (0.00 sec)
mysql> USE DB1;
Database changed
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| db1 |
+------------+
1 row in set (0.00 sec)
mysql> SHOW TABLES;# 只有到对应的数据库下才能操作对应数据库下的表
Empty set (0.01 sec)
mysql> USE mysql;
Database changed
mysql> SHOW TABLES;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
............................. # 太多已省略
| user |
+---------------------------+
24 rows in set (0.01 sec)
②查询表结构
desc 表名;
mysql> DESC host;
+-----------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
........................................................................# 太多已省略
+-----------------------+---------------+------+-----+---------+-------+
20 rows in set (0.01 sec)
3.U(Update):修改
①修改表名
ALTER TABLE 表名 rename to 新的表名;
mysql> SHOW TABLES;
+---------------+
| Tables_in_db1 |
+---------------+
| student |
+---------------+
1 row in set (0.00 sec)
mysql> ALTER TABLE student rename to stu;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW TABLES;
+---------------+
| Tables_in_db1 |
+---------------+
| stu |
+---------------+
1 row in set (0.00 sec)
②修改表的字符集
SHOW CREATE TABLE stu; # 查看字符集类型
ALTER TABLE 表名 character set 字符集类型;
mysql> SHOW CREATE TABLE stu;
+-------+----------------------------------------------------------------------------------------------------------------------+
| Table | Create Table
id int(11) DEFAULT NULL,
name varchar(32) DEFAULT NULL,
age int(11) DEFAULT NULL,
score double(4,1) DEFAULT NULL,
birthday date DEFAULT NULL,
insert_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 | # 此处显示字符集类型为utf8
+-------+----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> ALTER TABLE stu character set gbk; # 修改字符集类型为gbk
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE stu;
+-------+---------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------+
| stu | CREATE TABLE stu (
id int(11) DEFAULT NULL,
name varchar(32) CHARACTER SET utf8 DEFAULT NULL,
age int(11) DEFAULT NULL,
score double(4,1) DEFAULT NULL,
birthday date DEFAULT NULL,
insert_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=gbk | # 此处显示字符集类型为gbk
+-------+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
③添加一列
ALTER TABLE 表名 add 列名 数据类型;
mysql> ALTER TABLE stu add gender varchar(10);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC stu;
+-------------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+-------------------+-----------------------------+
| id | int(11) | YES | | NULL | |
| name | varchar(32) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| score | double(4,1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| insert_time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| gender | varchar(10) | YES | | NULL | |
+-------------+-------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.03 sec)
④修改某一列名称 类型
ALTER TABLE 表名 change 列名 新列名 新数据类型;# 既改了列名又改了类型
ALTER TABLE 表名 modify 列名 新数据类型;# 只改了数据类型
mysql> ALTER TABLE stu change gender sex varchar(20); -- 更改了字段名称和字符串长度
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC stu;
+-------------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+-------------------+-----------------------------+
| id | int(11) | YES | | NULL | |
| name | varchar(32) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| score | double(4,1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| insert_time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| sex | varchar(20) | YES | | NULL | |
+-------------+-------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.01 sec)
mysql> ALTER TABLE stu modify sex varchar(10); -- 只更改了字符串长度
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC stu;
+-------------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+-------------------+-----------------------------+
| id | int(11) | YES | | NULL | |
| name | varchar(32) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| score | double(4,1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| insert_time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| sex | varchar(10) | YES | | NULL | |
+-------------+-------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.01 sec)
⑤删除列
ALTER TABLE 表名 drop 列名;
mysql> ALTER TABLE stu drop sex;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC stu;
+-------------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+-------------------+-----------------------------+
| id | int(11) | YES | | NULL | |
| name | varchar(32) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| score | double(4,1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| insert_time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------------+-------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.01 sec)
4.D(Delete):删除
①DROP TABLE 表名;
mysql> DROP TABLE stu;
Query OK, 0 rows affected (0.01 sec)
mysql> DROP TABLE stu;# 重复删除会出现报错
ERROR 1051 (42S02): Unknown table 'stu'
mysql> SHOW TABLES;# 确定已经删除
+---------------+
| Tables_in_db1 |
+---------------+
| student |
+---------------+
1 row in set (0.00 sec)
②DROP TABLE if exists 表名;# 与创建一样,加入判断,不报错误
mysql> DROP TABLE IF EXISTS STU;# 加入判断不报错
Query OK, 0 rows affected, 1 warning (0.00 sec)
5.客户端图形化工具:SQLYog
6.DML:增删改表中数据
1)添加数据
语法:insert into 表名(列名1,列名2,.....列名n) values(值1,值2,......值n);
注意:
1.列名和值要一一对应
2.如果表名后,不定义列名,则默认给所有列添加值
3.除了数字类型,其他类型需要使用引号(单双都可以)引起来
insert into 表名 values(值1,值2,......值n);
INSERT into stu VALUES(2,'赵敏',17,99.9,NULL,NULL);
INSERT into stu VALUES(3,"张三丰",17,99.9,"1893-11-11",NULL);
小提示:如果windows命令行添加汉字正常,但是查看时,显示无规则乱码,找到安装目录下的my或my.ini文件,找到[mysql] default-character-set=utf8,[mysqld] default-server-set=utf-8,改为[mysql] default-character-set=gbk,然后保持[mysqld] default-server-set=utf-8不变或改成gbk
原因: [mysql] default-character-set 是客户端默认字符集。如果采用命令行作为客户端,此字符集必须和命令行默认字符集能够匹配,否则出现中文乱码
2)删除数据
语法:delete from 表名 [where 条件] 意为:当条件满足时,从表里删除数据
注意:
如果不加条件,则删除表中所有记录。
如果要删除所有记录,
1,delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作(操作次数多,占用线程)
2,TRUNCATE TABLE 表名; -- 推荐使用。 效率更高,先删除表,然后再创建一张一样的表。
DELETE FROM stu WHERE ID=1;
mysql> select * from stu;
+------+-----------+------+-------+------------+---------------------+
| id | name | age | score | birthday | insert_time |
+------+-----------+------+-------+------------+---------------------+
| 1 | 张无忌 | 18 | NULL | NULL | 2022-11-01 23:27:49 |
| 2 | 赵敏 | 17 | 99.9 | NULL | 2022-11-02 12:10:36 |
| 3 | 张三丰 | 17 | 99.9 | 1893-11-11 | 2022-11-02 13:18:46 |
+------+-----------+------+-------+------------+---------------------+
3 rows in set (0.00 sec)
mysql> DELETE FROM stu WHERE ID=1;# 删除第一条数据
Query OK, 1 row affected (0.01 sec)
mysql> select * from stu;# 查看数据确定数据已删除
+------+-----------+------+-------+------------+---------------------+
| id | name | age | score | birthday | insert_time |
+------+-----------+------+-------+------------+---------------------+
| 2 | 赵敏 | 17 | 99.9 | NULL | 2022-11-02 12:10:36 |
| 3 | 张三丰 | 17 | 99.9 | 1893-11-11 | 2022-11-02 13:18:46 |
+------+-----------+------+-------+------------+---------------------+
2 rows in set (0.00 sec)
mysql> DELETE FROM stu;# 后面不加条件,会默认删除所有数据
Query OK, 2 rows affected (0.01 sec)
mysql> select * from stu;# 数据已被完全删除,不推荐使用
Empty set (0.00 sec)
mysql> INSERT INTO stu(id,name,age) values(1,'zhangwuji',18);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO stu values(2,'zhaomin',17,99.9,NULL,NULL);
Query OK, 1 row affected (0.01 sec)
mysql> select * from stu;# 添加两条数据,查看数据
+------+-----------+------+-------+----------+---------------------+
| id | name | age | score | birthday | insert_time |
+------+-----------+------+-------+----------+---------------------+
| 1 | zhangwuji | 18 | NULL | NULL | 2022-11-02 14:02:48 |
| 2 | zhaomin | 17 | 99.9 | NULL | 2022-11-02 14:04:16 |
+------+-----------+------+-------+----------+---------------------+
2 rows in set (0.00 sec)
mysql> TRUNCATE TABLE stu;# 同样也是删除数据,但先删除表再创建一个一模一样的表,节省资源,效率更高
Query OK, 0 rows affected (0.01 sec)
mysql> select * from stu;# 查看数据已经被删除
Empty set (0.00 sec)
mysql> SHOW TABLES;
+---------------+
| Tables_in_db1 |
+---------------+
| stu |
+---------------+
1 row in set (0.00 sec)
3)修改数据
语法:UPDATE 表名 SET 列名1=值1,列名2=值2,列名n=值n [where 条件];
注意:
如果不加任何条件,则会将表中所有记录数据全部修改
UPDATE STU SET SCORE=100 WHERE ID=1;
mysql> INSERT INTO stu(id,name,age) values(1,'zhangwuji',18);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO stu values(2,'zhaomin',17,99.9,NULL,null);
Query OK, 1 row affected (0.01 sec)
mysql> select * from stu;
+------+-----------+------+-------+----------+---------------------+
| id | name | age | score | birthday | insert_time |
+------+-----------+------+-------+----------+---------------------+
| 1 | zhangwuji | 18 | NULL | NULL | 2022-11-02 14:24:00 |
| 2 | zhaomin | 17 | 99.9 | NULL | 2022-11-02 14:24:16 |
+------+-----------+------+-------+----------+---------------------+
2 rows in set (0.00 sec)
mysql> UPDATE STU SET SCORE=100 WHERE ID=1;# 基于ID更改数据内容,第一条添加分数
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from stu;
+------+-----------+------+-------+----------+---------------------+
| id | name | age | score | birthday | insert_time |
+------+-----------+------+-------+----------+---------------------+
| 1 | zhangwuji | 18 | 100.0 | NULL | 2022-11-02 14:25:16 |
| 2 | zhaomin | 17 | 99.9 | NULL | 2022-11-02 14:24:16 |
+------+-----------+------+-------+----------+---------------------+
2 rows in set (0.00 sec)
mysql> UPDATE stu SET age=20,score=99,birthday='1995-07-07' where id=1;# 基于ID更改多条数据记录
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from stu;
+------+-----------+------+-------+------------+---------------------+
| id | name | age | score | birthday | insert_time |
+------+-----------+------+-------+------------+---------------------+
| 1 | zhangwuji | 20 | 99.0 | 1995-07-07 | 2022-11-02 14:38:08 |
| 2 | zhaomin | 17 | 99.9 | NULL | 2022-11-02 14:24:16 |
+------+-----------+------+-------+------------+---------------------+
2 rows in set (0.00 sec)
mysql> UPDATE stu SET age=25;# 没有加任何条件
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select * from stu; # 所有age数据都被更改
+------+-----------+------+-------+------------+---------------------+
| id | name | age | score | birthday | insert_time |
+------+-----------+------+-------+------------+---------------------+
| 1 | zhangwuji | 25 | 99.0 | 1995-07-07 | 2022-11-02 14:56:52 |
| 2 | zhaomin | 25 | 99.9 | NULL | 2022-11-02 14:56:52 |
+------+-----------+------+-------+------------+---------------------+
2 rows in set (0.00 sec)
7.DQL:查询数据
1)语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
2)基础查询
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);
1.多个字段的查询
SELECT 字段名1,字段名2... FROM student;
注意:
如果查询所有字段,则可以使用*来替代字段列表
查询姓名和年龄
SELECT NAME,age FROM student;
SELECT
NAME,-- 姓名
age -- 年龄
FROM
student;-- 指定的表
mysql> SELECT NAME,age FROM student; +----------+------+ | NAME | age | +----------+------+ | 马云 | 55 | | 马化腾 | 45 | | 马景涛 | 55 | | 柳色 | 20 | | 柳青 | 20 | | 刘德华 | 57 | | 马德 | 22 | | 德玛西亚 | 18 | +----------+------+ 8 rows in set (0.00 sec)
2.去除重复
去除重复的结果集:DISTINCT
SELECT address FROM student;
SELECT DISTINCT address FROM student;# 去除重复的结果集
SELECT DISTINCT NAME,address FROM student;# 多列时,保证展示列的结果集完全一样才会去除重复
mysql> SELECT address FROM student; +---------+ | address | +---------+ | 杭州 | | 深圳 | | 香港 | | 湖南 | | 湖南 | | 香港 | | 香港 | | 南京 | +---------+ 8 rows in set (0.00 sec) mysql> SELECT DISTINCT address FROM student; # 去除重复的结果集 +---------+ | address | +---------+ | 杭州 | | 深圳 | | 香港 | | 湖南 | | 南京 | +---------+ 5 rows in set (0.00 sec) mysql> SELECT DISTINCT NAME,address FROM student; # 多列时,保证展示列的结果集完全一样才会去除重复 +----------+---------+ | NAME | address | +----------+---------+ | 马云 | 杭州 | | 马化腾 | 深圳 | | 马景涛 | 香港 | | 柳色 | 湖南 | | 柳青 | 湖南 | | 刘德华 | 香港 | | 马德 | 香港 | | 德玛西亚 | 南京 | +----------+---------+ 8 rows in set (0.00 sec)
3.计算列
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
IFNULL(表达式1,表达式2) :NULL参与的运算,计算结果都为NULL
表达式1:哪个字段需要判断是否为null
表达式2:如果该字段为null后的替换值
计算math和english分数之和
SELECT NAME,math,english FROM student;
SELECT NAME,math,english,math + english FROM student; -- 如果有NULL参与的运算,计算结果都为NULL
SELECT NAME,math,english,math + IFNULL(english,0) FROM student;
mysql> SELECT NAME,math,english FROM student; +----------+------+---------+ | NAME | math | english | +----------+------+---------+ | 马云 | 66 | 78 | | 马化腾 | 98 | 87 | | 马景涛 | 56 | 77 | | 柳色 | 76 | 65 | | 柳青 | 86 | NULL | | 刘德华 | 99 | 99 | | 马德 | 99 | 99 | | 德玛西亚 | 56 | 65 | +----------+------+---------+ 8 rows in set (0.00 sec) mysql> SELECT NAME,math,english,math + english FROM student;-- 如果有NULL参与的运算,计算结果都为NULL +----------+------+---------+----------------+ | NAME | math | english | math + english | +----------+------+---------+----------------+ | 马云 | 66 | 78 | 144 | | 马化腾 | 98 | 87 | 185 | | 马景涛 | 56 | 77 | 133 | | 柳色 | 76 | 65 | 141 | | 柳青 | 86 | NULL | NULL | | 刘德华 | 99 | 99 | 198 | | 马德 | 99 | 99 | 198 | | 德玛西亚 | 56 | 65 | 121 | +----------+------+---------+----------------+ 8 rows in set (0.01 sec) mysql> SELECT NAME,math,english,math + IFNULL(english,0) FROM student; +----------+------+---------+--------------------------+ | NAME | math | english | math + IFNULL(english,0) | +----------+------+---------+--------------------------+ | 马云 | 66 | 78 | 144 | | 马化腾 | 98 | 87 | 185 | | 马景涛 | 56 | 77 | 133 | | 柳色 | 76 | 65 | 141 | | 柳青 | 86 | NULL | 86 | | 刘德华 | 99 | 99 | 198 | | 马德 | 99 | 99 | 198 | | 德玛西亚 | 56 | 65 | 121 | +----------+------+---------+--------------------------+ 8 rows in set (0.00 sec)
4.起别名
起别名:AS:as也可以省略
SELECT NAME,math,english,math + IFNULL(english,0) AS 总分 FROM student;# 使用AS起别名
SELECT NAME 姓名,math 数学,english 英语,math + IFNULL(english,0) 总分 FROM student;# 或使用空格,可省略AS
mysql> SELECT NAME,math,english,math + IFNULL(english,0) AS 总分 FROM student; +----------+------+---------+------+ | NAME | math | english | 总分 | +----------+------+---------+------+ | 马云 | 66 | 78 | 144 | | 马化腾 | 98 | 87 | 185 | | 马景涛 | 56 | 77 | 133 | | 柳色 | 76 | 65 | 141 | | 柳青 | 86 | NULL | 86 | | 刘德华 | 99 | 99 | 198 | | 马德 | 99 | 99 | 198 | | 德玛西亚 | 56 | 65 | 121 | +----------+------+---------+------+ 8 rows in set (0.01 sec) mysql> SELECT NAME 姓名,math 数学,english 英语,math + IFNULL(english,0) 总分 FROM student;# 或者使用空格 +----------+------+------+------+ | 姓名 | 数学 | 英语 | 总分 | +----------+------+------+------+ | 马云 | 66 | 78 | 144 | | 马化腾 | 98 | 87 | 185 | | 马景涛 | 56 | 77 | 133 | | 柳色 | 76 | 65 | 141 | | 柳青 | 86 | NULL | 86 | | 刘德华 | 99 | 99 | 198 | | 马德 | 99 | 99 | 198 | | 德玛西亚 | 56 | 65 | 121 | +----------+------+------+------+ 8 rows in set (0.00 sec)
3)条件查询
1.where 子句后跟条件
2.运算符
>、<、<=、>=、=、<>
BETWEEN...AND
IN(集合)
LIKE 模糊查询
like占位符:_:代表任意单个字符
%:代表多个任意字符
IS NULL
and 或 &&
or 或 ||
not 或 !
案例:
a.查询年龄大于20岁的人
mysql> SELECT * FROM student WHERE age>20; +------+--------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+--------+------+------+---------+------+---------+ | 1 | 马云 | 55 | 男 | 杭州 | 66 | 78 | | 2 | 马化腾 | 45 | 女 | 深圳 | 98 | 87 | | 3 | 马景涛 | 55 | 男 | 香港 | 56 | 77 | | 6 | 刘德华 | 57 | 男 | 香港 | 99 | 99 | | 7 | 马德 | 22 | 女 | 香港 | 99 | 99 | +------+--------+------+------+---------+------+---------+ 5 rows in set (0.00 sec)
b.查询年龄等于20岁的人
mysql> SELECT * FROM student WHERE age=20; +------+------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+------+------+------+---------+------+---------+ | 4 | 柳色 | 20 | 女 | 湖南 | 76 | 65 | | 5 | 柳青 | 20 | 男 | 湖南 | 86 | NULL | +------+------+------+------+---------+------+---------+ 2 rows in set (0.00 sec)
c.查询年龄不等于20岁的人
mysql> SELECT * FROM student WHERE age!=20; +------+----------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+----------+------+------+---------+------+---------+ | 1 | 马云 | 55 | 男 | 杭州 | 66 | 78 | | 2 | 马化腾 | 45 | 女 | 深圳 | 98 | 87 | | 3 | 马景涛 | 55 | 男 | 香港 | 56 | 77 | | 6 | 刘德华 | 57 | 男 | 香港 | 99 | 99 | | 7 | 马德 | 22 | 女 | 香港 | 99 | 99 | | 8 | 德玛西亚 | 18 | 男 | 南京 | 56 | 65 | +------+----------+------+------+---------+------+---------+ 6 rows in set (0.00 sec) mysql> SELECT * FROM student WHERE age<>20; +------+----------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+----------+------+------+---------+------+---------+ | 1 | 马云 | 55 | 男 | 杭州 | 66 | 78 | | 2 | 马化腾 | 45 | 女 | 深圳 | 98 | 87 | | 3 | 马景涛 | 55 | 男 | 香港 | 56 | 77 | | 6 | 刘德华 | 57 | 男 | 香港 | 99 | 99 | | 7 | 马德 | 22 | 女 | 香港 | 99 | 99 | | 8 | 德玛西亚 | 18 | 男 | 南京 | 56 | 65 | +------+----------+------+------+---------+------+---------+ 6 rows in set (0.00 sec)
d.查询年龄大于等于20&&小于等于30岁的人
mysql> SELECT * FROM student WHERE age >= 20 && age <= 30;# 不推荐 +------+------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+------+------+------+---------+------+---------+ | 4 | 柳色 | 20 | 女 | 湖南 | 76 | 65 | | 5 | 柳青 | 20 | 男 | 湖南 | 86 | NULL | | 7 | 马德 | 22 | 女 | 香港 | 99 | 99 | +------+------+------+------+---------+------+---------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM student WHERE age >= 20 AND age <= 30; +------+------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+------+------+------+---------+------+---------+ | 4 | 柳色 | 20 | 女 | 湖南 | 76 | 65 | | 5 | 柳青 | 20 | 男 | 湖南 | 86 | NULL | | 7 | 马德 | 22 | 女 | 香港 | 99 | 99 | +------+------+------+------+---------+------+---------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM student WHERE age BETWEEN 20 AND 30;# 推荐 +------+------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+------+------+------+---------+------+---------+ | 4 | 柳色 | 20 | 女 | 湖南 | 76 | 65 | | 5 | 柳青 | 20 | 男 | 湖南 | 86 | NULL | | 7 | 马德 | 22 | 女 | 香港 | 99 | 99 | +------+------+------+------+---------+------+---------+ 3 rows in set (0.00 sec)
e.查询年龄22岁,19岁,25岁的信息的人
mysql> SELECT * FROM student WHERE age = 22 || age =18 || age =25;# 不推荐 +------+----------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+----------+------+------+---------+------+---------+ | 7 | 马德 | 22 | 女 | 香港 | 99 | 99 | | 8 | 德玛西亚 | 18 | 男 | 南京 | 56 | 65 | +------+----------+------+------+---------+------+---------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM student WHERE age = 22 OR age =18 OR age =25; +------+----------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+----------+------+------+---------+------+---------+ | 7 | 马德 | 22 | 女 | 香港 | 99 | 99 | | 8 | 德玛西亚 | 18 | 男 | 南京 | 56 | 65 | +------+----------+------+------+---------+------+---------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM student WHERE age IN (22,18,25);# 推荐 +------+----------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+----------+------+------+---------+------+---------+ | 7 | 马德 | 22 | 女 | 香港 | 99 | 99 | | 8 | 德玛西亚 | 18 | 男 | 南京 | 56 | 65 | +------+----------+------+------+---------+------+---------+ 2 rows in set (0.00 sec)
f.查询英语成绩为null的人
mysql> SELECT * FROM student WHERE english = NULL;# 查不到,=<>等不能应用于等于null中 Empty set (0.00 sec) mysql> SELECT * FROM student WHERE english IS NULL; +------+------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+------+------+------+---------+------+---------+ | 5 | 柳青 | 20 | 男 | 湖南 | 86 | NULL | +------+------+------+------+---------+------+---------+ 1 row in set (0.00
g.查询英语成绩不为null的人
mysql> SELECT * FROM student WHERE english IS NOT NULL; +------+----------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+----------+------+------+---------+------+---------+ | 1 | 马云 | 55 | 男 | 杭州 | 66 | 78 | | 2 | 马化腾 | 45 | 女 | 深圳 | 98 | 87 | | 3 | 马景涛 | 55 | 男 | 香港 | 56 | 77 | | 4 | 柳色 | 20 | 女 | 湖南 | 76 | 65 | | 6 | 刘德华 | 57 | 男 | 香港 | 99 | 99 | | 7 | 马德 | 22 | 女 | 香港 | 99 | 99 | | 8 | 德玛西亚 | 18 | 男 | 南京 | 56 | 65 | +------+----------+------+------+---------+------+---------+ 7 rows in set (0.00 sec)
h.查询姓马的有哪些?like
mysql> SELECT * FROM student WHERE NAME LIKE '马%'; +------+--------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+--------+------+------+---------+------+---------+ | 1 | 马云 | 55 | 男 | 杭州 | 66 | 78 | | 2 | 马化腾 | 45 | 女 | 深圳 | 98 | 87 | | 3 | 马景涛 | 55 | 男 | 香港 | 56 | 77 | | 7 | 马德 | 22 | 女 | 香港 | 99 | 99 | +------+--------+------+------+---------+------+---------+ 4 rows in set (0.00 sec)
i.查询第二个字是化的人
mysql> SELECT * FROM student WHERE NAME LIKE "_化%";# 单引号双引号一样效果,皆可 +------+--------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+--------+------+------+---------+------+---------+ | 2 | 马化腾 | 45 | 女 | 深圳 | 98 | 87 | +------+--------+------+------+---------+------+---------+ 1 row in set (0.00 sec)
j.查询姓名是三个字的人
mysql> SELECT * FROM student WHERE NAME LIKE "___";# 此处就是双引号,与单引号一样的效果,引号内是三个下划线 +------+--------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+--------+------+------+---------+------+---------+ | 2 | 马化腾 | 45 | 女 | 深圳 | 98 | 87 | | 3 | 马景涛 | 55 | 男 | 香港 | 56 | 77 | | 6 | 刘德华 | 57 | 男 | 香港 | 99 | 99 | +------+--------+------+------+---------+------+---------+ 3 rows in set (0.00 sec)
k.查询姓名中包含德的人
mysql> SELECT * FROM student WHERE NAME LIKE "%德%"; +------+----------+------+------+---------+------+---------+ | id | NAME | age | sex | address | math | english | +------+----------+------+------+---------+------+---------+ | 6 | 刘德华 | 57 | 男 | 香港 | 99 | 99 | | 7 | 马德 | 22 | 女 | 香港 | 99 | 99 | | 8 | 德玛西亚 | 18 | 男 | 南京 | 56 | 65 | +------+----------+------+------+---------+------+---------+ 3 rows in set (0.00 sec)
8.本篇单词:
database:数据库
structured:结构化
definition:定义
manipulation:操作
query:查询
control:控制
exists:存在
character:字符集
information schema:信息架构
performamce_ schema:性能架构
select:选择,选中
insert:插入
values:价值、值
truncate:截断,截短
distinct:不同的
between:之间