目录
一、mysql的安装
二、数据库介绍
1.概念介绍
- 数据库:数据仓库,访问必须只能用SQL语句来访问。数据库其实就是一个文件的系统。
- 作用:存储数据,开发任何的应用,都有数据库。
- mysql数据库概念:一个数据库的服务器中包含多个数据库,一个数据库中有多张表,一个表中包含多个字段,表中存放是数据,一行数据和一个JavaBean实体对象是对应的。
2.数据库数据类型
(1)字符串型
- VARCHAR 长度是可变 根据实际数据长度占用空间
- CHAR 长度不可变,存入的数据不够,将填充到指定长度(右侧填充空格)
- BLOB :字节(电影 mp3)
- TEXT :字符(文本的内容)
(2)数值型
- TINYINT :占用 1 字节,能存储非常小的整数值。
取值范围:有符号:-128 到 127无符号:0 到 255
- SMALLINT:占用 2 字节,存储小范围的整数。
取值范围:有符号:-32,768 到 32,767无符号:0 到 65,535
- INT:占用 4 字节,能够存储一般范围的整数。
取值范围:有符号:-2,147,483,648 到 2,147,483,647无符号:0 到 4,294,967,295
- BIGINT:占用 8 字节,支持很大的整数范围。
- FLOAT:通常占用 4 字节,用于存储单精度浮点数。
- DOUBLE:通常占用 8 字节,用于存储双精度浮点数。
(3)逻辑型
BIT:在Java中是true或者false 在数据库bit类型(1或者0)
(4)日期型
- DATE :只包含日期(年月日)
- TIME :只包含时间(时分秒)
- DATETIME :包含日期和时间。如果插入数据的时候,字符值为空,字段的值就是空了。
- TIMESTAMP :包含日期和时间。如果插入数据的时候,设置字段的值为空,默认获取当前的系统的时候, 把时间保存到字段中。
3.数据库单表约束
(1) 主键约束 (PRIMARY KEY)
- 功能:唯一标识表中的每一行记录。主键的值不能重复,且不能为空。
- 唯一且非空。
(2)唯一约束 (UNIQUE)
- 功能:确保列中所有值是唯一的,允许空值。
(3)非空约束 (NOT NULL)
- 功能:确保列中的每个值都不能为空。
(4) 默认约束 (DEFAULT)
- 功能:为列提供默认值,当插入记录时如果没有为此列提供值,将会使用此默认值。
(5) 外键约束 (FOREIGN KEY)
- 功能:虽然外键通常涉及两个表之间的关系,但也可以在单个表中使用,来确保某列的值引用同一表中的主键或唯一列。
三、SQL语言
1.SQL分类
(1) DDL 数据定义语言
- 创建数据库 创建表 创建视图 创建索引 修改数据库 删除数据库 修改表 删除表
- create ‐‐ 创建 alter ‐‐ 修改 drop ‐‐ 删除
(2)DML 数据操作语言
- 操作数据 插入数据(insert) 修改数据(update) 删除数据(delete)
(3)DCL 数据控制语言
- if else while
(4)DQL 数据查询语言
- 从表中查询数据(select)
2.数据库操作
(1)创建数据库
create database 数据库名称
create database 数据库名称 character set 编码 collate 校对规则
create database mydb3 character set 'utf8' collate 'utf8_bin';
(2)查看数据库
show databases; ‐‐ 查看所有的数据库
use 数据库名称;(*****) ‐‐ 使用数据库
show create database 数据库名称; ‐‐ 查询数据库的创建的信息
select database(); ‐‐ 查询当前正在使用的数据库
(3)删除数据库
drop database 数据库名称; --删除数据库
(4)修改数据库
alter database 数据库名称 character set 'gbk' collate '校对规则';
3.表结构操作
(1)创建表
create table 表名称(
字段1 类型(长度) 约束,
字段2 类型(长度) 约束,
字段3 类型(长度) 约束
);
注意:
- 创建表的时候,后面用小括号,后面分号。
- 编写字段,字段与字段之间使用逗号,最后一个子段不能使用逗号。
- 如果声明字符串数据的类型,长度是必须指定的。
- 如果不指定数据的长度,有默认值的。int类型的默认长度是11
例如:
select database();
use 数据库名称;
create table employee(
id int,
name varchar(30),
gender char(5),
birthday date,
entry_date date,
job varchar(50),
salary double,
resume text
);
(2)单表删除
drop table 表名;
(3)查看表
desc 表名; ‐‐ 查询表的信息
show tables; ‐‐ 查看当前数据库中所有的标签
show create table 表名; ‐‐ 查看表的创建的信息
(4)修改表
alter table 表名 add 新列名 类型(长度) 约束; ‐‐ 添加列
alter table 表名 drop 列名; ‐‐ 删除列
alter table 表名 modify 列名 类型(长度) 约束; ‐‐ 修改列的类型或者约束
alter table 表名 change 旧列名 新列名 类型(长度) 约束; ‐‐ 修改列名
rename table 表名 to 新表名; ‐‐ 修改表的名称
alter table 表 名 character set utf8; ‐‐ 修改表的字符集
4.数据操作
(1)插入数据
insert into 表名 (字段1,字段2,字段3) values (值1,值2,值3);
insert into 表名 values (值1,值2,值3);
- 插入的数据与字段类型必须是相同的。
- 数据的大小范围在字段范围内
- 值与字段一一对应
- 字符串或者日期类型数据需要使用单引号
(2)MySQL插入中文数据乱码问题
- 先把MySQL服务停止。
- 找到MySQL安装文件的my.ini的配置文件
[client]port=3306[mysql]default‐character‐set=gbk
- 重启MySQL服务
(3)修改数据(update)
update 表名 set 字段1=值,字段2=值 where 条件;
-- 如果没有where条件语句,默认更新所有的数据。
-- 如果有where条件,默认更新符合条件的记录。
-- 将所有员工薪水修改为5000元。
update user set salary = 5000;
-- 将姓名为’聪聪’的员工薪水修改为3000元。
update user set salary = 3000 where username = '聪聪';
-- 将姓名为’小凤’的员工薪水修改为4000元,job改为ccc。
update user set salary = 4000,job = 'ccc' where username = '小凤';
-- 将如花的薪水在原有基础上增加1000元。
update user set salary = salary+1000 where username = '如花';
(4)删除数据(delete)
delete from 表名 where 条件; -- 如果没有where条件,默认删除所有的数据。
truncate 表名; -- 删除表中所有的数据。
delete from 表名; -- 也可以删除所有数据。
区别:
- truncate先把你整个表删除掉,默默创建一个空的表(和原来的表结构是一样的)。
- delete from 表名 一行一行的删除。(使用它)
(5)查询数据(select)
select * from 表名;
select 字段1,字段2,字段3 from 表名;
DISTINCT -- 去除重复的数据(面试常考)
(6)查询语句中使用运算和别名
-- 在所有学生分数上加10分特长分。
select name,(math+10) m,(english+10) e,(chinese+10) c from stu;
-- 统计每个学生的总分。
select name,(math+english+chinese) 总 分 from stu;
-- 使用别名表示学生分数
select name, (math + english + chinese + 10) as 总分 from stu;
(7)使用where条件过滤
-- 查询姓名为聪聪的学生成绩
select name,math,chinese from stu where name = '聪聪';
-- 查询英语成绩大于90分的同学
select name,english from stu where english > 20;
-- 查询总分大于200分的所有同学
select name,math+english+chinese from stu where (math+english+chinese) > 200;
--in 表示范围
select * from stu where math = 18;
select * from stu where math in (78,18,99);
--like 模糊查询 ‐‐ 符合模糊的条件
select * from stu where name like '张_';
select * from stu where name like '张%';
select * from stu where name like '%张';
select * from stu where name like '%张%';
--isnull ifnull nullif判断某一个字段记录是否为空
--and与 or或者 not非
- isnull、ifnull和nullif的区别
(8)order by 对查询的结果进行排序
select * from 表名 where 条件 order by 列名 升序/降序;
order by 列名 asc; -- 升序,默认值
order by 列名 desc; -- 降序
--order by 子句必须出现在select语句的末尾。
(9)聚集函数
-- 总计某一列数据总和。一列的个数。一列的平均数。
-- 一列中最大值和最小值。
count --计数
sum --求和
avg ‐‐ 平均值
max ‐‐ 最大值
min ‐‐ 最小值
-- ifnull 判断是否为空,如果xxx为null,替换成0
ifnul(xxx,0)
(10)分组 group by
-- 1.按照分数段分组
SELECT
CASE
WHEN (math + english + chinese + 10) >= 90 THEN '优'
WHEN (math + english + chinese + 10) >= 80 THEN '良'
WHEN (math + english + chinese + 10) >= 70 THEN '中'
ELSE '及格以下'
END AS 成绩等级,
COUNT(*) AS 学生人数
FROM stu
GROUP BY 成绩等级;
-- 2.对订单表中商品归类后,显示每一类商品的总价
select product,sum(price),count(*) from orders group by product; 默认是一组
-- 3.查询购买了几类商品,并且每类总价大于100的商品
select product from orders group by product having sum(price) > 100;
Having和where均可实现过滤,但在having可以使用聚集函数,where不能使用聚集函数,having通常跟在group by后,它作用于分组。