1.数据库介绍
1.1 数据概念
数据的储存方式:
存储位置 | 优点 | 缺点 |
内存 | 速度快 | 不能永久保存,数据是临时状态。 |
文件 | 数据可以永久保存 | 操作数据不方便,查询某个数据。 |
数据库 |
1)数据可以永久保存 2)查询速度快 3)对数据的管理方便 | 占用资源,需要购买。 |
1.2 什么是数据库
(1)存储数据的仓库
(2 )本质上是一个文件系统,还是以文件的方式存在服务器的电脑上的。
(3)所有的关系型数据库都可以使用通用的SQL语句进行管理 DBMS DataBase Management System
2.SQL的概念
2.1 什么是SQL
Structured Query Language 结构化查询语言
2.2 SQL作用
(1)是一种所有关系型数据库的查询规范,不同的数据库都支持。
(2)通用的数据库操作语言,可以用在不同的数据库中。
(3)不同的数据库SQL语句有一些区别‘。
2.3 SQL语句分类
(1) Data Definition Language (DDL数据定义语言) 如:建库,建表。
(2)Data Manipulation Language(DML数据操纵语言),如:对表中的记录操作增删改。
(3)Data Query Language(DQL 数据查询语言),如:对表中的查询操作
(4)Data Control Language(DCL 数据控制语言),如:对用户权限的设置
2.4 MySQL的语法
(1)每条语句以分号结尾,如果在SQLyog中不是必须加的。
(2)SQL中不区分大小写,关键字中认为大写和小写是一样的。
(3)数据库中注释
注释的语法 | 说明 |
--空格 | 单行注释 |
/* */ | 多行注释 |
# | 这是mysql特有的注释方式 |
3 DDL操作数据库(数据定义语言)
3.1 创建数据库
创建数据库的方式:
(1)创建数据库
CREATE DATABASE 数据库名;
(2)判断数据库是否已经存在,不存在则创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名;
(3)创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
具体操作:
-- 直接创建数据库db1
create database db1;
-- 判断是否存在,如果不存在则创建数据库db2
create database if not exists db2;
-- 创建数据库并指定字符集为gbk
create database db3 default character set gbk;
3.2 查看数据库
-- 查看某个数据库的定义信息
SHOW CREATE DATABASE db3;
3.3 修改数据库
修改数据库默认的字符集
AlTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;
-- 修改数据库默认的字符集
ALTER DATABASE db2 CHARACTER SET utf8;
3.4 删除数据库
删除数据库的语法
DROP DATABASE 数据库名;
-- 删除数据库
DROP DATABASE bd1;
3.5 使用数据库
查看正在使用的数据库:
SELECT DATABASE();
使用/切换数据库
USE 数据库名;
-- 查看正在使用的数据库
SELECT DATABASE();
-- 使用/切换数据库
USE db2;
4.DDL操作表结构(数据定义语言)
前提需要使用某个数据库
4.1 创建表
创建表的格式:
CREATE TABLE 表名(
字段名1 字段类型1,
字段名2 字段类型2
)
CREATE---创建 TABLE —表
4.2 MySQL数据类型
分类 | 类型名称 | 类型说明 |
整数 | tinyInt | 微整型:很小的整数(占8位二进制) |
smallint | 小整型:小的整数(占16位二进制) | |
mediumint | 中整型:中等长度的整数(占24位二进制) | |
int(integer) | 整型:整数类型(占32位二进制) | |
小数 | float | 单精度浮点数,占4个字节 |
double | 双精度浮点数,占8个字节 | |
日期 | time | 表示时间类型 |
date | 表示日期类型 | |
datetime | 同时可以表示日期和时间类型 | |
字符串 | char(m) | 固定长度的字符串,无论使用几个字符都占满全部,M为0~255之间的整数 |
varchar(m) | 可变长度的字符串,使用几个字符就占用几个,M为0~65535之间的整数 | |
大二进制 | tinyblob Big Large Object | 允许长度0~255字节 |
blob | 允许长度0~65535字节 | |
mediumblob | 允许长度0~167772150字节 | |
longblob | 允许长度0~4294967295字节 | |
大文本 | tinytext | 允许长度0~255字节 |
text | 允许长度0~65535字节 | |
mediumtext | 允许长度0~167772150字节 | |
longtext | 允许长度0~4294967295字节 |
具体操作:
创建student表包含id,name,birthday字段
-- 创建student表包含id,name,birthday字段
CREATE TABLE student(
id INT,-- 整数
NAME VARCHAR(20),-- 字符串
birthday DATE -- 生日 ,最后没有逗号
)
4.3 查看表
查看某个数据库中所有的表
SHOW TABLES;
查看表结构:
DESC 表名;
查看创建表的SQL语句:
SHOW CREATE TABLE 表名;
-- 使用/切换数据库
USE db2;
-- 查看某个数据库中的所有表
SHOW TABLES;
-- 查看表结构
DESC student;
-- 查看创建表的SQL语句
SHOW CREATE TABLE Student;
查看表结构的执行结果:
查看student 的创建表SQL语句,执行结果:
CREATE TABLE `student` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`birthday` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
4.4 快速创建一个表结构相同的表
语法格式:
CREATE TABLE 新表名 LIKE 旧表名;
具体实现:
-- 快速创建一个表结构相同的表
CREATE TABLE stu LIKE student;
-- 查看表结构
DESC stu;
4.5 删除表
直接删除表
DROP TABLE 表名;
判断表是否存在,如果存在则删除表
DROP TABLE IF EXISTS 表名;
具体实现:
-- 直接删除表
DROP TABLE stu;
-- 判断表是否存在,如果存在则删除表
DROP TABLE IF EXISTS 'stu';
4.6 修改表结构
(1)添加列表ADD
ALTER TABLE 表名 ADD 列名 类型;
-- 为学生表添加一个新的字段remark,类型为varchar(20)
ALTER TABLE student ADD remark VARCHAR(20);
-- 查看表结构
DESC student;
执行结果:
(2)修改列类型 MODIFY
ALTER TABLE 表名 MODIFY 列名 新的类型;
-- 将student表中的remark字段的改成varchar(100)
ALTER TABLE student MODIFY remark VARCHAR(100);
-- 查看表结构
DESC student;
执行结果:
(3)修改列名 CHANGE
ALTER TABLE 表名 CHANGE 旧表名 新表名 类型;
将student 表中的remark 字段名改成intro ,类型varchar(30);
-- 将student表中的remark字段名改成intro,类型varchar(30)
ALTER TABLE student CHANGE remark intro VARCHAR(30);
(4)删除列DROP
ALTTER TABLE 表名 DROP 列名;
删除student 表中的字段intro。
-- 删除student表中的字段intro
ALTER TABLE student DROP intro;
(5)修改表名
RENAME TABLE 表名 TO 新表名;
将学生表student改名成student2
-- 将学生表student改名成student2
RENAME TABLE student TO student1;
(6)修改字符集
ALTER TABLE 表名 CHARACTER SET 字符集;
将student1表的编码修改成gbk:
-- 将student1表的编码修改成gbk
ALTER TABLE student1 CHARACTER SET gbk;
5.DML操作表中的数据(数据操纵语言)
对于表中的数据进行增删改操作。
5.1 插入记录
INSERT [INTO] 表名 [字段名] VALUES(字段值)
INSERT [INTO] 表名:表示往那张表中添加数据
(字段名1,字段名2,...):要给那些字段设置值
VALUES(值1,值2,..):设置具体的值。
(1)插入全部字段
所有的字段名都写出来:
INSERT INTO 表名(字段名1,字段名2,字段名3...)VALUES (值1,值2,值3);
不写字段名:
INSERT INTO 表名(值1,值2,值3....);
具体实现:
-- 向表中插入数据
INSERT INTO stu (id,NAME,age,SEX) VALUES(1,'张三',18,'男');
INSERT INTO stu VALUES(1,'老子',100,'男');
SELECT * FROM stu;
(2)插入部分数据
INSERT INTO 表名(字段名1,字段名2...)VALUES(值1,值2...);
注:没有添加数据的字段就是NULL
-- 向表中插入数据
INSERT INTO stu (id,NAME,age,SEX) VALUES(1,'张三',18,'男');
-- 如果只向表中插入部分数据,必须写对应的列名
INSERT INTO stu (id,NAME,age) VALUES(1,'老子',100);
SELECT * FROM stu;
5.2 DOS 命令出现操作数据乱码问题
当我们使用DOS命令进行SQL命令进行SQL语句进行操作时,会有中文乱码的情况。
(1)INSERT 的注意事项:
插入的数据应与字段的数据类型相同。
数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
在values中列出的数据位置必须与被加入的列的排列位置相对应
字符和日期型数据应包含在单引号中。MySQL中也可以使用双引号做为分隔符。
不指定列或使用null,表示插入空值。
(2)乱码产生的原因
在客户端的编码默认为GBK,而在MySQL服务器端的编码为UTF-8。
(3)查看MySQL内部设置的编码。
查看包含character开头的全局变量
SHOW variables like 'character%';
执行结果:
(4)解决方案:
修改client、connection、results的编码为GBK,保证和DOS命令行编码保持一致。
单独设置 | 说明 |
set character_set_client=gbk; | 修改客户端的字符集为GBK |
set character_set_connection=gbk; | 修改连接的字符集为GBK |
set character_set_results=gbk; | 修改查询的结果字符集为GBK |
同时设置这三项的命令为:
SET names gbk;
注:DOS命令退出后,编码设置就失效了,每次都需要重新配置。
5.3 蠕虫复制
蠕虫复制:将一张已经存在的表中的数据复制到另一张表中。
(1)语法格式:
将表2 中所有的列复制到表名1中:
INSERT INTO 表名1 SELECT * FROM 表名2;
只复制部分列:
INSERT INTO 表名1(列1,列2) SELECT 列1,列2 FROM 表名2;
具体实现:
-- 创建表stu1
CREATE TABLE stu1 LIKE stu;
-- 将表stu 中的数据全部复制到stu1中
INSERT INTO stu1 SELECT * FROM stu;
-- 查看stu1中的数据
SELECT * FROM stu1;
-- 创建表stu2
CREATE TABLE stu2 LIKE stu;
-- 将表stu 中的数据全部复制到stu1中
INSERT INTO stu2(id,NAME,age) SELECT id,NAME,age FROM stu;
-- 查看stu2中的数据
SELECT * FROM stu2;
5.4 更新表记录
UPDATE 表名 SET 列名=值[WHERE 条件表达式]
UPDATE:需要更新的表名
SET:修改的列值
WHERE:符合条件的记录才会更新。
(1) 不带条件修改数据
-- 修改所有的行
UPDATE 表名 SET 字段名=值;
(2)带条件修改数据
UPDATE 表名 SET 字段名=值 WHERE [条件表达式];
具体现实:
-- 不带条件修改数据,将所有的年龄改成120
UPDATE stu2 SET age=120;
-- 查看stu2中的数据
SELECT * FROM stu2;
-- 不带条件修改数据,将name为张三的age改为18
UPDATE stu2 SET age=18 WHERE NAME='张三';
-- 查看stu2中的数据
SELECT * FROM stu2;
5.5 删除记录
DELETE FROM 表名 [WHERE 条件表达式];
如果没有指定WHERE 语句,MySQL表中所有的数据都会被删除。
(1)不带条件的删除;
DELETE FROM 表名;
(2) 带条件的删除。
DELETE FROM 表名 [WHERE 条件表达式];
(3)使用truncate 删除表中所有的记录
TRUNCATE TABLE 表名;
truncate 相当于删除表的结构,再创建一张表。
具体实现:
-- 带条件删除数据,删除age为18的记录
DELETE FROM stu2 WHERE age=18;
-- 查看stu2中的数据
SELECT * FROM stu2;
-- 不带条件删除数据,删除表中的所有数据
DELETE FROM stu2;
-- 查看stu2中的数据
SELECT * FROM stu2;
-- 使用truncate删除表中所有的记录
TRUNCATE TABLE stu1;
-- 查看stu1中的数据
SELECT * FROM stu1;
6.DQL查询表中的数据(数据查询语言)
查询不会对数据库中的数据进行修改,只是一种显示数据的方式
SELECT 列名 FROM 表名 [WHERE 条件 表达式];
(1) SELECT 命令可以读取一行或者多行记录
(2)可以使用 * 代表其他字段,SELECT 语句会返回表中的所有字段数据。
(3)可以使用WHERE 语句来包含任何条件
6.1 简单的查询
(1)查询所有行和列的数据
用*代表所有的列:
SELECT * FROM 表名;
(2)查询指定列
查询指定列的 数据,多个列之间用逗号分隔。
SELCET 字段1,字段2,字段3,....FROM 表名;
6.2 指定列的别名进行查询
(1)使用关键字
使用别名的好处: 显示的时候使用新的名字,并不修改表的结构。
(2)语法格式:
对列指定别名:
SELCET 字段名1 AS 别名,字段名2 AS 别名....FROM 表名;
对列和表同时指定别名:
SELCET 字段名1 AS 别名,字段名2 AS 别名...FROM 表名 AS 表别名;
具体实现:
-- 使用别名
select name as 姓名,age as 年龄 from student;
-- 表使用别名
select st.name as 姓名,age as 年龄 from student as st
6.3 清除重复值
查询指定列并且结果不出现重复数据
SELCET DISTINCT FROM student;
具体实现:
-- 查询学生的年龄
SELECT age FROM stu;
-- 去掉重复的记录
SELECT DISTINCT age FROM stu;
6.4 查询结果参与运算
(1)某列数据和固定值运算
SELECT 列名1+ 固定值 FROM 表名;
( 2)某列数据和其他数据参与运算
SELECT 列名1+列名2 FROM 表名;
注:参与运算的必须是数值类型。
具体实现:
-- 给所有的年龄+5
SELECT age+5 FROM stu;
-- 查询ID 和age之间的和
SELECT id+age FROM stu;
-- 将查询ID 和age之间的和 作为和
SELECT *,(id+age) AS 和 FROM stu;
6.5 条件查询
条件查询的语法:
SELECT 字段名 FROM 表名 WHERE 条件
准备数据:
创建一个学生表,包含以下列:
CREATE TABLE student(
id INT,-- 编号
NAME VARCHAR(30), -- 名字
age INT, -- 年龄
sex VARCHAR(20), -- 性别
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;
运算符:
比较运算符 | 说明 |
>、<、<=、>=、=、<> | <>在SQL中表示不等于,在mysql中也可以使用!= 没有== |
BETWEEN...AND | 在一个范围之内,如:between 100 and 200 相当于条件在100到200之间,包头又包尾 |
IN(集合) | 集合表示多个值,使用逗号分隔 |
LIKE '张%' | 模糊查询 |
IS NULL | 查询某一列为NULL的值,注:不能写=NULL |
具体实现:
-- 查询math分数大于80的学生
SELECT * FROM student WHERE math>80;
-- 查询english分数小于或等于80分的学生
SELECT * FROM student WHERE english<=80;
-- 查询age等于20岁的学生
SELECT * FROM student WHERE age=20;
-- 查询age不等于20岁的学生,注:不等于有两种写法
SELECT * FROM student WHERE age<>20;
SELECT * FROM student WHERE age!=20;
逻辑运算符:
逻辑运算符 | 说明 |
and 或 && | 与,SQL中建议使用前者,后者并不通用。 |
or 或 || | 或 |
not 或 ! | 非 |
具体实现:
-- 查询age大于35且性别为男的学生(两个条件同时满足)
SELECT * FROM student WHERE age>35 AND sex='男';
-- 查询age大于35或性别为男的学生(两个条件其中一个满足)
SELECT * FROM student WHERE age>35 OR sex='男';
-- 查询id是1或3或5的学生,两种写法
SELECT * FROM student WHERE id=1 OR id=3 OR id=5;
SELECT * FROM student WHERE id IN (1,3,5);
-- 查询id不是1或3或5的学生
SELECT * FROM student WHERE id NOT IN (1,3,5);
范围查询:
BETWEEN 值1 AND 值2;表示从值1到值2范围,包头又包尾。
比如:age BETWEEN 80 AND 100 相当于: age>=80 && age<=100;
like 关键字:LIKE 表示模糊查询。
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
MySQL 通配符:
通配符 | 说明 |
% | 匹配任意多个字符串 |
_ | 匹配一个字符 |
具体实现:
-- 查询english成绩大于等于75,且小于等于90的学生
SELECT * FROM student WHERE english>75 AND english<90;
SELECT * FROM student WHERE english BETWEEN 75 AND 90;
-- 查询姓马的学生
SELECT * FROM student WHERE NAME LIKE '马%';
-- 查询姓名中包含'德'字的学生
SELECT * FROM student WHERE NAME LIKE '%德%';
-- 查询姓马,且姓名有两个字的学生
SELECT * FROM student WHERE NAME LIKE '马_';