mysql
第1章 SQL语句
1-1 SQL语句分类
-
DDL(data Definition language)数据定义语言
用来定义数据库对象:数据库 表 列 关键词:create drop alter show
-
DML(data manipulation language)数据操作语言
用来对数据库中表的数据进行增删改 关键词:insert delete update
-
DQL(data Query language)数据查询语言
用来对数据中表的数据进行查询 关键词:select where
-
DCL(data Control language)数据控制语言
用来定义数据访问权限和安全级别 关键词:grant revoke
1-2 SQL语法规范
- sql可以单行或多行书写,以分好结尾
- sql语句里面的关键字大写
- 表名和字段尽可能使用反引号
- 当你写一些文本内容的时候的必须使用引号包裹
1-3 DDL语句
1-3-1 DDL操作数据库
创建数据库
-
直接创建数据库
CREATE DATABASE 数据库名;
-
判断是否存在并创建数据库
CREATE DATABSE IF NOT EXISTS 数据库名;
-
创建数据库并制定制定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;(jbk,ytf8..)
查看数据库
-
查看所有数据库
SHOW DATABASES
-
查看某个数据库的定义信息(创建时候的使用的sql语句)
SHOW CREATE DATABSE 数据库名
修改数据库
-
修改数据库的字符集格式
ALTER DARABASE 数据库名 DEFAULT CHARACTER 字符集;
删除数据库
-
删除数据库
DROP DATABASE 数据库名;
使用数据库
-
查看正在使用的数据库
SELECT DATABASE();
-
使用数据库
USE 数据库名;
1-3-2 DDL操作表和列
创建表
CREATE TABLE 表名(字段1 类型1, 字段2 类型2);
注意:写varchar需要在后面定义长度,不然会报错
CREATE TABLE table2(id int,name varchar(255),age int,sex char,address varchar(255));
查看表
-
查看某个库里的所有表
SHOW TABLES;
-
查看表结构
DESC 表名;
-
查看表创建的时候的sql语句
SHOW CREATE TABLE 表名;
快速创建一个表结构相同的表
CREATE TABLE 新表3 LIKE 旧表1;
删除表
-
删除表
DROP TABLE 表名;
-
判断表是否存在并删除表
DROPDES TABLE IF EXISTS 表名;
修改表结构
-
添加表列
ALTER TABLE 表名 ADD 列名 类型; ALTER TABLE student ADD age int;
-
修改类型
ALTER TABLE 表名 MODIFY 列名 类型;
-
修改列名
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;
-
删除列
ALTER TABLE 表名 DORP 列名;
-
修改表名
RENAME TABLE 旧表名 TO 新表名;
-
修改表字符集
ALTER TABLE 表名 character set 字符集;
1-4 DML语句
插入记录
-
插入全部字段
-
所有字段都写出来
INSERT INTO 表名 (字段1,字段2,字段3) VALUES (值1,值2,值3);
-
不写字段名
INSERT INTO 表名 VALUES (值1,值2,值3);
-
-
插入部分字段
INSERT INTO 表名 (字段1) VALUES (值1);
-
蠕虫复制 (把老表的数据迁移到新表,可以将原来数据也迁移过来,like关键字不可有)
INSERT INTO 新表 SELECT * FROM 旧表;
INSERT INTO 新表(id,name) select id,name FROM 旧表;
更新表记录
-
不带条件修改数据
UPDATE 表名 SET 字段名 = '值';
-
带条件修改
UPDATE 表名 SET 字段名 = '值' WHERE 字段名 = "值"
-
关键词说明
UPDATE 更新 SET 设置 WHERE 指定条件
删除表记录
-
不带条件删除
DELETE FROM 表名;
-
带条件删除
DELETE FROM 表名 WHERE 字段名 = '值';
1-5 DQL语句
查询表所有数据
SELECT * FROM 表名;
查询指定列
SELECT id,name FROM 表名;
别名查询
SELECT name AS 姓名, age AS 年龄 FROM 表名;
清楚重复值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBfSOuyX-1603866172092)(/Users/panchenyang/Library/Application Support/typora-user-images/image-20201027144307801.png)]
SELECT DISTINCT 字段1 FROM 表名; //按照name 就会剩一条
SELECT DISTINCT 字段1,字段2 FROM 表名; //按照name age 就会剩2条
查询结构参与运算
-
某列数据和固定值运算
SELECT 列名1 + 固定值 FROM 表
-
某列数据和其他列数据运算
SELECT 列名1 + 列名2 FROM 表
SELECT math_score+english_score AS 总成绩 FROM 表
-
查询所有数据 + 你还想得到的数据
SELECT *,math_score+english_score AS 总成绩 FROM 表
1-5 DCL语句
第2章 表的复杂查询
2-1 条件查询 => 比较运算符
> 大于
>= 大于等于
< 小于
<= 小于等于
= 等于
!= 不等于
SELECT * FROM 表名 WHERT 字段 = '值';
SELECT * FROM table4 WHERT id = 1;
SELECT * FROM table4 WHERT age >= 18;
2-2 条件查询 => 逻辑运算符和范围运算符
逻辑轮算符
and 多个条件同时满足 相当于&&
or 多个条件满足其中一条 相当于||
not 不满足 相当于!
SELECT * FROM table4 WHERE id = 1 AND age = 18;
SELECT * FROM table4 WHERE age > 18 OR sex = '男';
in not in 关键字
SELECT * FROM table4 WHERE id = 1, OR id = 3, OR id = 5;
SELECT * FROM table4 WHERE id in(1,3,5);//id 满足1,3,5的会被查询出来
//上面两句sql 查出来是一样的
SELECT * FROM table4 WHERE id not in(1,3,5);//id不满足1,3,5的会被查询出来
范围运算符
关键字: BETWEEN
BETWEEN 值1 AND 值2; //表示值1到值2的范围,包头又包尾
例: age BETWEEN 35 AND 75
相当于==> age>=35 && age<=75
SELECT * FROM table4 WHERE math_score BETWEEN 60 AND 100;
//查询table4 查询数学成绩 60 - 100 之剑的
2-3 条件查询 => 模糊查询
like模糊查询
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
SELECT * FROM table4 WHERE name LIKE '%潘%';
MYSQL通配符有两个
'%' : 表示匹配0个或多个字符(任意字符)
例:匹配笔记本
'%笔记本%' => 表示只要带笔记本三个字的,不管前后是什么 都能匹配上
'%笔记本' => 能匹配 苹果笔记本 外星人笔记本 但是不能匹配 苹果笔记本电脑
'笔记本%' => 能匹配 笔记本电脑 但是不能匹配 苹果笔记本电脑
'_' : 表示匹配一个字符,且必须出现
例:匹配人名
'潘_' => 可以匹配 潘晨 但是不能匹配 潘晨阳
'潘__' => 可以匹配 潘晨阳 但是不能匹配 潘晨
2-4 条件查询 => 结果排序
单列排序
SELECT * FROM 表名 WHERE 字段名<='值' ORDER BY 字段名 [ASC | DESC];
SELECT * FROM table4 WHERE age<=35 ORDER BY age ASC;
查询表table age大于35的 将他们安age升序排序
组合排序
SELECT * FROM 表名 WHERE 字段名<='值' ORDER BY 字段名1 [ASC | DESC],字段名2 [ASC | DESC];
SELECT * FROM table4 WHERE age<=35 ORDER BY age ASC , math_score DESC;
//查询table4表,age大于35的 按age升序排序 如果age一样 按照数学分数降序排列
2-5 条件查询 => 聚合函数
之前我们做的都是横向查询,他们都是根据条件一行一行的查询进行判断,而是用聚合函数是纵向查询,他是对一列的值进行计算,然后返回一个结果值,另外聚合函数会忽略空值。
五个聚合函数
- count 统计指定列记录数,记录为null的不统计
- sum 计算指定列的数值和,如果不是数值类型,计算结果为0
- max 计算指定列的最大值
- min 计算指定列的最小值
- avg 计算指定列的平均值,如果不是数值类型,计算结果为0
聚合函数的使用: 写在sql语句select后 字段名的地方
SELECT 字段名.. FROM 表名;
SELECT COUNT(age) FROM 表名;
2-6 条件查询 => 分组查询
分组查询是指使用group by语句对查询信息进行分组,比如将男人分一组,女人分一组
分组的目的是为了统计,一般分组回合聚合函数一起使用
分组后聚合函数的作用?不是操作所有数组,而是操作一组数据
//语法
SELECT * FROM 表名 GROUP BY 分组字段 [HAVING 条件];
//会将sex相同的作为一组 但是只会返回每一组的第一条 无意义
SELECT * FROM table1 GROUP BY sex;
//配合聚合函数
SELECT SUM(math),sex GROUP BY sex;//返回男生数学成绩总和 和 女生数据成绩总和
//查询表4,年龄小于30的 按照性别分组 返回男生有多少 女生有多少
SELECT COUNT(*),sex FROM table4 where age<30 GROUP BY sex;
//查询年龄大于25的人,按性别分组,统计每组人数,并且只显示性别人数大于2的。
SELECT COUNT(*),sex FROM table4 WHERE age<25 GROUP BY sex HAVING COUNT(*)>2
having 和 where的区别?
- where是分组前对数据进行过滤 having是后
- where后不可以使用聚合函数 having可以
2-7 条件查询 => Limit分页
limit是限制的意思,所以他的作用就是限制查询记录
SELECT *|字段列表 [AS 别名] FROM 表名 [WHERE 语句] [GROUP BY 语句] [having语句] [ORDER BY语句] [LIMIT 语句]
LIMIT 语法格式
LIMIT offset,length; 或者 LIMIT length;
offset : 偏移量,可以理解为可以跳过几条数据 默认为0
length : 需要显示的总记录条数
//查询一张表 从第3条开始显示,一共显示6条 ==>需要跳过2条 显示6条
SELECT * FROM table4 LIMIT 2,6
//查询一张表 从第2条开始显示,显示到第5条为止 ==>跳过1条,显示4条
SELECT * FROM table4 LIMIT 1,4
第3章 数据库的约束
对表的数据进行进一步的限制,保证数据的正确性,有效性 和 完整性
约束种类
primary key 主键 auto_increment 自增 truncate删除
unique 唯一
not null 非空
default 默认
foreign key 外键
3-1 主键约束
主键的作用
-
用来唯一表示一条记录,每张表都应该有一个主键,并且每个表只能有一个主键
-
有些时候,表的数据的name age sex …字段都一样时,就无法区分这些数据,造成数据库的记录不唯一,这样不方便管理数据
-
那些字段应该作为表的主键?
通常不做业务字段作为主键,单独给每张表设计一个id字段,把id作为主键,主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键没有含义没有关系,只要不重复,非空就行
-
主键特点
- 不能重复
- 不能为空
创建主键
关键词 : primary key
//创建表的时候 给id字段加主键
CREATE TABLE table1(
id in primary key,
name varchar(20),
age int
)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TIVfJ8gL-1603866172095)(/Users/panchenyang/Library/Application Support/typora-user-images/image-20201028102124202.png)]
上图下面一条数据,加不进去,因为主键重复
删除主键
ALTER TABLE 表名 DROP primary key;
主键自增
数据库自动生成主键字段的值 ==> auto_increment
关键词 : auto_increment
//创建表的时候 给id字段加主键 并且自增
CREATE TABLE table1(
id in primary key auto_increment,
name varchar(20),
age int
)
auto_increment的默认值为1,如果希望修改起始值
ALTER TABLE 表名 auto_increment=1000;
DELECT 和 TRUNCATE 的区别?
- delect删除表数据,但是不重置auto_increment的值
- truncate是摧毁表,重建表,auto_increment的值重置为1
3-2 唯一约束
这张表中的这个字段的值不能重复
关键词 : unique
//创建表 给name字段设置唯一约束,不能出现同名的
CREATE TABLE table1(
id int primary key auto_increment,
age int,
name varchar(10) unique
)
3-3 非空约束
关键词 : not null
//创建表 设置id为主键 自增 设置name字段为唯一 age字段为非空
CREATE TABLE hero (
id int primary key auto_increment,
name varchar(10) unique,
age int not null
)
3-3 默认值的设置
关键词 : default
//创建表 设置id为主键 自增 设置name字段为唯一 age字段为非空 score字段默认为0
CREATE TABLE student(
id int primary key auto_increment,
name varcgar(20) unique,
age int not null,
score int default 0
)