mysal
数据库
简介:
1.概念
data 数据
database 数据库
table 表
column 列
row 行
dbms(database management system)数据库管理系统。
2.数据库分类
数据库目前主要分为两大类:
1.关系型数据
典型代表:mysql oracle sql servel
mysql是开源的、免费的
oracle是收费的
2.非关系型数据库
典型代表有:BigTable(Google)、Cassandra、MongoDB、CouchDB;
3.命令行操作
第一种:win(电脑按盘上四个小方块)+R
第二种:点击电脑键盘左下角win标识,点击运行,输入cmd,
f:
(url直接输入bin的地址)
mysql -u root -p;
将小皮打开=>自己的地址=>`cd` 地址名=>`mysql -u root -p`
数据库的相关操作
显示所有仓库(查看当前所有的数据库)
show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| name |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
其中上面的数据库`mysql`和`performance_schema`
创建仓库
`create database 数据名 charset utf8;`
mysql> create database t2 charset utf8;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| name |
| performance_schema |
| sys |
| t2 |
+--------------------+
6 rows in set (0.00 sec)
删除仓库
`drop database 数据库名;`
mysql> drop database t2;
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| name |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
切换仓库(读取数据库名称)《==》打开指定的库
`use 仓库名;`
mysql> use name;
Database changed
数据表的相关操作
概念
数据库使我们日常生活中的仓库,数据表可以认为是货架,数据表中每一列都叫做字段。
查看当前数据库的所有表
show tables;
mysql> show tables;
Empty set (0.00 sec)
##还没写入内容暂时为空
查看其他库的所有表
show table from 库名;
创建表
`create table 表名(`
列名 列类型,
列名 列类型
`)`
create table worked(
id int,
isname varchar(15),
sex varchar(20)
);
查看表结构
desc 表名;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kZBnlIt5-1635327264473)(D:\1+X\截图\01.png)]
创建数据库
MySQL
支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值类型
类型 | 大小 | 范围(有符号) | 用途 |
---|---|---|---|
INT或``INTEGER (in 或 integer) | 4 字节 | (-2 147 483 648,2 147 483 647) | 大整数值 |
FLOAT (float) | 4 字节 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 单精度 浮点数值 |
DOUBLE (double) | 8 字节 | (-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) | 双精度 浮点数值 |
字符串
字符串类型指`CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET`。
`char和varchar`:
1.char(n) 若存入字符数小于n,则以空格补上。char的储存末尾是不能有空格的,`varchar`不会。
2.`char(n)` 固定长度,char(4)不管是存入几个字符,都将占用4个字节,`varchar`是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以`varchar(4)`,存入3个字符将占用4个字节。
3.`char`类型的字符串检索速度要比`varcha`r类型的快。
`varchar`和`text`:
1.`varchar`可指定个数,text不能指定个数,内部存储`varcha`是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),`text`是实际字符数+2个字节。
2.`text`类型不能有默认值。
3.`varchar`可直接创建索引,text创建索引要指定前多少个字符。`varchar`查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。
类型 | 大小 | 用途 |
---|---|---|
CHAR (char) | 0-255字节 | 定长字符串 |
VARCHAR (varchar) | 0-65535 字节 | 变长字符串 |
TEXT (text) | 0-65 535字节 | 长文本数据 |
日期时间类型
表示时间值的日期和时间类型为`DATETIME`、`DATE`、`TIMESTAMP`、`TIME`和`YEA`R。
类型 | 范围 | 用途 |
---|---|---|
DATE | 1000-01-01/9999-12-31 | 日期值 |
TIME | '-838:59:59'/'838:59:59' | 时间值或持续时间 |
YEAR | 1901/2155 | 年份值 |
DATETIME | 1000-01-01 00:00:00/9999-12-31 23:59:59 | 混合日期和时间值 |
TIMESTAMP | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | 混合日期和时间值,时间戳 |
字段的类型:
整数为:`int浮点值==>float字符串`都是用`char 定长和varchar不定长`
char(8)(英文单词站一个格,汉字站两个格)==>如果用户是4位,系统会自动不齐个空格
`varchar(8)`如果是四位 ,不会自动补齐。
方式:`create table 表名 (id int,username varchar(20),phone char(11));`
mysql> create table stu2(id int,username varchar(20),phone char(11));
Query OK, 0 rows affected (0.00 sec)
修改字段名
`方式: alter table 表名 change 原字段名 新字段名 新类型`
mysql> alter table stu2 change phone adress varchar(30);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
查看表结构
`desc 表名`
mysql> desc stu2;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| username | varchar(20) | YES | | NULL | |
| adress | varchar(30) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
添加字段
`alter table 表名 add 新字段名;`
mysql> alter table stu2 add phone char(11);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
删除字段
`alter table 表名 drop 要删除的字段;`
mysql> alter table stu2 drop phone;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
字段修饰
primary key ==>主键的意思 主要是防止添加字段是重复的
not null ==>表示在该字段添加的值一定不能为空
comment==>是添加注释的意思
auto_increnment==>是自增长的意
foreign key==> 外键约束
unique==> 唯一约束
default==>默认值
外键
创建
[constraint 外键名] foreign key(外键字段名) references 父表格(参照字段名);
添加
alter table 子表名 add[constraint 外键名] foreign key (外键字段名) reference 父表名(参照字段名);
distrct:父表不能删除或更新一个被子表引用的记录
cascade:父表删除或更新后自动删除子表或更新子表中的数据。
set null: 父级操作后子级被置空;(在都没有加not null的情况下)。
no action :与sql中的district相同
set default:设默认值
对数据进行操作
增加数据
插入一条数据
insert into 表名(字段1,字段2.。。)values(值1,值2,。。。)
插入多条语句
insert into表名(字段1,字段2.。)values(值1,值2.。),(值1,值2.。)
删除数据
delete from 表名 where 条件表达式;
truerate 全部清空
更新数据
update 表名 set 字段名=新的值 where 条件
查询数据
查询所有数据
select*from 表名;
查询指定字段
select 字段1,字段2... from 表名
去除重复的字段
select distinct 字段名 from 表名
where条件查询
(1)查询工资
select *from 表名 where sal>3000;
(2)查询工资不等于6000
select *from 表名 where sal>6000;
(3)查询工资等于6000
select*from 表名 where sal=6000;
(4)查询不是女生的信息
select*from yuan where name='jim' and sex='女';
(5)查询工作在3000到5000之间的
##between 表示范围 相当于>=3000 and <=5000
select *from yuan where sal between 3000 and 5000
(6)查询地区是保定 南京 沧州
in(值1,值2,值3)表示是里面的任意一个值
(7)like模糊查询
like后面可以跟字符串表示模糊查询,%代表任意字符,一个`_`代表一个字符
##比如查询名字叫张x
select *from yuan where name like '张%';
select *from yuan where name like '%华';
select *from yuan where name like '%华%';
MySQL
语法规范
1. 不区分大小写,但建议关键字大写
2. 每条命令最好用分号结尾
3. 每条命令根据需要,可以进行换行
4. 注释:单行注释:#注释内容、-- 注释文字
多行注释:/* 注释文字 */
employee_id 员工编号
first_name 名
last_name 姓
email 邮箱
phone_number 电话号码
job_id 工种编号
salary 月薪
commission_pct奖金率
manager_id 上级领导的员工编号
department_id 部门编号
hiredate 入职日期
1统计总共的数据
select count(*) from yuan;
2统计表中的男生和女生的人数
select count(*) from yuan grounp by sex;
3统计表中每个部门工资最高的相关信息
select b_id,max(sal) from yuan by b_id;
4统计每个地区平均工资>2000
select avg(sal) from yuan grounp by area having avg(sal)>=2000;
排序
语法:select 字段 from 表名 order by 排序字段 desc/asc;
desc
表示降序;asc
表示升序。
如果不设置排序方式,默认是从低到高排序的。
(1)把数据表按工资从高到底排序
select *from yuan order by sal desc;
(2)比如我们查询yuan表中工资最高的前三名
select*from yuan order by sal desc limit 3;
limit索引号,长度;
连表的查询
-- 笛卡尔积
-- 语法:`select*from 表名1 inner join 表名2;`
## 内连接
-- 语法:`select *from 表名1 inner join 表名2 on 条件;`
# 外连接
# 左外连接
-- 语法:`select 字段 from 左表名 left outer join 右表名 on 条件;`
# 右外连接
-- 语法:`select 字段 from 左表名 right outer join 右表名 on 条件;`
SELECT name,sex,score,tname FROM student inner JOIN teacher ON student.tid=teacher.id;
SELECT name,sex,score,tname FROM student LEFT JOIN teacher
ON student.tid=teacher.id;
SELECT name,sex,score,tname FROM student RIGHT JOIN teacher
ON student.tid=teacher.id;
从navicat
导入导成sql
语句
表==>sql
文件==>结构和数据
视图
创建视图:create view 视图名 as select 语句;
删除视图:drop view 视图名;
索引分类
##普通索引==>是唯一的索引,加速查询
create index 索引名 on 表名(列名);
##唯一索引==>(可以有null)是主键索引,加速查询//列值唯一==>(不可以有null)+表中只有一个
create unique index 索引号 on 表名(列名);
##组合索引:多列值组成一个索引,专门用于组合搜素,其效率大于索引合并
普通组合:create index 索引名 on 表名(列名1,列名2.。。);
唯一组合:create unique index 索引名 on 表名(列名1,列名2,,);
全文索引:对文本内容进行分词搜索。
查看索引: show index from 表名[from<数据库名>];
触发器
触发器(trigger),也叫触发程序,是与表有关的数据库对象。
语法:create trigger 触发器名 触发时机 触发事件 on 表名 for each row
触发程序体:
(1)时机:before/after
(2)事件:insert update delete
(3)for each row:当条件满足时就会触发程序
(4)可以是一条语句体,是由begin...end包囊的多条语句。
存储过程
语法:create procedure 存储过程名称(in|out|inout 参数名称 参数类型,.....)
begin
过程体;
end
-- 查看所有存储过程状态。
show procedure status;
-- 查看对应数据库下所有存储过程状态
show procedure status where db='数据库名';
-- 查看名称包含 student的存储过程状态
show procedure status where name like '%student%';
-- 查询存储过程详细代码。
show create procedure 过程名;
调用存储过程
call 存储过程名([过程参数[....]])
权限管理
语法:
grant 权限 on `数据库名`.*to `用户名`@`主机名`;
##权限可以是creat alert drop update delete select grant option all
删除权限:
revoke 权限 ON `数据库名`.*to `用户名`@`主机名`;
查看用户权限
show grants for `root`@`localhost`;
use 库名;
#进阶1:基础查询
/*
语法:
SELECT 查询列表 from 表名;
类似于 :System.out.println(打印的东西);
特点:
1、查询列表可以是:表中的字段、常量值、表达式、函数
2、查询的结果是一个虚拟的表格
*/
#查询表中的单个字段
SELECT
字段名
FROM
对应的表;
#查询表中的多个字段
SELECT
字段名1,字段2,字段3
FROM
对应的表;
事务处理
- 原子性
Atomicity
在操作工程中要么开始,要么全部写完,中间出行错的从头开始。(滚回Rollback
) - 一致性
Consitency
在执行语句中要么都完成要么都失败 - 隔离性
Isolation
两个事物之间是隔离开来的 - 持久性
Durability
事务处理结束后,是全部保存下来的,不会丢失。
开启事务:begin或star transaction
事务结束:commit/rollback之后
提交事务:commit
回滚事务:rollback
备份和恢复
mysqldump -u用户 -p密码 数据库名> 文件名.sql
备注:备份可以不是.sql
恢复数据
mysql -u用户名 -p 密码 新数据库名 <文件名.sql
查询全部字段:
select *from employees;
#查询常量值
SELECT 100
#查询表达式
SELECT 100*90;
#查询函数
select version();
#起别名
/*
1 便于理解
2 如果要查询的字段有重名的情况,使用别名可以区分开来。
*/
#方式一
select 100%98 as 结果;
select last_name as 姓,first_name as 名 from employees;
#方式二
select last_name 姓,first_name 名 from employees;
#去重
#案例:查询员工表中涉及的所有的部门编号
select distinct department_id from employees;
mysql中+号:
仅仅只有一个功能:运算符
select100+90 两个操作数都是数值型,
ck
#### 备份和恢复
```mysql
mysqldump -u用户 -p密码 数据库名> 文件名.sql
备注:备份可以不是.sql
恢复数据
mysql -u用户名 -p 密码 新数据库名 <文件名.sql
查询全部字段:
select *from employees;
#查询常量值
SELECT 100
#查询表达式
SELECT 100*90;
#查询函数
select version();
#起别名
/*
1 便于理解
2 如果要查询的字段有重名的情况,使用别名可以区分开来。
*/
#方式一
select 100%98 as 结果;
select last_name as 姓,first_name as 名 from employees;
#方式二
select last_name 姓,first_name 名 from employees;
#去重
#案例:查询员工表中涉及的所有的部门编号
select distinct department_id from employees;
mysql中+号:
仅仅只有一个功能:运算符
select100+90 两个操作数都是数值型,