文章目录
–数据库
–1.概述
用来存储数据和管理数据,最终形成类似于表格的样子,有行有列(字段)
分类: 关系型数据库 和 非关系型数据库
关系型数据库的产品有很多: Mysql(免费) Oracle SqlServer
非关系型数据库的产品有很多: Redis
查看库 show databases;
–2.Mysql数据库的安装
本质就是一些软件,需要下一步下一步的安装
服务器的安装: 端口号默认使用3306 , 字符集默认使用了latin1(最好改成u8) , 密码可以设置成root
客户端的安装: sqlYog软件
下面给一个Mysql安装配置的链接:Mysql5.7安装配置点我
–3.Mysql数据库的使用
使用客户端连接服务器 , 操作服务器里的数据
客户端有两种: DOS窗口 / 可视化的工具
数据库的结构: 数据库 -> 表 -> 记录(行 和列/字段 组成的)
–4.操作数据库的语言
SQL全称是结构化查询语言,对数据库里的数据进行各种操作,常见操作就是增删改查CRUD
SQL的分类:
DML 数据操作语言 , 对数据进行CRUD
DDL 数据库定义语言 , 创建库 , 创建表
DCL 数据库控制语言 , 细粒度的管理操作数据库的权限…
DQL 数据库查询语言,对数据发起查询需求
–常见的操作
–1. 数据库
查看所有的库 show databases;
mysql>show databases; --查看所有数据库
创建库 create database 数据库名
mysql>create database cgb2106 DEFAULT CHARACTER SET utf8;; --创建名为 cgb2106的数据库,如果后续产生中文乱码问题,可以加入 DEFAULT CHARACTER SET utf8;来解决
删除库 drop database 数据库名
mysql>drop database cgb2106; --删除名为cgb2106的数据库
–2.表
- 查看表:show tables;
- 创建表:create table 表名 (字段名 类型(长度),2,3,4,5…)
mysql>create table user2(id int primary key auto_increment,door_name varchar(100),tel varchar(59));
Query OK, 0 rows affected (0.151 sec)
- 查看表结构:desc 表名
mysql> desc user2;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| door_name | varchar(100) | YES | | NULL | |
| tel | varchar(59) | YES | | NULL | |
| adress | varchar(20) | YES | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
4 rows in set (0.008 sec)
- 修改表:alter table 表名 add column 字段名 字段类型(长度)
mysql>alter table user2 add column adress varchar(20);
Query OK, 0 rows affected (0.019 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 删除表:drop table 表名
mysql>drop table user2; --删除名字为user的表
–3.记录
- 防止中文插入不了的问题 : set names gbk;
mysql>set names gbk;
- 1.查询:select 字段名1,字段名2…,from 表名;/ select * from 表名 后者查全部字段
mysql>select * from user2;
+----+-----------+---------+--------+
| id | door_name | tel | adress |
+----+-----------+---------+--------+
| 1 | 小美 | 3 | NULL |
| 2 | 小hua | 8 | NULL |
| 3 | 小tian | 8 | NULL |
| 4 | NULL | NULL | 成都 |
| 5 | 帅哥 | 1829323 | 成都 |
+----+-----------+---------+--------+
- 2.创建:insert into 表名 values(字段1的值,字段2的值…)
mysql> insert into user2 values(5,"帅哥",1829323,"成都");
Query OK, 1 row affected (0.034 sec)
- 3.修改:update 表名 set 字段名 = 值 where 约束条件
mysql>update user2 set tel = 1243214 where id = 4;
Query OK, 1 row affected (0.038 sec)
Rows matched: 1 Changed: 1 Warnings: 0
- 4.删除:delect from 表名 where 约束条件
mysql>delete from user2 where id = 4;
Query OK, 1 row affected (0.020 sec)
–4.排序
- 将user2表逆序排序查询输出
mysql>select * from user2 order by id desc;
+----+-----------+---------+--------+
| id | door_name | tel | adress |
+----+-----------+---------+--------+
| 5 | 帅哥 | 1829323 | 成都 |
| 4 | NULL | NULL | 成都 |
| 3 | 小tian | 8 | NULL |
| 2 | 小hua | 8 | NULL |
| 1 | 小美 | 3 | NULL |
+----+-----------+---------+--------+
5 rows in set (0.001 sec)
记录总数
- 查询表中的所有记录数
mysql>select count(*) from user2;
+----------+
| count(*) |
+----------+
| 4 |
+----------+
1 row in set (0.001 sec)
数据类型
命名规则
- 字段名必须以字母开头,尽量不要使用拼音
- 长度不能超过30个字符(不同数据库,不同版本会有不同)
- 不能使用SQL的保留字,如where,order,group
- 只能使用如下字符az、AZ、0~9、$ 等
- Oracle习惯全大写:USER_NAME,mysql习惯全小写:user_name
- 多个单词用下划线隔开,而非java语言的驼峰规则
字符
- char长度固定,不足使用空格填充,最多容纳2000个字符,char(11)存储abc,占11位。查询速度极快但浪费空间
- varchar变长字符串,最多容纳4000个字符,varchar(11)存储abc,只占3位。查询稍慢,但节省空间。Oracle为varchar2
- 大文本: 大量文字(不推荐使用,尽量使用varchar替代)
以utf8编码计算的话,一个汉字在u8下占3个字节
注:不同数据库版本长度限制可能会有不同
数字
- tinyint,int整数类型
- float,double小数类型
- numberic(5,2) decimal(5,2)—也可以表示小数,表示总共5位,其中可以有两位小数
- decimal和numeric表示精确的整数数字
日期
- date 包含年月日
- time时分秒
- datetime包含年月日和时分秒
- timestamp时间戳,不是日期,而是从1970年1月1日到指定日期的毫秒数
图片
- blob 二进制数据,可以存放图片、声音,容量4g。早期有这样的设计。但其缺点非常明显,数据库庞大,备份缓慢,这些内容去备份多份价值不大。同时数据库迁移时过大,迁移时间过久。所以目前主流都不会直接存储这样的数据,而只存储其访问路径,文件则存放在磁盘上。
字段约束
主键约束
主键约束:如果为一个列添加了主键约束,那么这个列就是主键,主键的特点是唯一且不能为空。通常情况下,每张表都会有主键。
添加主键约束,例如将id设置为主键:
create table abc(
id int primary key auto_increment
);
insert into abc values(null);
insert into abc values(null);
insert into abc values(null);
select * from abc;
非空约束
非空约束:如果为一个列添加了非空约束,那么这个列的值就不能为空,但可以重复。
添加非空约束,例如为password添加非空约束:
create table user(
id int primary key auto_increment,
password varchar(50) not null
);
show tables;
insert into user values(null,null);//不符合非空约束
insert into user values(null,123;);//OK
唯一约束
唯一约束:如果为一个列添加了唯一约束,那么这个列的值就必须是唯一的(即不能重复),但可以为空。
添加唯一约束,例如为username添加唯一约束及非空约束:
create table test(
id int primary key auto_increment,
username varchar(50) unique--唯一约束
);
show tables;
insert into test values(null,'lisi');
insert into test values(null,'lisi');--username的值要唯一,重复会报错的
select * from test;
数据准备
部门表dept
CREATE TABLE dept(
deptno int primary key auto_increment ,
dname VARCHAR(20),
loc VARCHAR(13)
);
INSERT INTO dept VALUES(null,'accounting','一区');
INSERT INTO dept VALUES(null,'research','二区');
INSERT INTO dept VALUES(null,'operations','二区');
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| deptno | int(11) | NO | PRI | NULL | auto_increment |
| dname | varchar(20) | YES | | NULL | |
| loc | varchar(13) | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
员工表emp
CREATE TABLE emp(
empno int primary key auto_increment,
ename VARCHAR(10),
job VARCHAR(10),
mgr int,
hiredate DATE,
sal double,
comm NUMERIC(7,2),
deptno int
);
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| empno | int(11) | NO | PRI | NULL | auto_increment |
| ename | varchar(10) | YES | | NULL | |
| job | varchar(10) | YES | | NULL | |
| mgr | int(11) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | double | YES | | NULL | |
| comm | decimal(7,2) | YES | | NULL | |
| deptno | int(11) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
插入数据
INSERT INTO emp VALUES(100,'jack','副总',NULL,'2002-05-1',90000,NULL,1);
INSERT INTO emp VALUES(200,'tony','总监',100,'2015-02-02',10000,2000,2);
INSERT INTO emp VALUES(300,'hana','经理',200,'2017-02-02',8000,1000,2);
INSERT INTO emp VALUES(400,'leo','员工',300,'2019-02-22',3000,200.12,2);
INSERT INTO emp VALUES(500,'liu','员工',300,'2019-03-19',3500,200.58,2);
基础函数
lower
SELECT 'ABC',LOWER('ABC') from dept; --数据转小写
upper
select upper(dname) from dept --数据转大写
length
select length(dname) from dept --数据的长度
substr
SELECT dname,SUBSTR(dname,1,3) FROM dept; --截取[1,3]
concat
select dname,concat(dname,'123') X from dept --拼接数据
replace
select dname,replace(dname,'a','666') X from dept --把a字符替换成666
ifnull
select ifnull(comm,10) comm from dept2 #判断,如果comm是null,用10替换
round & ceil & floor
- round四舍五入,ceil向上取整,floor向下取整
- 直接四舍五入取整
select comm,round(comm) from emp
- 四舍五入并保留一位小数
select comm,round(comm,1) from emp
- ceil向上取整,floor向下取整
select comm,ceil(comm) ,floor(comm) from emp
uuid
SELECT UUID()
返回uuid:a08528ca-741c-11ea-a9a1-005056c00001
now
select now() -- 年与日 时分秒
select curdate() --年与日
select curtime() --时分秒
year & month & day
- hour()时 minute()分 second()秒
select now(),hour(now()),minute(now()),second(now()) from emp ;
- year()年 month()月 day()日
select now(),year(now()),month(now()),day(now()) from emp ;
转义字符
- '作为sql语句符号,内容中出现单撇就会乱套,进行转义即可
select 'ab'cd' -- 单引号是一个SQL语句的特殊字符
select 'ab\'cd' --数据中有单引号时,用一个\转义变成普通字符