数据库可以分为关系型数据库和非关系型数据库
数据库的定义:
数据库==文档,表格软件
文件夹=库
但库里不能再存库
库-表-数据
与excel储存数据相比的优点:支持多人同时访问
表是由:字段名+数据构成
pyhon代码 SQL命令 两者本质一样,叫法不同
所有MySQL语句后面都要加分号
一般一个项目一个库,大项目多个库
win+r输入cmd 进入mySQL:mysql -uroot -proot(注意单词后有空格)
mySQL的条件查询:
#运行命令时程序中出现🆗字符,一般运行成功
数据库的命令:
数据库的创建:
create database 数据库名;(数据库名一般用英文)
#库里可能不支持存放中文数据因此需使用万国码而变为(不用上面的):
create database bailuku default character set utf8 collate utf8_general_ci;
显示所有库:
show databases;
进入某一个数据库:
use 数据库名字;
删除库:
drop database 数据库名;
数据表的命令:
创建一个表:
create table 表名(
字段名 数据类型 约束(可选),
字段名 数据类型 约束(可选),
...
);
#最后一个字段名后面不加逗号
#或者将约束放到最后,约束类型(字段名)
显示库中的表:
show tables;(要先打开库 use database;)
查看数据表的结构 查询类型,字段名:
desc 表名;
删除表:
drop table 表名;
字段/数据的命令:
修改表-添加字段:
alter table 表名 add 字段名 类型 约束;(可选)
修改表-修改字段类型:
alter table 表名 modify 字段名 类型 约束;(可选)
修改表-修改字段名及字段类型:
alter table 表名 change 原名 新名 类型 约束;(可选)
修改表-删除字段:
alter table 表名 drop 字段名;
添加数据:
insert into 表名 values(...)如括号中写(1,'白鹿',18,190.00,'男');
#如果表格中有数据可以不写,则数字类型都为0,字符串类型为''或null,不能打空格
查询数据:
select*from 表名;
修改数据:
update 表名 set 字段名一=值一,字段名二=值二...where条件如where name = 白鹿;(或其他字段名对应的数据,多个条件:用and,or连接)
删除数据:
delete from students where 条件;
数据类型细分:
整数类型:
类型 | 字节大小 | 有符号范围(Signed) | 无符号范围(Unsigned) |
---|---|---|---|
TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
INT/INTEGER | 4 | -2147483648 ~2147483647 | 0 ~ 4294967295 |
BIGINT | 8 | -92233720368547758 08 ~ 9223372036854775807 | 0 ~ 18446744073709551615 |
用到Unsigned直接加在类型后面
字符串:
类型 | 说明 | 使用场景 |
---|---|---|
CHAR | 固定长度 CHAR(11)#手机号,小型数据 | 身份证号、手机号、电话、密码 |
VARCHAR | 可变长度,小型数据VARCHAR(5) #在5之内 | 姓名、地址、品牌、型号 |
TEXT | 可变长度,字符个数大于 4000 | 存储小型文章或者新闻 |
LONGTEXT | 可变长度, 极大型文本数据 | 存储极大型文本数据 |
时间类型:
类型 | 字节大小 | 示例 |
---|---|---|
DATE | 4 | ‘2020-01-01’ |
TIME | 3 | ‘12:29:59’ |
DATETIME | 8 | ‘2020-01-01 12:29:59’ |
YEAR | 1 | ‘2017’ |
TIMESTAMP | 4 | ‘1970-01-01 00:00:01’ UTC ~ ‘2038-01-01 00:00:01’ UTC |
-
小数:decimal decimal表示浮点数,如 decimal(5, 2) 表示共存5位数,小数占 2 位.
-
char表示固定长度的字符串,**如char(3),如果填充’ab’时会补一个空格为’ab ',**3表示字符数
-
varchar表示可变长度的字符串,如varchar(3),填充’ab’时就会存储’ab’,3表示字符数(不超出)
-
枚举类型(enum)
-
常见的约束:
- 主键约束 primary key(填入内容已固定,列如排序的序号,不能重复 )
- 非空约束 not null(此格不能为空)
- 唯一约束 unique
- 默认约束 default(如果添加时没有写值,存在默认值 default ‘默认值’)
- 外键约束 foreign key
-
数据类型和约束保证了表中数据的准确性和完整性
主键:一个表只能有一个主键 但是,如果说一张表当中有多个外键的话,那么可以有多个主键
外键:表与表之间的一些联系
#对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径.
严格规定长度是为了使表格占用空间更小
设计表:提炼数据中的精髓(简化,内存,关键字,分类)
添加外键的语句:
foreign key (里面加主键所在表的表头) references 引用表的表名(引用表里的字段名),写在创建外键字段名后一行
这张表的某一表头 参照于另一个表的某一表头
不能在表头后直接加两个primary key,因为命令中只能有一个主键
正确格式在最后排加primary key(字段名1,字段名2)
当一张表里有外键,想要删除字段名,要先删除外键字段名,再删除原来的字段名
在使用SQL语句显示结果的时候,往往在屏幕显示的字段名并不具备良好的可读性,此时可以使用 as 给字段起一个别名。
-
使用 as 给字段起别名
select id as 序号, name as 名字, gender as 性别 from students;
-
可以通过 as 给表起别名
-- 如果是单表查询 可以省略表名 select id, name, gender from students; -- 表名.字段名 select students.id,students.name,students.gender from students; -- 可以通过 as 给表起别名 select s.id,s.name,s.gender from students as s; #如果子查询里面也用到了外查询的表,以及一样的字段,那么就需要as取别名来进行区分
**说明:**
- 在这里给表起别名看起来并没有什么意义,然而并不是这样的,我们在后期学习 自连接 的时候,必须要对表起别名。
MySQL中的函数写法只能写在select和from中间
distinct函数可以去除重复数据行。
```sql
select distinct 列1,... from 表名;
例: 查询班级中学生的性别
select name, gender from students;
-- 看到了很多重复数据 想要对其中重复数据行进行去重操作可以使用 distinct
select distinct(name), gender from students;
distinct()于函数用法一样,括号中写入字段名
排序查询语法:
select * from 表名 order by 列1 asc|desc ,列2 asc|desc,...;
语法说明:
-
先按照列1进行排序,如果列1的值相同时,则按照 列2 排序,以此类推
-
asc从小到大排列,即升序
-
desc从大到小排序,即降序
#如果想要两个数据排列,也只需要写一个order by如:select * from score order by c_ ase , sc_degree dese;,先排一个,在其中排另一个
-
默认按照列值从小到大排列(即asc关键字)
count()函数放在出,其中写入字段名,统计个数,也可直接放入也可统计
max() 找出字段名中的最大值
子查询:就是在select中还有个select ,只不过后面的select已用特殊方法转化为了较简单的数据
分割:直接在命令后面加入limit 数值1,数值2;意思为用排列的方式来切割列表,如0,1可以切出列表中的最高项
#用以上两个方法找出列表中成绩最大数据
select * from score where sc_degree = (select max(sc_degree) from score);#利用max函数子查询找出最大成绩所对应的数据
select * from score order by sc_degree desc limit 0,1;#利用排序找到最高项,再用切割函数分出最高项
分组:group by 字段名 注意:此方法并不是函数,不放入*位置,*位置也应放入一样字段名进 行打开操作
求平均值:使用avg(字段名)函数,此刻前面任然需要写入列表名字如:
select c_no,avg(sc_degree) from 学科 group by c_no;
#意思为列表中的元素以学科的分组来求出平均值,命令中avg()函数执行了三次
#此刻MySQL程序隐藏了具体的分类:学科一
…
…
学科二
…
…
因此不用此方法来去重复项
like是模糊查询关键字,否定:not like
%表示任意多个任意字符如:‘3%’表示以3开头 ‘%3’表示以3结尾,’%3%'表示中间含有3
_表示一个任意字符
1:查询姓黄的学生:**
select * from students where name like '黄%';
例2:查询姓黄并且“名”是一个字的学生:
select * from students where name like '黄_';
范围查询
-
between … and … 表示在一个连续的范围内查询
-
in 表示在一个非连续的范围内查询(可包含多个数据,有时引用子序列时也会用到此方法)IN(数字一,数字二···)表示取出数字一、二等等数据
两者常配合where语句一起使用
空判断查询
- 判断为空使用: is null
- 判断非空使用: is not null
注意:
- 不能使用 where height = null 判断为空
- 不能使用 where height != null 判断非空
- null 不等于空字符串
当使用 WHERE
字段名 = NULL
,MySQL 会将这个查询等价于 WHERE FALSE
,也就是说它会返回空的结果集,因为没有任何行的该字段会是 NULL
常见的比较运算符有 >,<,>=,<=,!=
like和%结合使用表示任意多个任意字符,like和_结合使用表示一个任意字符
条件语句中才可用到and or,其他时候不用
where 和 having都是条件运算符
只不过having可以配合group by一起出现,having可以直接用函数
select*from score group by c_no having count(_degree)>=2;
#此时函数不需要放在select和from之间
多表查询:
将拥有相同字段名拉来等起来如:
查询所用学生的s_name,c_no,sc_gegree列
select s_name,c-no,sc_degree from student,score where student.s_no=score.s_no;
#s_no为两列表中的重复字段名(也易看出列表中引出字段名的方式,注意where后必须加空格,否则程序会报错