基本操作
简介
术语
数据库的三大范式
第一范式
第二范式
第三范式
sql的特点:
书写规范
服务的开启和关闭
登录
查看当前应用的版本
基本操作
简介
如果一个网页是动态(后缀.jsp php shtml)的内容的话,数据库是必不可少的一个环节
mySQL是web应用中最好的和php是黄金搭档
LAMP(linux apache mysql php)
术语
DB: 存储了大量有组织数据的仓库(DATABASE)数据库是用来存储和管理数据的仓库
特点:
用于持久化存储数据
数据库就是一个文件系统
使用了统一的方式来操作数据库
DBMS: 数据库管理系统(DATABASE MANAGEMENT )
常见的DBMS:mysql,Oracle,DB2(IBM出品,处理海量数据),sqlserver(微软)
作用:检索数据,插入数据,更新数据,删除数据等、
又称为数据库软件,数据库产品,数据库
mysql就是数据库管理系统,通常我们所说的数据库,就是数据管理系统。
SQL :结构化查询系统语言 structure query language
sql可以用来操作所有的关系型数据库,是一种通用的标准,每一种数据库操作不一样的地方,成为方言
用于和DBMS通信
SQL是几乎所有的数据库都支持的语言
简单, 并且有力
数据库的三大范式
第一范式
表的每一列都具有原子性,不可分解。
只要是关系型数据库,都自动满足第一范式。数据库表的每一列都是不可分割的
第二范式
第二范式是在第一范式的基础上建立起来的,即满足第二范式必须满足第一范式。第二范式要求数据表中每一个实例或行必须被唯一的区分。为实现区分通常需要我们设计一个主键来实现。
即满足第一范式的前提下,当存在多个主键的时候,才会发生不符合第二范式的情况。比如两个主键。任意一个字段都只依赖表中的一个字段。
如果遇到多个主键的时候,应该拆分
第三范式
第三范式,必须满足第二范式,除了主键列其他列之间不能有传递依赖。
sql的特点:
sql将数据放到表中,表再放到库中
每个数据库可以有多个表,每个表有一个自己的名字,用来标识自己,表名具有唯一性
表具有一些特性,这些特性决定了数据在表中如何存储,类似于java中“类”的设计
每个表都由一个或多个列组成,列又称为字段,每一列对应java中的“属性”
DBMS分为两类,
- 基于共享文件系统的DBMS(access,excel)
- 基于客户机-服务器的dbms(mysql,oracle,sqlserver)
- 服务器更重要,所以一般说的安装数据库就是安装服务端
书写规范
不区分大小写,但建议关键字大写,建议关键字大写,其他的小写
- 可以多行操作,但是每条命令最好用分号结尾
- 每条命令根据需要可以进行缩进或换行
- 单行注释# —注释文字 /多行注释/
服务的开启和关闭
linux
[root@localhost ~]# systemctl start mysqld.service; [root@localhost ~]# systemctl stop mysqld.service;
win
net start mysql net stop mysql
登录
mysql -h 主机名(ip) -P 端口号 -u用户名 -p密码
连接远程的端口的时候,黄色部分不能省略,连接本地主机的时候可以省略
mysql -h localhost -P 3306 -u root -p
输入密码
删除数据库
drop database xxx; drop database xxx if exists xxx;
查看选中的是哪个数据库
mysql> select database();
切换操作的数据库,假设操作的是test;
use test;
显示选择的库中有哪些表
show tables;
当前选择的是哪个库
select database;
查看当前应用的版本
select version();
数据类型
如何设置有符号和无符号
int unsigned —无符号 int — 有符号:
zerofill为前面填充0
zerofill
枚举类型的,如果只能取固定值,那么可以用枚举不区分大小写
create table tab_c{ c1 enum(‘f’,’m’)— c1 这一列只能取 字符 ‘f’ 和 ‘m’ }
set 类型的 类似于enum 可以有多列
s1 set(‘a’,’b’,’c’,’d’)
数值型
| 类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
|---|---|---|---|---|
| TINYINT | 1 byte | (-128,127) | (0,255) | 小整数值 |
| SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
| MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
| INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
| BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
| FLOAT | 4 bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
| DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
| DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
如果插入的数字超出了范围,会插入一个临界值,并返回一个异常
日期型
| 类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
|---|---|---|---|---|
| DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
| TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
| YEAR | 1 | 1901/2155 | YYYY | 年份值 |
| DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
| TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 |
YYYYMMDD HHMMSS | 混合日期和时间值,时间戳,如果没有给它赋值。则默认使用当前时间 |
文本
| 类型 | 大小 | 用途 |
|---|---|---|
| CHAR | 0-255 bytes | 定长字符串 |
| VARCHAR | 0-65535 bytes | 变长字符串 |
| TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
| TINYTEXT | 0-255 bytes | 短文本字符串 |
| BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
| TEXT | 0-65 535 bytes | 长文本数据 |
| MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
| MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
| LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
| LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
char 【0-255】较短的文本 不可变长度,节省时间 char存储较短类型的字符
varchar【0-65535】可变长度,节省空间 varchar存储较大的
text blob 较长的文本:
数据表的修改
创建表
CREATE TABLE stuinfo( id INT PRIMARY KEY, #主键 stuName VARCHAR(20) NOT NULL ,# 非空约束 gender CHAR(1), seat INT UNIQUE,# 唯一约束 age INT DEFAULT 18,# 默认约束 majorId INT, foreign key(majorId) REFERENCES major(id) #外键约束 ) CREATE TABLE major( id INT PRIMARY KEY , majorname VARCHAR(20) UNIQUE )
约束
保证数据的准确性和一致性
not null — 用于保证该字段不能为空 default — 默认约束 ,用于保证该字段有默认值 primary key : 主键约束 用于保证该字段有唯一值 主键非空 如学号 unique 该字段的值具有唯一性,可以为空 比如座位号 foreign key — 外键约束 用于限制两个表的关系,保证该字段的 — 值必须来自主表的关联列 — 在从表添加外键约束,用于引用主表中某列的值
外键约束
ALTER TABLE stuinfo ADD FOREIGN KEY(id) REFERENCES major(id)
外键约束
- 要求在从表设置外键关系
- 从表的外键列的类型和主表的关联列的类型要求一致或兼容,内容无要求
- 主表的关联列必须是一个key
- 删除时不能先删除主表 | | 位置 | 支持的数据类型 | | —- | —- | —- | | 列级约束 | 列的后面 | 语法都支持,但外键没有效果 | | 表级约束 | 所有列的下面 | 默认和非空不支持,其他都支持 |
修改表时添加约束(同修改列的类型是一样的)
添加非空约束
ALTER TABLE major MODIFY COLUMN majorname VARCHAR(20) NOT NULL
如果忘记了,如何给xxx添加自增约束?
alter table xxx add primary key(id);
如何给xxx删除主键约束?
alter table xxx drop primary key(id);
联合主键,每个主键都不可以为空,只要有一个不同就行。
create table user2( id int , name varchar(20), password varchar(20), primary key (id,name));
自增约束
标识列必须和key搭配
一个表至多有一个标识列
标识列的类型只能是数值型
可以设置步长和起始值
mysql> create table user6( -> id int primary key auto_increment, -> name varchar(20));
插入值的时候,如果自增约束的字段为null,就可以自己增加
insert into user6 values(null.’hans)
怎么设置自增步长
set auto_increament_increament = 3
怎么设置起始位置
需要修改起始位置编号的,赋值。其余的为null
ALTER TABLE major MODIFY COLUMN majorname VARCHAR(20) PRIMARY KEY auto_increment
唯一约束
约束修饰的字段的值不可重复
创建时添加唯一约束
mysql> create table user5( -> id int, -> name varchar(20) unique);
创建后添加唯一约束
mysql> alter table user3 add unique(name);
默认约束,default
如果我们插入字段的时候,如果没有传值,就会使用默认值
外键约束,涉及两个表
mysql > create table classes( -> id int primary key, -> name varchar(20));
mysql> create table students( -> id int primary key, -> name varchar(20), -> class_id int, -> foreign key(class_id) references classes(id));
主表中没有的数据值,在副表中是不可以使用的。
主表中的记录被副表使用的时候,是不能够删除的
查看表的结构 desc
describe stui;
修改表名xxx 为yyy
alter table xxx rename to yyy
给数据表添加一列
mysql> alter table DateType add column tFLOAT float;
删除数据表的一列
mysql> alter table DateType drop column tDECIMAL;
修改列名和列的信息
alter table student change column StuId Sid int(15) not null auto_increment primary key;
数据操作
更新数据 update
update stui set name = ‘hs’ where id = 123; update stui set字段 = 值 where 筛选条件
添加数据 insert
insert into stui(id,name) values(123,’am’); insert into stui values(123,’am’); — 这种方法要匹配对应的值i —一次插入多行 insert into student(score,age,name) values(123.2,21,”fdfa”), values(3234.2,231,”df2a”) values(3.2,233,”3321”) values(124.2,239,”ek”);—
删除 delete
delete from stui where name = ‘hs’; — 可以搭配limit 来执行 delete from stui where name = ‘hs’ limit 2;
复制表的结构或数据
create table 表名 like 旧表; — 仅仅复制结构
复制表的结构+数据
create table 表名 select 查询列表 from 旧的表 where 筛选条件
数据查询
mysql查询练习
查询的格式
select 查询列表 from 表1 别名 inner/left/right/.. join 表2 on 连接条件 where 筛选 group by 分组 having 筛选 order by 排序列表 limit 排序列表
字段,表达式,函数,常量,表都可以起别名
在实际开发中,不使用 ’ ‘ 可以提高阅读性和性能
select from products order by prod_price; select prod_name,prod_id,prod_price from products order by prod_price; select prod_name,prod_id,prod_price from products order by 2,3;— 从第二行第三行排序,只能从选中的列排序 select from products order by prod_price limit 3 offset 2; — 从第二个开始。往后截取三个 select prod_name,prod_id,prod_price from products order by prod_price desc; — 按照降序排列
获取特定的元素
select from orderitems where quantity = 100;
比较符号
| 操作符 | 描述 |
|---|---|
| = | 等于 |
| <> 或 != | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| BETWEEN | 在某个范围内 |
| LIKE | 搜索某种模式 |
and 操作符和 or 和not
select from orders where cust_id = 1000000001 AND order_num = 20005; — 筛选出order中cust_id = 1000000001并且 order_num = 20005的行
select from orders where cust_id = 1000000001 or order_num = 20005; — 筛选出order中cust_id = 1000000001或者order_num = 20005的行
and 和 or 联合使用 ,需要加括号
select * from orders where (cust_id = 1000000001 or cust_id = 1000000003) and order_num >100;
用 in 来指定范围
select * from products where vend_id in (‘dll01’,’brs01’);
like关键字 只能作用于字符串
通配符开销比较大,不要过度使用通配符,尽量使用其他方法代替。
使用通配符%
%可以用来代表任意长度(0个也可)的字符串。或者字符。可以放在开头,中间,或者结尾
mysql> select vend_id from products where vend_id like ‘dll%’; +————-+ | vend_id | +————-+ | DLL01 | | DLL01 | | DLL01 | | DLL01 | +————-+ mysql> select vend_id from products where vend_id like ‘%l%’; +————-+ | vend_id | +————-+ | DLL01 | | DLL01 | | DLL01 | | DLL01 |
使用通配符_ 只匹配对应位置的一个字符
mysql> select from products where vend_id like ‘_RS01’; +————-+————-+——————————+——————+———————————————————————-+ | prod_id | vend_id | prod_name | prod_price | prod_desc | +————-+————-+——————————+——————+———————————————————————-+ | BR01 | BRS01 | 8 inch teddy bear | 5.99 | 8 inch teddy bear, comes with cap and jacket | | BR02 | BRS01 | 12 inch teddy bear | 8.99 | 12 inch teddy bear, comes with cap and jacket | | BR03 | BRS01 | 18 inch teddy bear | 11.99 | 18 inch teddy bear, comes with cap and jacket | +————-+————-+——————————+——————+———————————————————————-+
使用 as 来为列起别名
SELECT first_name AS 名 FROM employees;
*使用 distinct 去掉重复的
select distinct job_id from employees;— 查询员工都有干什么工作的
使用concat 来拼接多行数据
SELECT CONCAT(first_name,” “,last_name) AS 姓名 FROM employees;
外连接
查询一个表中有,另一个表中没有的记录
特点:
- 外连接的查询结果为主表中的所有记录
- 如果从表中没有匹配的,则显示null
- 一般用于查询交集中剩余的不匹配的行,
- 外连接查询结果 = 内连接结果 + 主表中有而从表没有的记录
- 左外连接 left join 左边的是主表 ,返回左边表的全部记录
- 右外连接 right join 右边的是主表,返回右边表的全部记录
- 左外和右外交换两个表的顺序,可以实现同样的效果
- ~~全外连接 = ~~ 内连接结果 + 表1中有而从表2没有的记录 + 表2中有而从表1没有的记录
- 主表列不为空,从表列为空
联合查询
格式
查询语句一
union
查询语句二
。。。
要求,多条查询语句的查询列数是一致的,并且顺序一致
union关键字默认去重
union all 是包含重复项的
union 联合,将多条查询语句的结果组合成一个
查询部门编号>90 或邮箱包含 a 的员工信息
SELECT FROM employees WHERE email LIKE ‘%a%’ UNION SELECT FROM employees WHERE department_id>90
delete VS truncate
1、命令类型 delete是数据操作语言(DML)命令;而truncate是数据定义语言(DDL)命令。 2、功能 delete命令根据指定的SQL语句从表中删除单个,多个或所有记录;而truncate命令从数据库中删除所有记录和表结构。 3、Where子句 delete命令支持WHERE子句,可以使用带有DELETE的where子句来过滤和删除特定记录;而,truncate命令不支持WHERE子句。 4、锁定 delete命令采用行级锁定,表中的每一行都被锁定以进行删除;truncate命令采用表级锁定,锁定了整个表以删除所有记录。 5、索引视图 delete命令可以与索引视图一起使用;而,truncate命令不能与索引视图一起使用。 6、执行速度 由于elete命令维护日志,因此速度很慢。但是,由于truncate命令在事务日志中维护最少的日志记录,因此执行速度更快。 7、表结构 delete命令不会影响表结构,而truncate命令会从数据库中删除表结构。 8、事务空间 delete命令比truncate命令
