1.概述
(1)概念
数据库就是数据存储的仓库,用于存储和管理数据。
(2)常见的数据库产品
- Oracle:oracle公司 大型的关系型数据库 6.0 收费的
- DB2:IBM公司 大型的关系型数据库 收费的
- Mysql:mysql公司 中小型关系型数据库 免费的。后来被oracle收购,mysql6之后收费(社区版,旗舰版)
- Sql Server:微软公司 中小型关系型数据库 收费的
- Sqllite:安卓系统内置数据库 微型关系型数据库 免费的
- NoSql系列数据库:not only sql 非关系型数据库 比如用 键值存储数据这种数据库 类似JSON
关系数据库:由行和列组成的这种二维表。
2.数据类型
(1)数值类型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
tinyint | 1 字节 | (-128,127) | (0,255) | 小整数值 |
int | 4 字节 | (- 2 31 2^{31} 231, 2 31 2^{31} 231-1) | ( 2 32 2^{32} 232-1) | 大整数值 |
bigint | 8 字节 | (- 2 63 2^{63} 263, 2 63 2^{63} 263-1) | ( 2 64 2^{64} 264-1) | 极大整数值 |
float | 4 字节 | (- 2 127 2^{127} 2127, 2 127 2^{127} 2127-1) | ( 2 128 2^{128} 2128-1) | 单精度浮点数值 |
double | 8 字节 | (- 2 1023 2^{1023} 21023, 2 1023 2^{1023} 21023-1) | ( 2 1024 2^{1024} 21024-1) | 双精度浮点数值 |
(2)日期和时间类型
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
data | 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 | 年份值 |
datatime | 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 | YYYYMMDD HHMMSS | 时间戳 |
(3)字符串类型
类型 | 大小 | 用途 |
---|---|---|
char | 0-255字节 | 定长字符串 |
varchar | 0-65535字节 | 变长字符串 |
text | 0-65535字节 | 长文本数据 |
注意:char和varchar的区别
- 1.定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的,
- 2.char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据。
- 3.varchar比char节省空间,在效率上比char会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。
varchar虽然比char节省空间,但是如果一个varchar列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用char代替varchar会更好一些。
3.SQL结构化查询语言
通过sql语言可以操作所有的关系型数据库,因为每种数据库之间sql语句存在差异,这种差异就被称为“方言”。
(1)DDL(Data Definition Language)用来定义数据库的库,表,列等。
create database 数据库名称;-- 创建数据库
drop database 数据库名称;--删除数据库
show database;-- 查询所有数据库的名称
create table 表名( -- 创建表
列名 类型,
列名 类型
);
drop table 表名;-- 删除表
alter table 表名 add (列名 类型);-- 添加列
alter table 表名 modify 列名 类型;-- 修改列的类型
alter table 表名 change 原列名 新列名 类型;-- 修改列名
alter table 表名 drop 列名;-- 删除列
show tables;-- 查询该数据库下所有表名称
desc 表名; -- 查询表结构
(2)DML(Data Manipulation Language)用来定义数据库记录(增、删、改)
insert into 表名(列名,列名) values (值,值);-- 向表中添加数据
insert into 表名 values(值,值);-- 当给表中所有列都需要添加数据时 可以省略列名
delete from 表名 where 条件;-- 根据条件删除列
update 表名 set 列名=值 where 条件;-- 根据条件修改列
案例演示
CREATE TABLE MyTest(
id INT,
username CHAR(3),
sex CHAR(2),
age INT
);
INSERT INTO MyTest VALUES(1,"张三","男",19);
INSERT INTO MyTest(id,username,sex) VALUES(2,"王老五","女");
INSERT INTO MyTest VALUES(3,"李四","男",28);
UPDATE MyTest SET age=20 WHERE age=19;
DELETE FROM mytest WHERE age IS NULL; -- 不区分大小写
(3)DCL(Data Control Language)用来定义访问权限和安全级别;
MySQL数据库权限问题:root拥有所有权限(可以干任何事情),我们可以分配权限账户。
-- 数据库中所有分配的账户信息都在mysql数据库中的user表中存储
-- 修改密码
UPDATE USER SET PASSWORD=PASSWORD('123456') WHERE USER='root';
分配权限账户
-- 语法
GRANT 权限 ON 数据库名.某张表名 TO '用户名'@'localhost' IDENTIFIED BY '123456';
(4)DQL(Data Query Language)用来查询记录(数据)。
语法
select 要查询的列 from 表名 where 条件
条件:where字句
=、!=、<>(不等于)、<、<=、>、>=
BETWEEN…AND 在什么范围之间
IN(set)
IS NULL 为空
IS NOT NULL不为空
AND 并且
OR 或者
NOT 非
案例演示
CREATE TABLE emp(
empno INT,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm DECIMAL(7,2),
deptno INT
) ;
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
-- 查询奖金不为null所有人的信息
SELECT *FROM emp WHERE comm IS NOT NULL;
-- 查询工资在2000到3000之间的员工编号和姓名
SELECT empno AS 编号,ename AS 姓名 FROM emp WHERE sal BETWEEN 2000 AND 3000;-- as可以给字段起个别名
-- 查询部门编号是10或20的员工
SELECT *FROM emp WHERE deptno IN(10,20);-- 用or也可以
-- 字段也可以进行计算 查询员工的年薪,编号,姓名
SELECT empno,ename,sal*12 FROM emp;
字段计算
- 如果某个字段的值是null,我们进行运算时需要将null当做0来处理,就可以使用 ifnull(字段名,0)来处理。
- distinct 可以对查询结果进行去重
-- 字段也可以进行计算 查询员工的年薪,编号,姓名
SELECT empno,ename,sal*12 FROM emp;
-- 查询员工的年薪(包含奖金)
SELECT empno,ename,sal*12+comm FROM emp;-- 我们发现null值参与运算时的结果还是 null
-- 如果奖金是null值 我们想要当0来处理 ifnull()
SELECT empno,ename,sal*12+IFNULL(comm,0) FROM emp;
-- 去重
SELECT DISTINCT deptno FROM emp ;
模糊查询like
模糊查询使用的通配符
- _匹配单个任意字符
- %匹配多个任意字符
案例演示
-- 查询姓名中包含A的人
SELECT *FROM emp WHERE ename LIKE '%A%';
-- 查询姓名是A开头的人
SELECT *FROM emp WHERE ename LIKE 'A%';-- 啥结尾就是 '%字符'
-- 查询第二个字符是M并且工作名是5个字符组成的
SELECT *FROM emp WHERE ename LIKE '_M%'AND job LIKE '_____';
排序
- order by 字段名 asc 升序
- order by 字段名 desc 降序
案例演示
-- 查询所有员工信息 工资按升序排列
SELECT *FROM emp ORDER BY sal ASC;
-- 查询所有员工信息 工资按降序排列
SELECT *FROM emp ORDER BY sal DESC;
-- 工资按升序排列 奖金按降序排列
SELECT *FROM emp ORDER BY sal ASC,comm DESC;
聚合函数
- count():计数
- max()和min():最大值,最小值
- avg():平均值
- sum():求和
注意:
count(*)是对所有的列进行计算。
count(列名)null值是不参与计算的。
案例演示
-- 查询有奖金的人的总数
SELECT COUNT(comm) FROM emp;-- 3
SELECT COUNT(*) FROM emp;-- 9
-- 查询工资最高
SELECT MAX(sal) FROM emp;
-- 工资的平均值
SELECT AVG(sal) FROM emp;
-- 工资的总和
SELECT SUM(sal) FROM emp;