创建数据库`
CREATE DATABASE python
查看数据库`
show create DATABASE python
切换数据库
USE test
查看当前数据库
SELECT DATABASE();
修改数据库
ALTER DATABASE 库名
删除数据库
drop database python
查看所有数据库
show DATABASES
示例
– 创建完整创建
– UNSIGNED 无符号
– primarykey 主键
– auto_increment 自动增长
create table stus( id int UNSIGNED PRIMARY key auto_increment, name VARCHAR(20), age VARCHAR(20) );
数据增删改查
新增数据
1.数据值需要和表的字段一一对应(数据个数及数据类型)
2.主键列是自增长,插入时需要占位,通常使用0或者default或者null来进行占位,插入成功后以实际数据为准
增加数据
新增多条数据可以用逗号隔开
INSERT INTO stus VALUE(0,'张三',20)
增加部分数据值
INSERT into stus(name,age)VALUES('李四',30)
修改数据
UPDATE stus set name='张三五' where id=2;
– 删除数据
delete from stus where id =3
扩展删除
其他的数据 删除方法(删除所有数据,不重置数据主键字段的计数)
DELETE from stus
(截断表)删除数据,保留表结构 (删除所有数据,重置数据主键字段的计数)
truncate TABLE stus
drop tabel 表名 (删除表,删除表数据和表结构)
drop TABLE stus
查询数据
条件查询
select * from students
查询年龄在大于10的并且来自1班的 (逻辑运算符 and与 or或 not 非)
select * from students where age >10 and class='1班'
补充需求 查询年龄在大于10的不来自1班的
select * from students where not class='1班' and age >10
not 与 and 和 or(左边两边双边链接) 不同之处在于not 只对自己右侧的条件右作用(单边链接)
select * from students where age >10 and not class='1班'
模糊查询 like
示例:查询数据中带有南字的地区
select * from students where homeown like '%南%' (查询字段中包含“南“的字段) select * from students where homeown like '%南' (查询字段中以“南“的字段结尾) select * from students where homeown like '_南' (查询字段中只有一个字符的且包含"南"的字段)
查询年龄在 10 和30岁之间的
非连续性 in()
in常用于where表达式中,其作用是查询某个范围内的数据。
select * from students where age in ('20','18')
连续性的between … and …
select * from students where age between 10 and 30
注意在MySQL中,只有显示为null的 才为空!其余空白可能是空格/制表符/换行符
判断空 为空 is null 不为空 is not null
select * from students where card is null;
– 查询不为空的卡号
关键字:is not null
select * from students where card is not NULL;
排序
– order by 列名 asc 从小到大排序 升序
– order by 列名 desc 从大到小排序 降序
– 按照年龄从大到小排序,年纪相同时,按照班级排序
select * from students order by age DESC;
select * from students order by age DESC,class asc;
默认升序排序为升序 ,asc 可以省略
select * from students order by age DESC,class ;
– 聚合函数:系统用来统计函数
– 不能在where 子句中使用
– count() 查询记录数
– max() 查询最大值
– min() 查询最小值
– sum() 求和
– avg() 求平均值
学生总数
select COUNT(*) from students
– 注意 统计数据总数,建议使用* 如果使用某一天特定字段。肯定会造成数据总数错误
select COUNT(*) from students
** 最高年龄的学生**
select max(age) from students
最小年龄
select min(age) from students
avg 年龄平均
select avg(age) from students
总数
select sum(age) from students where homeown like '%南%'
一次性查询
select count(*),max(age),MIN(age) ,avg(age) FROM students
GROUP BY 分组
查询有几个班级
注意:在使用哪个字段进行分组操作,那么只字段该字段可以在* 的位置使用
分组操作和聚合函数配合使用
select COUNT(*) from students group by class ;
select class,COUNT(*) from students group by class ;
– 扩充
– having 后面的条件可以用聚合函数,where 后面不可以
– 注意 where 和having 的区别
– group by 和having 一般下需要配合使用
– group by 后边不推荐使用where 进行条件过滤
– having 后侧可以使用的内容与where 完全一致(比较运算符 逻辑运算符 /模糊运算符 模糊查询 /判断空)
– having 关键字后面允许使用聚合函数
查询当前表第5-10行的所有数据
分页 select * from students limit start ,count
limt 分页;start 起始行号 ;count :数据行数
计算机技术从0开始,因此start 默认的第一条数据应该为0
过度需求:获取前5条数据
select * from students limit 0,4;
注意:如果默认从第一条数据开始获取,则0可以省略
select * from students limit 5
需求
select * from students limit 4,6
扩展根据公式计算显示某页的数据
已知:每页显示m条数据,求:显示第n页的数据
– select * from students limit (n-1)*m,m
示例 每页显示4条数据,求展示2页的数据内容
select * from students limit 4,4
扩展二:分页
需求查询年龄最大的学生信息
SELECT * from students ORDER BY age DESC LIMIT 1
需求查询年龄最大前三位的学生信息
SELECT * from students ORDER BY age DESC LIMIT 3
内连接 innner JOIN
显示效果,两张表中有对应关系的数据都显示出来,没有对应关系的数据均不再显示
select * from goods inner join category on goods.typeld=category.typeId
扩充:给表 起别名(缩短表名利于缩写 2用别名给表创建副本)
select * from goods go inner join category ca on go.typeld=ca.typeId
扩展:内连接的另一种写法(旧式写法)
select * from goods,category where goods.typeld=category.typeId
左连接
查询所有商品信息,包括商品分类
left joio
注意;如果要保证一张数据表的全部数据都存在,则一定不能选择内连接,
可以选择左连接或者右连接
说明 : 以left join 关键字为界。关键字左侧表为主表(都显示),
而关键字右侧的表为从表(对应内容显示,不对应为null)
select * from goods go left join category ca on go.typeld=ca.typeId
扩展需求:以分类为主展示所有内容
select * from category ca left join goods go on ca.typeId=go.typeld
查询所有商品分类及其对应的商品信息
说明 : 以right join 关键字为界。关键字右侧表为主表(都显示),
而关键字右侧的表为从表(对应内容显示,不对应为null)
select * from goods go right JOIN category ca on go.typeld=ca.typeId
扩充需求:查询所有商品信息及其对应分类信息
select * from goods go right JOIN category ca on go.typeld=ca.typeId
说明 :能够体现左右连接必要性的场景为:至少为三张表进行连接查询
注意: 实际工作中,最多也就三张表连接查询
自关联
前提 1 数据表自由一张 2数据表至少右两个字段之间有种联系
方式 :通过给表起别名的形式,将原本只有一张的数据表变为两张,
然后通过对应字段实现连接查询即可
河南所有的市
使用内连接
SELECT * from areas a1 INNER JOIN areas a2 on a1.aid=a2.pid where a1.atitle like '%河南省%'
左连接
SELECT * from areas a1 left JOIN areas a2 on a1.aid=a2.pid where a1.atitle like '%河南省%'
查询河南省所有的市和区
想要实现三级新政单位显示,需求分别处理省和市及市和区(三表联查)
select * from areas a1 left join areas a2 on a1.aid=a2.pid left join areas a3 on a2.aid=a3.pid where a1.atitle='河南省'
子查询
再一个select 玉娟中,嵌入了另外一个slect 语句,那么嵌入的select 语句称之为子查询语句
子查询是辅助主查询的,要么充当条件,要么充当数据源
查询
查询价格高于平均价格的商品信息
求取平均价
select avg(price) from goods
说明: 充当子查询的语句需要使用括号括起来(运输优先级最高!)
SELECT * from goods where price >(select avg(price) from goods)
查询所有来自并喜喜的商品信息,包括商品分类
子查询语句充当数据源
seleCt * from goods where company='井タタ'
select * from (select * from goods go left join category ca on go.typeld=ca.typeId) new where new.company='井タタ';
注意连接查询的结果中,表和表之间的字段名不能出现重复,否正无法直接使用
解决:将重复字段使用别名加以区分(表名。*:当前所有字段)
select * from (select go.*,ca.id cid,ca.typeId ctid,ca.cateName from goods go left join category ca on go.typeld=ca.typeId) new where new.company='井タタ';