在Linux下的数据库路径是在 var/lib/mysql
一定要切换到超级管理员下才可以进入
关系型数据库:
服务端的安装:
sudo apt-get install mysql-server
启动服务
sudo service mysql start
查看进程中是否存在MySQL服务
ps ajx|grep mysql
停止服务
sudo service mysql stop
重启服务
sudo service mysql restart
卸载MySQL
sudo apt-get remove mysql-*
清理残留的数据
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
命令行操作数据库:
链接数据库:
连接远程数据库:
mysql -h 127.0.0.1 -uroot -p
windows下
mysql -uroot -p
Linux下
mysql -uroot -pmysql
退出系统: exit/quit/CTRL+D
查看数据库 show databases;
mysql里不区分大小写
显示时间 select now()
查看数据库版本 select version();
创建数据库 create database study;
创建新的数据库编码以utf-8 create database new_study charset=utf8;
查看数据库 show create database new_study;
删除数据库:drop database study
数据库表的操作及使用数据库:
使用数据库 use 数据库名;
查看当前使用的数据库 : select database();
数据库的操作:
查看当前数据库所有的表 show tables;
创建数据表 create table xxxx(id int,name varchar(30));
查看数据库表的结构 desc xxxx
创建students表(id,name.age,high,gender,cls_id):
create table students(
id int unsigned not null auto_increment primary key,
name char(30),
age tinyint unsigned,
high decimal(5,2),
gender enum("男","女","中性","保密") default “保密”,
cls_id int unsigned
);
SQL语句中各个定义的意义:
类型 | 字节大小 | 有符号范围 | 无符号范围 |
---|---|---|---|
tinyint | 1 | -128~127 | 0~256 |
smallint | 2 | -32768~32767 | 0~65535 |
mediumint | 3 | -8388608~8388607 | 0~16777215 |
int/integer | 4 | -2147483648~2147483647 | 0~。。。。。 |
bigint | 8 | 特别大。。。 | 更大了 |
常用数据类型:
整数: int
小数:decimal
字符串:varchar char
日期时间: date time datetime
枚举类型: enum
char表示固定的字符串 如char(3) 如果填充为 “ab” 则会在后面补充一个空格,而varchar则不会
default 默认值
unsigned 没有符号的整型
primary 设置主键
日期事件类型
类型 | 字节大小 | 示例 |
---|---|---|
date | 4 | 2020-01-01 |
time | 3 | 12:59:59 |
datetime | 8 | 2021-01-01 12:59:59 |
year | 1 | 2017 |
timestamp | 4 | 1970-01-01 00:00:01 |
插入数据: insert into students values(0,"老王",18,188,"男",0);
查看表的数据: select * from students;
例子(创建一个班级表 id name):
create table classmates(
id int unsigned not null auto_increment primary key,
name varchar(3));
插入数据:
insert into classmates values(0,"计算机一班")
查看数据:
select * from classmates;
增
修改表 添加字段 alter table 表名 add 列名 类型;
例子: alter table students add birthday datetime
修改表 修改字段 重命名版
alter table 表名 change 原名 新名 类型及约束;
例子:alter table students change birthday birth datetime not null;
示例:这个也可以写默认值
例子: alter table students change birthday birth date default "2000-01-01";
修改表 修改字段 不重命名版
alter table 表名 modify 列名 类型及约束;
例子:alter table students modify birth date not null;
修改表 删除字段
alter table 表名 drop 列名;
例子:alter table students drop birthday;
删除表
drop table 表名;
例子: drop table students;
查看表中创建的语句
show create table 表名;
例子:show create table classes;
表里数据的增删改查
查询所有列:select * from 表名
增加
主键字段可以用0 null default 来占位
例如在classes 表中插入一个班级为路桥01班,示例SQL语句如下
insert into classes values(0,"路桥01");
向students表种插入一个学生的信息
insert into students value(0,"张三”,20,"女",1,"1990-01-01")
注意我们这里value后面的值可以是0 可以 null 也可以是default来占位,在第四个value值中,因为我们用了枚举来进行定义表
因此如果我们不想写男/女/中性/保密 是也可以用1234来进行代替
部分插入
对于如果我们要是不想插入全部的值,那么我们只需指定填写的字段,如果我们要是不填写的话那么数据库就指定为空,或者指定为默认值。
示例,如果我们要是想在students数据表中插入小乔我们只指定姓名和性别,那么示例代码如下:
insert into students (name,gender) value("小乔",2);
3. 多行插入
如果在实际生产过程中,我们不方便多次进行插入,那么我们可以指定一次性进行全部插入
insert into students (name,gender) value("大桥",2) ,("貂蝉",2);
改
update 表名 set 列1=值1,列2=值2 where 条件;
这里我们注意,where相当于if条件语句,后面写条件
场景:修改students表里性别那列,全部修改成为男
update students set gender=1;
但是这只能修改全部的,貌似效果很差,但是如果我们要是只想修改某行的字段该怎么做呢,这里我们引用where函数
只要name是小李飞刀的全部修改
update students set gender=2 where name="小李飞刀";
但是我们在生产过程中我们不会用name来定位数据库里的数据
update students set gender =2 where id=3;
在业务场景中,如果我们不只想改这一个字段,我们需要设定一下某个字段并且指定条件
update students set age=22,gender=2 where id=3;
删除
delete from 表名 where 条件;
清空数据表 delete from students;
这样会导致整个数据表单中所有的信息全部被删除
我们也可以尝试一下加一个条件或许可以让数据变的更加的安全些
delete from students where name =“小李飞刀” 这个语句会使我们删掉students数据表中所有的name="小李飞刀"字段
用一个字段来表示,这条信息是否已经不能再使用了
业务场景: 给students表添加一个is_delete 字段,bit类型
alter table students add is_delete bit default 0;
update students set is_delete=1 where id=6;
查询
查询所有列 select *from 表名;
查看student表 select *from student;
但是在大量的数据库数据中我们要面临大量的数据,因此我们需要指定条件来进行查询
示例: 查询student数据表中name =“小李飞刀”字段的全部信息
select *from student where name ="小李飞刀"
查询条件我们也是可以指定的,比如我们指定 id>3 那么同样也是适用于此查询条件的
如果我们只想看某一列或者某一个,我们只需要指定条件
指定条件查询 select 列1 ,列2,........from 表名;
字段的顺序
可以使用as为列或表指定别名
查看某一段
select 字段[as 别名] , 字段[as 别名] from 数据表 where........;
我们如果要是不想看字段的名字的话我i们可以指定一下字段的意思,这里我们把name 指定为 姓名,gender指定为性别 源自于students数据库表单里
select name as 姓名 ,gender as 性别 from students;
字段的顺序
select id as 序号,gender as 性别 ,name as 姓名 from students;
SQL 语句的深造 --查询篇:
数据准备: create database python_test charset= utf8;
使用一个数据库: use python_test;
显示使用的数据库: select database():
创建数据表:
–创建students表单数据库表
create table students(
--设置主键指定索引不能为空
id int unsigned primary key auto_increment not null,
name varchar(20) default" ",
--unsigned的意思是不加负数
age tinyint unsigned default 0,
--unsigned 五位小数
height decimal(5,2),
gender enum ("男","女","中性","保密") default "保密",
cls_id varchar(30) default "计算机科学与技术01班",
is_delect bit default 0
);
–创建classes表单数据库表
create table classes(
id int unsigned auto_increment primary key not null,
name varchar(30) not null
);
插入数据
–向students表中插入数据
insert into student values()
–向classes表中插入数据
基本查询
查询 所有字段: select *from 表名;
查询指定字段: select 列1,列2.......from 表名;
select name,age from students;
使用as给字段起别名: select 字段 as 名字.......... from 表名;
select name as "姓名" age as "年龄" from students;
select 表名.字段.........from 表名;
select students.name ,students.age from students;
可以通过as给表起别名
select 别名,字段......... from 表名 as 别名;
select s.name , s.age from students as s;
--select students.name , students.age from students as s;这种写法就是错的,因为指定了字段的小名后就不允许再用之前的名字了
查询students表单中gender全列的数据
select gender from students;
消除重复行:
distinct 字段 可以实现去重的效果
生产场景,查看students表单中gender列里的不一样的数据
select distinct gender from students;
划重点,以上的查询方式只适用于数据库很小的数据库,但是在大数据面前我们更多的时候需要采用条件查询
条件查询
select ........from 表名 where.......
查询大于18岁的信息
select *from student where age>18;
--如果不是*也行,同样可以用,前面不重要,真正后面的才是最重要的
select id,name,gender from students where age>18;
查询小于18岁的信息
select * from students where age<18;
查询小于或等于18岁的信息
select * from students where age<=18;
查询年龄为18岁的所有学生的信息
select *from students where age=18;
and or not (与,或,非)
and
业务场景1 :查询18到28之前所有的学生信息:
--and左右两侧的语句条件必须写全
select *from students where age>18 and age<28;
业务场景2:查询18岁以上的女性身高或超过180的女性
select * from students where age>18 or heigh>180 and gender="女";
业务场景3: 查询年龄不是小于或等于18并且是女性
--注意这里的优先级,如果要是不加(),那么where 智慧执行后面紧跟着那个条件,最重要的我们就直接加一个括号
select *from students where not (age<=18 and gender=2);
模糊查询
like
% 替换1个或者多个
_ 替换1个
业务场景:查询姓名中 以 “小” 开始的名字
select name from students where name like "小%";
业务场景:查询名字中有"小"所有的名字
select name from students where name like "%小%";
业务场景:查询有两个字的名字
select name from students where name like "__";
业务场景:查询至少有两个字的名字
select name from students where name like "__%"
rlike 正则
业务场景:查询以周开始的名字
select name from students where name rlike "^周.*"
业务场景:查询以周开始以伦结尾的名字
select name from students where name rlike "^周.*伦$"
范围查询
in(1,3,8) 表示在一个非连续的范围内
比如:查询 年两位18,34的姓名
select name,age from students where age in(18,34);
not in 查询不在某个范围之内的信息
select name,age from students where age not in (18,34);
如果要是查找连续信息那么需要用 between …and…
查询年龄不在18到34的信息
select *from students where age not between 18 and 34;
select *from students where not age between 18 and 34;
-- select *from students where age not (between 18 and 34); 千万不能这么写,因为 not between 是一种用法,而不是一个赋值语句
空判断
判空 is null
查询身高为空的信息
select *from students where height is null;
查询身高不为空的信息
select * from students where heigh is not null;
排序: order by
排序只有两种方式,从小到大,从大到小
asc 从小到大排列 即为升序
desc从大到小排序,即为降序
生产场景: 查询年龄在18-34岁之间的男性,按照从小到大进行排序
select * from students where (age between 18and 34) and gender=1 order by age;
-- 默认为asc 升序
select * from students where (age between 18and 34) and gender=1 order by age asc;
-- desc为降序
select * from students where (age between 18and 34) and gender=1 order by age desc;
生产场景:查询年龄在18到34岁之前的女性,身高为从高到矮排序
select *from students where age between 10 and 34 and gender="女" order by age desc;
但是order by 是可以指定多个字段来进行排序的,这条语句的意思就是前面的相同的话就按照后面的方式进行拍
select *from students where age between 10 and 34 and gender="女" order by age desc,id desc;
工程案例:
按照年龄从小到大,身高从高到矮的顺序
select * from students order by age asc,height desc;
聚合函数
总数 计算搜索的数据库的总数多少行
在终端计算一下搜索的数据一共多少个
统计终端总和函数为 count()
select * from students where gender="女";
select count(*) from students where gender ="女"
最大值 max
工程实例: 查询最大年龄
select age from students;
select max(age) from students;
-- 主要实现思路是先查看所有人的年龄,再来查看最大年龄的那个人
工程实例: 查询最大的女性身高
-- 思路是先查看所有女人的身高 再查看最大身高的女性
select gender=1 from students;
select max(height) from students where gender=2;
最小min
同理
总和sum
也同理
平均值avg
也同理
计算平均年龄 sum(age)/count(*)
计算平均年龄
select avg(age) from students;
-- 二者最终达到的效果是一样的 都是计算平均年龄
select sum(age)/count(*) from students;
四舍五入 round(123,23,1) 保留一位小数
计算所有人的平均年龄 保留两位小数 保留三位小数就改成 3
select round (sum(age)/count(*) ,2) from students;
计算男性的平均身高,保留两位小数
select round(avg(height),2) from students where gender ="1";
分组 group by
什么是分组,分组的定义就是按照一个性别分组,查询所有的性别
select ...... from students group by gender;
记住,这里面千万不要写*
省略号里面放唯一的条件
计算分组查询性别分组里各个年龄的总数
select gender,count(*) from students group by gender;
计算性别分组中年龄最大的那个
select gender ,max(age) from students group by gender;
计算性别分组中平均数
select gender , sum(age)/ count(*) from students group by gender;
-- 或者也可以用avg来进行计算
select gender ,avg(age) from students group by gender;
如果我们要是想看到某个组内所有数据
select gender ,group_concat(name) from students group by gender;
计算男性总数
select gender ,count(*) from students where gender=1 group by gender;
显示所有男性分组
select gender , group_concat(name) from students where gender=1 group by gender;
可以在group_concat() 里面指定字段,就全都显示出来了
select gender ,group_concat(name,age,id) from students where gender=1 group by gender
group_concat() 功能特别强大,有什么就链接显示什么
select gender ,group_concat(name,"_",age," ",id) from students where gender=1 group by gender
查询平均年龄超过30岁的性别,以及姓名, having avg(age) >30
having是对结果进行判断
按照性别分组,查询平均年龄大于30的人,并且显示平均年龄
select gender ,group_concat(name) ,avg(age) from students group by gender having avg(age) >30;
查询每种性别中的人数大于2个的信息
select gender ,group_concat(name) from students group by gender having count(*)>2;
如果要是查全部分组的话,那么就是去掉having
select gender ,group_concat(name) from students group by gender
分组和聚合一起配合使用才有意义!
数据库的设计
三范式 原子性 必须要一一对应 必须有主键,后面的表头必须要和前面的主键一一对应 不符合范式就单独拆成一张表
关系型数据库每张表必须有关系