Mysql数据类型
- 数值
- 整形
int tinyint
- 浮点型
float double
表示的精度不同
float 6位有效,double 16
- decimal 浮点型,用来更加精确的保存小数
- 字符串
- char: 255个字符, 固定大小
- varchar: 65535 字节,不固定(可变)
- text: 64Kb
- 枚举
- enum() 1-2个字节存储数据
- enum("值1","值2",.....)
- 时间
- date 年月日
- datetime 年月日 时分秒
- time 时分秒
数据库的操作
-- 退出数据库
exit
quit
ctrl + d
-- 查看当前使用的数据库
select database();
-- 查看当前使用的数据库
select database();
-- 指定编码的数据库创建
create database python_db1 charset=utf8;
-- 查看创建数据库的语句
-- show create database ....
show create database python_db;
-- 删除数据库
-- drop database 数据库名;
drop database python_db;
SQL命令-表结构的创建
-- 创建 classes 表(id、name)
create table classes(
id int unsigned primary key auto_increment,
name varchar(10) not null,
num tinyint
);
-- 查看表结构
-- desc 数据表的名字;
desc classes;
-- 查看表的创建语句
-- show create table 表名字;
show create table students;
完整性约束条件primary key、auto_increment
- primary key
值不重复且值具有唯一性。主键不能为空 - auto_increment
(1)通过设置主键进行自增长,默认从1开始,每次+1
(2)一个表中只能有1个自增长字段,而且自增长的字段一定配合主键使用,也就是说“被标识为自增长的字段,一定是主键,但是主键不一定是自增长的”。
(3)自增长只对整数类、整数列有效,对字符串无意义。
insert into classes values(1,'王定',8); #向classes表中自己给定自增长列的值为1
insert into classes values('王定',8); #直接插入classes的值,id自动填充值为2
insert into classes values(null,'王定',8); #用null也可以,id自动填充3
insert into classes values(default,'王定',8); #用default也可以,id自动填充4
SQL命令-表结构的修改
-- 修改表-添加字段 生日 datatime
-- alter table 表名 add 列名 类型;
alter table students add birthday datetime;
-- 修改表-修改字段:不重命名版
-- alter table 表名 modify 列名 类型及约束;
alter table students modify birth date not null;
-- 修改表-修改字段:重命名版
-- alter table 表名 change 原名 新名 类型及约束;
alter table students change birthday birth datetime;
-- 修改表-删除字段
-- alter table 表名 drop 列名;
alter table students drop birth;
-- 删除表
-- drop table 表名;
drop table students;
SQL命令-表数据的增删改查
-- 全列插入
-- insert [into] 表名 values(...)
-- 主键字段 可以用 0 null default 来占位
-- 向classes表中插入 一个班级
insert into classes values(1, 'python20', 70);
-- 部分插入
-- insert into 表名(列1,...) values(值1,...)
insert into students(id, name) values(null, '司马狗剩');
-- 多行插入
insert into students values(null, '欧阳铁娃', 18, 1.78, '妖', 1),(null, '诸葛铁锤', 18, 1.78, '妖', 1);
-- 修改
-- update 表名 set 列1=值1,列2=值2... where 条件;
-- 全部修改
update students set age = 38;
-- 按条件修改
update students set age = 88 where name = '司马狗剩';
-- 查询基本使用
-- 查询所有列
-- select * from 表名;
select * from students;
---定条件查询
select * from students where name='司马狗剩';
-- 查询指定列
-- select 列1,列2,... from 表名;
select id,name from students;
-- 可以使用as为列或表指定别名
-- select 字段[as 别名] , 字段[as 别名] from 数据表;
select id as '编号', name as '姓名' from students;
-- 删除
-- 物理删除
-- delete from 表名 where 条件
delete from students where id = 2;
-- 逻辑删除
-- 用一个字段来表示 这条信息是否已经不能再使用了
-- 给students表添加一个 is_delete 字段 bit 类型 默认为0
alter table students add is_delete bit default 0;
-- bit 类型,智能保存 0 或者 1
-- is_delete = 1 逻辑删除
update students set is_delete = 1 where id = 3;
-- 数据库备份与恢复(了解)
-- mysqldump –uroot –p 数据库名 > python.sql;
-- mysql -uroot –p 新数据库名 < python.sql;
where
- 比较运算
> 、< 、>=、<=、=、!=或<>
select * from where age <> 18 ; # 所有年龄不等于18岁的学生
- 逻辑运算
and、or、not
- 模糊查询(like)
% 表示任意0个或多个
_ 任意一个字符
-- 查询姓名中 有 "小" 所有的名字
select * from students where name like '%小%';
-- 查询有2个字的名字
select * from students where name like '__';
-- 查询至少有2个字的名字
select * from students where name like '__%';
- 范围查询
in
用于非连续的范围的查询,相等于 多个值的 or (或) 关系
between 起始 and 终值
连续,包含起始值和终值,是一种 and(与) 关系
-- in (1, 3, 8)表示在一个非连续的范围内
-- 查询 年龄为18、34的姓名
select name from students where age in (18,34)
-- between ... and ...表示在一个连续的范围内
-- 查询 年龄在18到34之间的的信息
select * from students where age between 18 and 34;
- 空值判断
is null 表示判断值为空
is not null 判断值非空, 错误写法:not is null
- order排序
order by 排序字段1 排序规则, 字段2 规则2,.....
-- asc从小到大排列,即升序(默认排序规则)
-- desc从大到小排序,即降序
-- 查询年龄在18到34岁之间的女性,身高从高到矮排序
select * from students where age between 18 and 34 and gender='女' order by height desc;
聚合函数
聚合函数:聚合函数会对当前所在表当做一个组进行统计
常见的聚合函数:
count(*) 统计数量
max(字段) 找出该字段的最大值
min(字段) 找出该字段的最小值
sum(字段) 对该字段求和
avg(字段) 对该字段求平均值
四舍五入的函数: round(数值,保留的小数位数)
-- 计算班级学生的总数
select count(*) from students;
select count(*) '总人数' from students;
-- 查询女性的最高 身高
select max(height) from students where gender='女';
-- 计算男性的平均身高 保留2位小数
select round(avg(height),2) from students where gender = '男';
去重(distinct)
select distinct cate_name from goods;
group分组
group by + 聚合函数,分组统计/计算
group by + group_concat() 分组 + 内容链接为一个字符串
group by + with rollup 分组 + 小计
- having和where的区别:
- 作用的对象不同。where子句作用于表和视图,having 子句作用于组。
- having可以用聚合函数 ,where不能。因为where 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 having在分组和聚集之后选取分组的行。因此,WHERE 子句不能包含聚集函数 。
如:having sum(qty)>1000 (正确) where sum(qty)>1000 (错误)
-- group by
-- 按照性别分组,查询所有的性别
select gender from students group by gender;
-- 注意下面这种查询会失败
select name,gender from students group by gender;
-- 计算每个年龄中的人数
select age, count(*) from students group by age;
-- 查询同种性别中的姓名
select gender, group_concat(name) from students group by gender;
-- 查询平均年龄超过30岁的性别=
select gender, avg(age) from students group by gender having avg(age) > 30;
-- with rollup 汇总的作用(了解)
select gender, count(*) from students group by gender with rollup;
limit限制记录
- limit 数据有很多,只取指定数量的数据
- 表中的数据,位置默认从 0 开始
- limit 使用格式: limit 起始位置, 连续取的数目;
- limit 一定要写到 SQL 语句的最后面
注:
在ms sql server中或access中,若要查询前10条记录,使用top 10即可
但在mysql中不支持这个写法,它用limit 10。
LIMIT可以实现top N查询,也可以实现M至N(某一段)的记录查询
-- 检索记录行 6-15
select * from table limit 5,10;
注:标准的SQL书写格式
select 字段1,字段2,...
from 表名
[where 条件]
[group by 字段名]
[order by 字段名 排序规则]
[having 条件]
[limit 起始位置,数量]
连接
- 内连接:查询的结果为两个表匹配到的数据,默认是笛卡尔积
- 关键字 inner join
- select 字段 from 表1 inner join 表2 where/on 表1.字段 = 表2.字段
- 外连接
- 左外连接 主表 left join 从表
- 左外连接另外一个表,在从表中没有找到匹配,右侧补 NULL
- 右外连接 从表 right join 主表
- 右外连接一个表,在从表中没有找到匹配,左侧补 NULL
-- 查询 有能够对应班级的学生以及班级信息
select * from students inner join classes where students.cls_id = classes.id;
-- 给数据表起名字
select s.name, c.name from students s inner join classes c where s.cls_id = c.id;
-- 内连接的另外一种写法
select s.name, c.name from students s, classes c where s.cls_id = c.id;
-- 查询没有对应班级信息的学生
select students.* from students left join classes on students.cls_id = classes.id where classes.id is null;