结构化查询语言(Structured Query Language)简称SQL
SQL语句就是对数据库进行操作的一种语言
1、DDL(Data Definition Language) 数据定义语言 用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter等
2、DML(Data Manipulation Language) 数据操作语言 用来对数据库中表的数据进行增删改。关键字:insert, delete, update等
3、DQL(Data Query Language) 数据查询语言 对数据库进行数据查询,关键字select
4、DCL(Data Control Language)数据控制语言(了解)是用来设置或更改数据库用户或角色权限的语句,这个比较少用到
1、SQL语句可以单行或多行书写,以分号结尾
2、可使用空格和缩进来增强语句的可读性
3、MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
单行注释: - - 注释
多行注释: /注释 /
MYSQL特有的单行注释:# 注释
1、直接创建数据库
CREATE DATABASE 数据库名;
2、判断是否存在并创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名;
3、创建数据库并指定字符集(编码表)
CREATE DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;
1、查看所有的数据库
SHOW DATABASES;
2、查看某个数据库的定义信息
SHOW CREATE DATABASE 数据库名;
1、修改数据库字符集
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 新字符集;
2、删除数据库
DROP DATABASE 数据名;
1、查看正在使用的数据库
SELECT DATABASE();
2、使用/切换数据库
USE 数据库名;
1、创建表
CREATE TABLE 表名(
字段名 数据类型,
字段名 数据类型
);
2、快速创建一个表结构相同的表,只是表没有数据
CREATE TABLE 表名 LIKE 其他表;
1、查看某个数据库中的所有表
SHOW TABLES;
2、查看表结构
DESC 表名;
3、查看创建表的SQL语句
SHOW CRETE TABLE 表名;
1、直接删除表
DROP TABLE 表名;
2、判断表是否存在并删除表
DROP TABLE IF EXISTS 表名;
1、添加一列(字段)
ALTER TABLE 表名 ADD 字段名 字段类型;
2、修改列类型(MODIFY只能修改类型)
ATLER TABLE 表名 MODIFY 字段名 新的类型;
3、修改列名(CHANGE可以同时修改字段和类型)
ALTER TABLE 表名 CHANGE 老字段名 新字段名 类型;
4、删除列
ALTER TABLE 表名 DROP 字段名;
5、修改表名
RENAME TALBE 旧表名 TO 新表名;
6、修改表的字符集
ALTER TABLE 表名 DEFAULT CHARACTER SET 新字符集;
DML是对表中的数据进行增删改
-- 所有的字段名都写出来:
INSERT INTO 表名 (字段名1, 字段名2...) VALUES (字段值1, 字段值2);
-- 不写字段名
INSERT INTO 表名 VALUES (字段值1, 字段值2);
-- 同时参入多个条记录
INSERT INTO 表名 VALUES (字段值1, 字段值2),(字段值1, 字段值2),(字段值1, 字段值2);
-- 只需要指定要插入数据的字段,没有添加数据的字段会使用NULL
INSERT INTO 表名 (字段名1, 字段名2...) VALUES (字段值1, 字段值2);
1、值与字段必须对应,个数相同,类型相同
2、值的数据大小必须在字段的长度范围内
3、除了数值类型外,其它的字段类型的值必须使用引号引起。(建议单引号)
4、如果要插入空值,可以不写字段,或者插入null
/*
在dos命令窗口执行sql操作的时候,由于MySQL的客户端设置编码是utf8,
而系统的DOS命令行编码是gbk,编码不一致会导致乱码问题
以下方式为临时方案,退出DOS命令行就失效了,需要每次都配置
*/
set names gbk;
UPDATE 表名 SET 字段名=新的值;
UPDATE 表名 SET 字段名=新的值 WHERE 条件;
DELETE FROM 表名 WHERE 字段名=值;
DELETE FROM 表名;
-- 扩展delete和truncate的区别
-- delete只删除数据,不会重置主键的值,比如删表前最后的id=100,那么重新插入数据会从id=101开始
DELETE FROM st6;
INSERT INTO st6 (NAME,age) VALUES ('哈吉',21),('敬理',23),('王大',29);
-- truncate删除这张表,在创建一张一样的表,主键重置,比如删表前最后的id=100,那么重新插入数据会从id=1开始
TRUNCATE st6;
INSERT INTO st6 (NAME,age) VALUES ('哈吉',21),('敬理',23),('王大',29);
查询不会对数据库中的数据进行修改,只是一种显示数据的方式
1、写出查询每列的名称
SELECT 字段名1, 字段名2,... FROM 表名;
2、使用*表示所有列
SELECT * FROM 表名;
SELECT 字段名1, 字段名2 FROM 表名;
-- AS可以省略,使用别名的好处是方便观看和处理查询到的数据
SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名 AS 表别名;
SELECT DISTINCT 字段名 FROM 表名;
参与运算的必须是数值类型
1、某列数据和固定值运算
SELECT 字段名 + 数值 FROM 表名;
2、某列数据和其他列数据参与运算
SELECT 字段1 + 字段2 FROM 表名;
将一张表的数据复制,插入到另一张表中
INSERT INTO 表名1 SELECT * FROM 表名2;
1、创建student2表,student2结构和student表结构一样
CREATE TABLE student2 LIKE student;
2、将student表中的数据添加到student2表中
INSERT INTO student2 SELECT * FROM student;
注意事项:如果只想复制student表中name,age字段数据到student2表中使用如下格式
INSERT INTO student2(NAME, age) SELECT NAME, age FROM student;
SELECT 字段 FROM 表名 WHERE 条件;
> -- 大于
< -- 小于
<= -- 小于等于
>= -- 大于等于
= -- 等于
<>、!= -- 不等于
and(&&) -- 多个条件同时满足
or(||) -- 多个条件其中一个满足
not(!) -- 不满足,取反
1、in里面的每个数据都会作为一次条件,只要满足条件的就会显示
2、格式:
SELECT * FROM 表名 WHERE 字段名 IN (值1, 值2, 值3);
1、范围包括头也包括尾
2、格式:
SELECT * FROM 表名 WHERE 字段名 BETWEEN 值1 AND 值2;
1、格式
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
2、说明
满足通配符字符串规则的数据就会显示出来
-- MySQL通配符有两个:
% 表示任意多个字符
_ 表示一个字符
1、格式
SELECT * FROM 表名 WHERE 条件 ORDER BY 字段名 [ASC|DESC];
[]表示可以不要
|表示二选一
ASC: 升序(默认的)
DESC: 降序
单列排序就是使用一个字段排序
-- 按照年龄的降序查询学生所有的信息
select * FROM student order by age DESC;
组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推
1、格式
SELECT * FROM 表名 WHERE 条件 ORDER BY 字段名 [ASC|DESC], 字段名 [ASC|DESC];
-- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
SELECT * FROM student ORDER BY age DESC, math DESC;
聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值NULL。
-- 五个聚合函数:
count: 统计指定列记录数,记录为NULL的不统计
sum: 计算指定列的数值和,如果不是数值类型,那么计算结果为0
max: 计算指定列的最大值(要求是数值类型才计算)
min: 计算指定列的最小值(要求是数值类型才计算)
avg: 计算指定列的平均值(要求是数值类型才计算)
1、格式
SELECT 聚合函数 FROM 表名 WHERE 过滤条件;
-- 注意:统计数量常用*号
SELECT COUNT(*) FROM student;
对查询后的结果进行分组
SELECT * FROM 表名 WHERE 条件 GROUP BY 字段名;
上面的SQL会将sex相同的数据作为一组,然后返回每组的第一条数据
GROUP BY将分组字段的相同值作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。
分组后聚合函数的作用:不是操作所有数据,而是分别操作每组数据。
一般按什么字段名分组,SELECT后面就写什么字段名
SELECT SUM(math), sex FROM student3 GROUP BY sex;
执行上面SQL后效果如下:
实际上是将每组的math进行求和,返回每组统计的结果
需求:查询年龄大于25岁的人,按性别分组,统计每组的人数
1.先过滤掉年龄小于25岁的人
2.再分组
3.最后统计每组的人数
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex;
注意事项:对于分组后的条件需要使用having子句(WHERE先执行,然后执行GROUP BY,最后才执行HAVING)
-- having与where的区别
having是在分组后对数据进行过滤
where是在分组前对数据进行过滤
having后面可以使用聚合函数
where后面不可以使用聚合函数
1、格式
-- offset 跳过的记录数,不写则默认为0。
-- length 要显示的总记录数
SELECT * FROM 表名 WHERE 条件 LIMIT offset, length;
-- 跳过前面2条,显示(取)6条数据
SELECT * FROM student3 LIMIT 2,6;
SELECT 字段名 FROM 表名 WHERE 条件 GROUP BY 分组列名 HAVING 条件 ORDER BY 排序列名 LIMIT 跳过的行数, 显示的行数;
-- 顺序如下
1.FROM: 从哪个表中获取数据
2.WHERE: 过滤表中的数据
3.GROUP BY: 将过滤后的数据进行分组
4.HAVING: 对分组后的数据再进行过滤
5.SELECT: 获得结果集(过滤、分组之后的数据-- 看做是一张新的表)
6.ORDER BY: 将结果集按照某种顺序对数据进行排序
7.LIMIT: 将排序后的数据分页显示
注意:GROUP BY之后计算SELECT后面的集合函数
对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性
PRIMARY KEY: 主键约束
UNIQUE: 唯一约束
NOT NULL: 不为空
DEFAULT: 默认约束
FOREIGN KEY: 外键约束 (笔记在多表的查询)
每张表都应该有一个主键,并且每张表只能有一个主键
== 区分表中的记录==
通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行
主键必须唯一,不能重复
主键不能为NULL
CREATE TABLE 表名 (
字段名 字段类型 PRIMARY KEY,
字段名 字段类型
);
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
ALTER TABLE 表名 DROP PRIMARY KEY;
CREATE TABLE 表名 (
字段名 字段类型 PRIMARY KEY AUTO_INCREMENT,
字段名 字段类型
);
注意事项:AUTO_INCREMENT表示自动增长(修饰的字段类型必须是整数类型)
默认地AUTO_INCREMENT 的开始值是1,如果希望修改起始值,请使用下列SQL语法
ALTER TABLE 表名 AUTO_INCREMENT=起始值;
这个字段的值不能够重复
CREATE TABLE 表名 (
字段名 字段类型 UNIQUE,
字段名 字段类型
);
限制表中数据不能为空
CREATE TABLE 表名 (
字段名 字段类型 NOT NULL,
字段名 字段类型
);
1.一张表只能有一个主键,可以有多个唯一非空的字段
2.主键可以自动增长,普通字段不行
如果这个字段不设置值,就使用默认值。
CREATE TABLE 表名 (
字段名 字段类型,
字段名 字段类型 DEFAULT 默认值
);