文章目录
一.概述
1.数据库定义:按照数据结构来组织,存储和管理数据的仓库
2.提供数据库服务的软件:
MySQL,SQL_Server,Oracle,Mariadb,DB2,MongoDB…
3.选用数据库
(1)开源软件:MySQL,Mariadb,MongoDB
商业软件:Oracle,DB2,SQL_Server
(2)是否跨平台:
不跨平台:SQL_Server
跨平台:MySQL,Oracle,Mariadb,DB2,MongoDB
二.MYSQL:是一种关系型数据库(RDBMS),指建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据,支持多种语言。
1.特点:
(1)数据以表格形式出现
(2)一行称为一条记录
(3)列代表字段,如3列代表三个字段
(4)许多的行和列组成一张表单
(5)若干的表单组成database
2.术语
(1)数据库: 数据库是一些关联表的集合。
(2)数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
(3)冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
(4)外键:外键用于关联两个表。
(5)复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
(6)索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
(7)参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
3.关于关系型和非关系型数据库
关系型示例:
学生信息:
姓名:小明 年龄:13 ,班级:12340班
班级信息
班级:12340班 班主任:王静
当查找小明的班主任时,则可以通过这种关系型数据库找到
非关系型:
学生信息:
{“姓名”:“小明” “年龄”:13 ,“班级”:“12340班” “班主任”:“王静”}
4.数据存储
(1)所有数据都是以文件的形式放在数据库目录下
(2)数据库目录 :/var/lib/mysql
5.安装
网上的教程挺详细的,戳这里
但是可能会遇到各种各样的问题,感谢万能的大佬们,整理了几篇常见问题的解决方法,戳这里
问题解决1
问题解决2
6.名词介绍
(1)DB(database):数据库
(2)DBMS(database management system):数据库管理系统
数据库管理系统的软件:MySQL,Oracle…
(3)DBS(database system):数据库系统
DBS= DB(存储)+DBMS(数据库软件)+数据库应用+用户
7.登录
先切换到mysql安装目录下的bin文件夹,输入net start mysql,然后输入mysql -u root -p
会看到输入密码的提示符,输入密码即可。
三.MySQL管理(Windows系统)
1.连接MySQL服务器
(1)启动 :打开命令行窗口,进入安装目录
cd C:/mysql/bin
mysql -u root -p #会提示输入密码,输入密码后回车即可
(2)关闭
cd C:/mysql/bin
quit
四.命令
1.说明
(1)每条SQL命令必须以 ;结尾
(2)SQL命令不区分大小写
(3)使用\c 来中止命令的执行
2.库的管理
(1)基本操作
show databases; #查看已有的库
create 库名 default=UTF-8 ; #创建库,指定默认字符集
show create database 库名; #查看创建的库(查看字符集)
select database(); #查看当前所在库
use 库名; #切换库
show tables; #查看库中已有的表
drop database 库名; #删除库
(2)库名的命名规则
(1)可以使用数字,字母,_,但不能使用纯数字
(2)库名区分大小写
(3)库名有唯一性
(4)不能使用特殊字符
3.表的管理
(1)基本操作
show tables #查看已有的表
create 表名(字段名,数据类型
字段名,数据类型
...)default =utf-8 ; #创建表,指定默认字符集
show create table 表名; #查看创建的库(查看字符集)
desc 表名 #查看表的结构
drop table 表名; #删除表
(2)表的命名规则
同上库的命名
(3)where 条件子句(配合查询,修改,删除操作)
select * from 表名 where 条件;
(4)表记录的管理
# 插入记录
insert into 表名values(值1),(值2),... ; #在表中插入记录,值指的是一行所有的字段依次赋值
insert into 表名(字段名列表)values(值一),(值二),... ; 值按照前面的字段列表依次赋值
#查询记录
select * from 表名; #查询表的所有信息
select 字段1,字段2... from 表名;#查询某几个字段
select 字段1,字段2... as x1,x2...from 表名#显示的字段是x1.x2....
# 删除记录
delete from 表名 where 条件;如 delete from 表名 where id =1
delete from 表名;#会删除表中所有记录
# 更新表记录
update 表名 set 字段名1=值1,字段名2=值2... where 条件;#如果没有where语句,则会将表中所有记录的相应字段都更新
#
(4)表字段的操作
alter table 表名 执行动作;
# 添加字段
alter table 表名 add 字段名 数据类型 first;#将字段加在第一列
alter table 表名 add 字段名 数据类型 after 字段名1;#将字段添加在字段名1后面
# 删除
alter table 表名 drop 字段名;
#修改字段数据类型
alter table 表名 modify 字段名 新数据类型;#要注意原来的数据范围限制
#修改字段名
alter table 表名 change 旧名 新名 数据类型;
#修改表名
alter table 表名 rename 新表名;
五.数据类型
1.分类
(1)数值类型
(2)字符类型
(3)枚举类型
(4)日期时间类型
2.数值类型
(1)整型 :
int 和 tinyint比较常用,存储空间和取值范围等见上。
(2)浮点型:
float(最多显示7个有效位)
用法:
float(m,n)# m表示总位数,n表示小数位
注意:浮点型插入整数时会自动补全小数位位数;小数位如果多于指定位数,会对指定位的下一位进行四舍五入
double(最多显示15个有效位)
用法和注意事项同float
decimal(最多显示28个有效位)
3.字符型
(1)char(定长):默认宽度为1
(2)varchar(变长):没有默认宽度,必须给定一个宽度值
(3)两者比较
char 占用固定的存储空间,比如定义长度为5,如果字符串的长度为2,那么系统会自动补3个空格
varchar 是根据输入字符串的长度来分配存储空间
所以char性能好,varchar可以节省存储空间
4.枚举类型
(1)定义:字段值只能在列举的范围内选择
(2)enum(…)单选(最多有65535个不同的值)
字段名 enum(choice1,choice2....)
(3)set(…)多选(最多有64个不同的值)
字段名 set(choice1,choice2....)
5.日期时间类型
注意:插入记录时datatime字段不给值默认返回NULL;插入记录时timestamp字段不给值默认返回系统当前时间
6.字符类型和数值类型宽度的区别
数值类型的宽度仅仅为显示宽度,只用于select 查询显示,和存储空间无关,可以用zerofill 查看效果
字符类型的宽度超过则无法存储
示例:
mysql> create database stu;
Query OK, 1 row affected (0.02 sec)
mysql> use stu;
Database changed
mysql> create table t2(id int(3) zerofill);
Query OK, 0 rows affected, 2 warnings (0.06 sec)
mysql> insert into t2 values(1),(2),(6666);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from t2;
+------+
| id |
+------+
| 001 |
| 002 |
| 6666 |
+------+
3 rows in set (0.00 sec)
六.运算符操作
1.数值比较和字符比较
(1)数值比较
= | != | > | < | >= | <=|
(2)字符比较
= | != |
2.逻辑比较
and | or
3.范围内比较
between A and B #A,B是两个值
in(值1,值2...值N)
not in(值1,值2...值N)
4.匹配空和非空
is null #空
is not null# 非空
# 注意这里是空值的意思,而不是空字符串,空字符串用''来匹配,空值必须用is(not)null匹配
5.模糊比较(like)
where 字段名 like 表达式;
表达式:
_ : 匹配单个字符
% : 匹配0到多个字符
示例:
where 字段名 like '_%_' ; #有两个字符及以上
where 字段名 like '%'; #匹配所有的,NULL不会被统计
where 字段名 like '___'; #有3个字符
where 字段名 like '王%'; #匹配以王字开头的
6.正则匹配查询
where 字段名 regexp "正则表达式";
正则表达式符号:
^ :以...开头
$ :以...结尾
. :匹配任意一个字符
[]:包含...内容
[0-9]:匹配带数字的
[a-z]:匹配带小写字母的
[A-Z]:匹配带大写字母的
* :星号前面的字符出现0个或者多次
组合使用示例:
选取name 字段为例
where name regexp "^[0-9]";#以数字开头
where name regexp "[0-9]$";#以数字结尾
where name regexp "^王.*明$";#以王字开头,以明字结尾
where name regexp "^...$";#以任意一个字符开头,一任意一个字符结尾,中间还有一个字符,所以要有三个字符,中文或英文字符
七. SQL查询
1.总结(执行顺序)
1.where;
2.group by…
3.select …聚合函数 from 表名;
4.having
5.order by;
6.limit
下面的示例均采用t1来做示范:
mysql> desc t1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int | YES | | NULL | |
| country | char(3) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
mysql> select * from t1;
+------+--------+------+---------+
| id | name | age | country |
+------+--------+------+---------+
| 1 | 王军 | 23 | ABC |
| 2 | 黎明 | 34 | ABC |
| 3 | 李天 | 56 | BCD |
| 4 | 王平 | 33 | BCD |
| 5 | Amy | 22 | EFG |
+------+--------+------+---------+
5 rows in set (0.00 sec)
2.分类介绍
(1)order by
作用:给查询结果进行排序
语法格式:order by 字段名 排序方式;
排序方式:ASC(升序,且为默认排序方式),DESC(降序)
示例:
select * from t1 order by age desc;
+------+--------+------+---------+
| id | name | age | country |
+------+--------+------+---------+
| 3 | 李天 | 56 | BCD |
| 2 | 黎明 | 34 | ABC |
| 4 | 王平 | 33 | BCD |
| 1 | 王军 | 23 | ABC |
| 5 | Amy | 22 | EFG |
+------+--------+------+---------+
5 rows in set (0.00 sec)
(2)limit
作用:限制显示查询记录的个数。
注意:limit 永远放在SQL语句最后面
limit n;显示n条记录
limit m,n; 从第m+1条记录开始,显示n条记录,m从0开始计数
(3)聚合函数
分类:
(1)avg(字段名):求字段的平均值
(2)sum(字段名):求和
(3)max(字段名):求最大值
(4)min(字段名):求最小值
(5)count(字段名):统计该字段记录的个数 注意NULL
不会被统计
示例:
mysql> select max(age) as max_age from t1;
+---------+
| max_age |
+---------+
| 56 |
+---------+
1 row in set (0.00 sec)
(4)Group by
作用:给查询的结果进行分组,收集某一个字段的记录,然后统计出所有不同的记录,先分组,再聚合
示例:
mysql> select country from t1 group by country;
+---------+
| country |
+---------+
| ABC |
| BCD |
| EFG |
+---------+
3 rows in set (0.00 sec) #注意只能显示一个字段,否则的话就要用聚合函数进行处理,使左右两边的记录数一样相匹配,如下
select country,avg(age) from t1 group by country;
+---------+----------+
| country | avg(age) |
+---------+----------+
| ABC | 28.5000 |
| BCD | 44.5000 |
| EFG | 22.0000 |
+---------+----------+
3 rows in set (0.00 sec)
#查找所有国家中人数最多的前两名
mysql> select country,count(name) from t1 group by country order by count(name) desc limit 2;
+---------+-------------+
| country | count(name) |
+---------+-------------+
| ABC | 2 |
| BCD | 2 |
+---------+-------------+
2 rows in set (0.00 sec)
**注意:groupby 之后的字段名必须要为select之后的字段名;
如果select之后的字段名在groupby之后,则必须要对该字段进行聚合处理
**
(5)having
作用: 对查询的结果进一步筛选
示例:
mysql> select country,count(name) from t1 group by country having count(name) =2 order by count(name) desc limit 2;
+---------+-------------+
| country | count(name) |
+---------+-------------+
| ABC | 2 |
| BCD | 2 |
+---------+-------------+
2 rows in set (0.00 sec)
#where 语句会出错,因为where 语句里面必须包含的是字段名,而这里用到了聚合函数,所以要用having 语句进一步筛选
注意:having语句鲳鱼group by语句使用,用来过滤 group by 语句返回的数据集
having语句弥补了where条件子句不能和聚合函数联合使用的不足
(6)distinct
作用:不显示字段的重复值
示例:
mysql> select distinct name, country from t1;
+--------+---------+
| name | country |
+--------+---------+
| 王军 | ABC |
| 黎明 | ABC |
| 李天 | BCD |
| 王平 | BCD |
| Amy | EFG |
+--------+---------+
5 rows in set (0.00 sec)
# 要求distinct 后面跟的字段名必须都相同才会去重
**注意:distinct后面跟的字段名必须都相同才会去重,distinct不能对任何字段做聚合处理 **
3.查询表记录时的数学计算
(1)运算符
+ | - | * | / | % |
示例:
mysql> select name,age+1 from t1;
+--------+-------+
| name | age+1 |
+--------+-------+
| 王军 | 24 |
| 黎明 | 35 |
| 李天 | 57 |
| 王平 | 34 |
| Amy | 23 |
+--------+-------+
5 rows in set (0.00 sec)
八.约束
1.作用:为了保证数据的完整性,一致性,有效性,可以限制无效的数据插入到数据表中
2.分类
(1)默认约束
作用:在插入记录时,如果不给该字段赋值,则使用默认值
格式: 字段名 数据类型 default 默认值
(2)非空约束
作用: 不允许该字段的值有空值
格式: 字段名 数据类型 not null。在查看表结构的时候,会发现NULL那一栏为No,表示不能为空