一、数据库的基本使用
-
数据库简介
1】在mysql中,列叫字段,行叫记录,唯一标记一行的字段叫主键。
2】rdbms-关系型数据库
mysql、oracle、sql Server
3】C/S–客户端服务器;B/S–浏览器服务器
4】mysql通过SQL语句操作数据库,数据库是一个文件,mysql是一个软件
5】SQL语句分类:
数据查询语言、数据操作语言、数据控制语言、数据定义语言
6】sql语句不区分大小写 -
mysql数据库的安装
服务器端安装:sudo apt-get install mysql-server
启动服务:sudo service mysql start
查看mysql:ps ajx|grep mysql
停止服务:sudo service mysql stop
重启服务:sudo service mysql restart
至于客户端安装,自己百度去。。。 -
数据类型和约束
保证了数据的完整性
1】数据类型
整数:int、bit
小数:decimal(5,2) --表示小数点后保留两位小数
字符串:char、varchar
时间日期:data、time、datetime
枚举类型:enum(‘man’,‘woman’)
常见的数据类型就这些,其他的用到的时候网上查下就可以了。
2】约束
主键:primary key
非空:not null
唯一:unique
默认:default ’保密‘
外键:foreign key
接下来我们用命令行来操作数据库吧!
-
数据库的操作
登录数据库:mysql -u用户名 -p密码
退出:exit/quit
查看数据库:show databases;
查看当前时间:select now()
查看当前版本信息:select version()
创建数据库:create database python
创建数据库时指定编码:create database python charset=utf8
修改数据库的默认编码:alter database python default character set ‘utf8’;
查看当前数据库编码:show create database python
删除数据库:drop database python
注意:如果在删除的数据库的名字中含有比较特殊的字符的的我们可以用两个撇将数据库的名字阔去来再删除。 -
数据表的操作
1】查看当前数据库:select database();
2】切换数据库:use python
3】查看当前数据库中的表:show tables;
4】创建数据表:
create table test
(
id varchar(4) primary key not null auto_increment,
name varchar(10)
age int unsigned --表示无符号类型
);
5】查看表结构:desc students;
下面我们来一段创建表的练习吧。
create table students(
id int unsigned not null auto_increment primary key,
name varchar(20),
age int unsigned default 0,
high decimal(5,2),
gender enum('man','woman') default 'man',
cls_id int unsigned
);
insert into students(1,'gfb',22,165.57,'man',0)
create table class(
id int unsigned not null auto_increment primary key,
name varchar(20)
)
先在students表中插入一个数据试一下:
insert into students values(1,'gfb',22,165.57,'man',0);
我们来查看一下:
select * from students;
6】删除数据库
drop database python1
7】删除数据表
drop table students
-
表结构的增删改查
1】删除字段
alter table students drop high;
2】添加字段
alter table students add birthday datetime;
3】修改字段
alter table students modify birthday date; --修改字段的类型
alter table students change birthday birth date default ‘1996-10-14’; --修改表的名字 -
数据的增删改查
1】添加数据
insert into students values(0,‘houyi’,12,1,1,220-1-1); --完全插入
insert into students(name,birth) values(‘xq’,1996-2-4); --部分插入
insert into students(name,age,gender) values(‘gfb’,22,1),(‘lh’,21,2);–多行插入
2】修改数据
update students set name=‘gfb’ where name=‘cjh’; --修改一个字段的数据
update students set name=‘cjh’,age=10 where id=4; --修改多个字段的数据
3】查询数据
select * from students where id = 1 --条件查询
4】删除数据
delete from students where id = 2; --物理删除
update students set is_delete=1 where id=2; --逻辑删除
注意:一般在真正进行开发的时候我们不会真正的将一个表中的数据删除,而是通过一个专门的字段进行标记,加入删除设置为1,没有删除设置为0;很少会真正的删除数据。至于数据库的备份和还原,请访问:https://www.cnblogs.com/Cherie/p/3309456.html
二、数据库的查询
- 准备数据
1】创建数据库创建数据表
-- 创建数据库
create database python_test_1 charset=utf8;
-- 使用数据库
use python_test_1;
-- students表
create table students(
id int unsigned primary key auto_increment not null,
name varchar(20) default '',
age tinyint unsigned default 0,
height decimal(5,2),
gender enum('男','女','中性','保密') default '保密',
cls_id int unsigned default 0,
is_delete bit default 0
);
-- classes表
create table classes (
id int unsigned auto_increment primary key not null,
name varchar(30) not null
);
2】准备数据
-- 向students表中插入数据
insert into students values
(0,'小明',18,180.00,2,1,0),
(0,'小月月',18,180.00,2,2,1),
(0,'彭于晏',29,185.00,1,1,0),
(0,'刘德华',59,175.00,1,2,1),
(0,'黄蓉',38,160.00,2,1,0),
(0,'凤姐',28,150.00,4,2,1),
(0,'王祖贤',18,172.00,2,1,1),
(0,'周杰伦',36,NULL,1,1,0),
(0,'程坤',27,181.00,1,2,0),
(0,'刘亦菲',25,166.00,2,2,0),
(0,'金星',33,162.00,3,3,1),
(0,'静香',12,180.00,2,4,0),
(0,'郭靖',12,170.00,1,4,0),
(0,'周杰',34,176.00,2,5,0);
insert into classes values (0, "python_01期"), (0, "python_02期");
注意:这个时候出现了点小问题,name的编码不合适,那么我们使用语句set names gbk
更改一下就可以了。
-
基本查询
1】去除重复
select distinct gender from students;
2】起别名
select name as ‘名字’ from students where id=1; -
条件查询
1】比较运算符
等于: =
大于: >
大于等于: >=
小于: <
小于等于: <=
不等于: != 或 <>
SELECT * FROM students WHERE id <> 3 --查询出id不等于3的数据
2】逻辑运算符
and
or
not
SELECT * FROM students WHERE id>5 AND age>18;
3】模糊查询
like
%表示任意多个任意字符
_表示一个任意字符
SELECT * FROM students WHERE NAME LIKE '黄%' OR NAME LIKE '郭_'
4】范围查询
in表示在一个非连续的范围内
select * from students where id between 3 and 8;
select * from students where id in(1,3,8);
5】空判断
注意:null与’'是不同的
判空is null
select * from students where height is null;
判非空is not null
select * from students where height is not null and gender=1;
select * from students where height is not null;
select * from students where height is null;
6】优先级
优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符;and比or先运算,如果同时出现并希望先算or,需要结合()使用
- 排序
语法格式:select * from 表名 order by 列1 asc|desc [,列2 asc|desc,…]
SELECT height AS 身高,id AS 学号,NAME AS 姓名 FROM students ORDER BY height DESC,id ASC;
- 聚合函数
count(*)表示计算总行数,括号中写星与列名,结果是相同的
max(列)表示求此列的最大值
min(列)表示求此列的最小值
sum(列)表示求此列的和
avg(列)表示求此列的平均值
round(avg(age),2)进行四舍五入并且保留两位小数
select count(*) from students;
SELECT MAX(age) FROM students
SELECT min(age) FROM students
SELECT SUM(age) FROM students
SELECT SUM(age)/COUNT(*) FROM students
SELECT AVG(age) FROM students
SELECT ROUND(AVG(age),2) FROM students
注意:在我们存储带小数点的数据的时候,我们应该将这个数据扩大多少倍,等到要使用这个数据的时候我们在除以相应的倍数。
- 分组
一般情况下分组和聚合函数配合使用,分组在于先分组再从组中取数据。
group_count(name,’_’,age): 显示分组中人的name和年龄,中间用下划线分隔
SELECT gender,COUNT(*),AVG(age),GROUP_CONCAT(NAME,'_',age)
FROM students --表名
WHERE id LIKE '%' --筛选出所有数据中id能和'%'匹配的数据
GROUP BY gender -- 根据性别进行分组
HAVING COUNT(*)>3 -- 在分出的组中选出组中人数大于3的组
-
limit
1】限制查询出来的数据的个数
SELECT * FROM students LIMIT 2
2】select * from students limit start,count
start表示开始位置的下标;
count表示查询出来数据的个数;
eg:
select * from students limit 2,5 -
链接查询
1】内链接
SELECT students.* FROM students INNER JOIN classes ON students.cls_id
=classes.id
--表与表之间的对应的条件
注意内连接是取交集
2】外链接
left join左链接
SELECT students.* FROM students LEFT JOIN classes ON students.cls_id
=classes.id
注意:以左表为基准,取左表中的数据,如果左中的数据在右表中有对应,就将其显示出来,如果没有对应,那么也将其显示出来,不过对应不到的位置显示为空。
right join右连接
同理,不过不常用,经常通过调用左右两个表的顺序来代替右连接
3】自连接
一个表中的字段关联这个表中的另外一个字段
其实和内链接是一样的,只不过将一张表看成了两张表,然后进行内链接就可以了。
select province.atitle,city.atitle from area as province inner join area as city on province.aid=city.pid having province.atitle=“山东省”
4】子查询
就是一个sql语句中嵌套另外一个sql语句,而被嵌套在内部的查询叫子查询。
select * from student where name=(select name from students where gender=1); -
数据库的设计
1】范式
第一范式:不可拆分
第二范式:必须有主键,其他的必须依赖于所有的主键
第三范式:主键不可传递,直接依赖的主键不可传递
2】E-R模型
设计数据库的时候首先满足范式,然后考虑E-R模型。
一对一的时候选择在任何一个表中添加一个字段存储另一个表的主键都是可以的;一对多的时候可以在多的那个表中添加一个字段来存储另一个表的主键;多对多的时候就只能额外的建一张表然后用这个额外的表来存储这两张表的主键之间的对应关系。 -
总结
查询的完整格式:
SELECT select_expr [,select_expr,...] [
FROM tb_name
[WHERE 条件判断]
[GROUP BY {col_name | postion} [ASC | DESC], ...]
[HAVING WHERE 条件判断]
[ORDER BY {col_name|expr|postion} [ASC | DESC], ...]
[ LIMIT {[offset,]rowcount | row_count OFFSET offset}]
]
执行顺序
select *
from 表名
where ....
group by ...
select distinct *
having ...
order by ...
limit start,count