一、基础
1. 客户端和服务端是通过网络来进行交互的,而数据是存储在服务器上的。
内存和外存的区别:
内存的储存空间小、访问速度快、成本高、且内存上的数据容易丢失(一断电就没有了)
外存的储存空间大、访问速度慢、成本低、且内存上的数据不容易丢失,但是一般的硬盘存储时间有限,可能几年到几十年,特别是SSD固态硬盘存储时间更短。
注意:数据库是要把数据存储到外存上的,外存的数据能够持久化保存,而且数据库组织数据会很多。
2. 关系型数据库:
数据库服务器==》包含很多数据库==》包含很多数据表==》包含很多行(记录)==》包含很多列(字段)
3. 非关系型数据库组织形式会更加灵活,通常是按照文档或者键值对方式来存储的。
二、基本操作
1. 安装
参考博客园https://www.cnblogs.com/gaobo123/articles/13304745.html
2. 显示当前所有数据库:show databases;
注意:databases是复数形式;末尾是英文的分号“ ; ".
3. 创建数据库 :create database 数据库名称 ;
注意:database是单数形式;create是sql的关键字,所以不能当作名称,如果实在有需要可以写成create database `create`即加上反引号。
create database if not exist 数据库名称 ;
正常情况下如果数据库已经存在会出现报错,如果加上 if not exist则不会报错。
create database if not exist 数据库名称 create_specification ;
create_specification是指属性,有character set 和collate两个。
character set:指定数据库采用的字符集,在表示中文的时候会用到字符集,例如:Unicode、GBK(使用两个字节表示一个汉字)、utf8(是变长编码,其可表示的范围比GBK大得多)。collate:指定数据库字符集的校验规则,即按照什么样的规则来比较字符串之间的大小和相等。
例如:create database if not exist test character set utf8mb4;
4. 选中数据集: use 数据库名称 ;
5. 删除数据库: drop database 数据库名 ;
drop database if exists 数据库名 ;
注意:数据库一旦删除,里面的表和数据将会全部被删除
三、 数据类型
1. 数值类型
注意: 1字节=8bit
有符号范围:-2^(类型字节数*8-1) ~ 2^(类型字节数*8-1)-1
无符号类型:0 ~ 2^(类型字节数*8)-1
2. 字符串类型
文本数据:例如 .txt .java .c等等结尾的文件
二进制数据:例如 .docx .ppt .xlsx .exe等等用记事本打开看不懂的文件
3. 日期类型
三、表基本操作
1. 创建表 : creat table 表名(列名 类型, 列名 类型... ... );
creat table 表名(列名 类型 comment ’备注‘,
列名 类型... ... );
注意:创建表需要保证同一个数据库里不能有同名的表,且表名和关键字不能重复
comment是用来进行注释的,也可以用”--“来进行注释
2. 查看表 : show tables;
3. 查看指定表结构 : desc 表名 ;
4. 删除表: drop table 表名;
drop table if exists 表名;
三、表的增删查改 (CRUD)
1. 新增
insert into 表名 values(值, 值,...); 值的类型要与列匹配
指定列插入 : insert into 表名(列名) values(值);
多行插入 : insert into 表名 values(值 类型),(值 类型),(值 类型)...;
注意:对于数据库来说,内部存储中文是需要指定对应的中文编码方式的,其默认的字符集是拉丁文(Latin1,它不存储中文),所以可以通过修改数据库字符编码。下面是修改默认方式的步骤:
2. 查询语句
1)全列查找: select * from 表名;
注意: select *会让服务器大规模的读取磁盘上的数据,再把数据通过网卡写回客户端。但是如果数据量非常大,则会导致读取磁盘和网卡会很慢甚至卡死。
2)指定列查找:select 列名 from 表名;
3)查询字段为表达式: 即边查询边计算,但只影响临时表的数据展示,对原数据没有任何影响。
select 列名, 表达式 from 表名;
例: select name, english+math from exam;
4)给查询的列起个别名:select 列名, 表达式 as 别名 from 表名;
5)查询时进行去重: select distinct 列名 from 表名;
6)查询结果进行排序:
升序: select 列名 from 表名 order by 列名;
降序: select 列名 from 表名 order by 列名 desc;
7)指定多个列进行查询:(哪个列靠前,哪个列优先级就高)
select 列名 from 表名 order by 列名,列名...;
select 列名 from 表名 order by 列名 desc , 列名 desc , ...;
8)条件查询:使用where子句来表示条件
select 列名 from 表名 where 条件;
注意:在条件查询的时候,会先执行where,再执行select前半部分决定显示哪些列。
例:select * Chinese + math as total from exam where total>200;会报错,因为total是在各种条件判定后才定义的。
-- 查询语文成绩在 [80, 90] 分的同学及语文成绩:
1. SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
2. SELECT name, chinese FROM exam_result WHERE chinese >= 80 AND chinese
<= 90;
9)like, 模糊查询,依赖一些通配符来表示要匹配的值是什么样的
%代替多个任意字符; _ 代替一个任意字符
例:select * from exam where name like '孙%';即找到名字以孙开头的人
10)NULL:判断空值
例:select * from exam where math <=> null;
11)分页查询:因为数据很多时,会分成几个页来显示
select 列名 from 表名 limit N;即查询前N条记录
select 列名 from 表名 limit N offset M;即从第M条开始查询前N条记录
例:select name,english+math+chinese as total from exam where name != '猪八戒' order by total desc limit 3;即找到名字不是猪八戒的记录,并降序排列,只显示前3条
3. 修改(update)
update 表名 set 列名 = 值 , 列名 = 值 ... ... where 条件 ;
例:update exam set math=80, english = 90 where name = '孙悟空';
4. 删除
delect from 表名 where 条件;
注意:若不写条件,则相当于表中内容全部删除,即空表。
三、表的增删查改 (进阶)
1. 数据库约束
1)not null :指定列非空,写在某一列的类型的后面
例:create table student ( id int not null, name varchar(20));
2)unique : 值唯一,保证其列的每行必须有唯一的值,不能重复,也是写在某一列的类型的后面
使用unique时,会先查询再遍历
3)default : 修改默认值,本来默认值为null,默认值一般在指定列插入