知识点
数据:信息、记录、阅读
数据库:数据的仓库,存储数据
按照结构来组织、存放、管理数据的,建立在计算机上面。
DBMS:
数据库管理系统
Oracle Sqlserver db2 MySQL
mysql简介
关系型数据库管理系统
1996 1.0版本
1999~2000年 瑞典 MySQL AB公司
2008 sun 10亿
2009 Oracle 74亿
属于Oracle
知识改变命运
mysql特点
1、开源、免费 (github)
2、体积小、简单易学
3、性能好、服务稳定、安全性高
4、支持友好
解压注意点
路径不能有中文、空格、特殊字符
bin目录:
服务端:mysqld.exe
客户端:mysql.exe
四个参数:
账号:root
密码:默认为空
端口:3306
IP:127.0.0.1/localhost
命令:
启动:mysqld
链接:mysql -u root -p
显示数据库:show databases;
使用某个数据库:use[数据库名]
显示表:show tables;
退出链接:exit/quit
停止服务端:mysqladmin -u root shutdown
设置新密码:
use mysql;
update user set password=password("root") where user ="root";
mysql图形化工具
mysqlweb\phpadmin\navicat...
Navicat:
简单
功能强大
库、表、字段 概念见图
命名规范:
1、匈牙利命名法
小写字母,下划线链接,见名知意
2、驼峰命名法
3、数据库:db_数据库名
4、表:tb_表名
创建一个库:
数据库:db_star
表名:tb_star_info
编号:s_id
姓名:s_name
性别:s_sex
年龄:s_age
身份证号码:s_card_id
录入时间:s_entry_time
utf8 or utf8mb4(针对移动端)
在mysql5.5.3之后添加的, utf8mb4是utf8的超集
数据类型:
数字类型:int
字类型:
char(10):定长
varchar(10):变长
日期类型:
data 2018-09-27
time 22:45:40
datatime 2018-09-27 22:45:40
作业:
1、命令抄写直到闭着眼写出来
2、环境配好
3、明星表补充好,添加10条数据
注意命名规范
添加后navicat拍照上传SVN
命令要手写拍照!
作业命名规范:学号+姓名
知识点:
乱码问题:数据库默认的编码格式:latin1
设置:utf-8/utf-8mb4
乱码问题
数据库默认的编码格式:latin1
设置:utf8/utf8mb4
服务式启动mysql
my.ini
[mysqld]
character-set-server = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysql.server]
default-character-set = utf8mb4
[mysqld_safe]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
查看编码
show variables like "%character%";
character_set_client为客户端编码方式;
character_set_connection为建立连接使用的编码;
character_set_database数据库的编码;
character_set_results结果集的编码;
character_set_server数据库服务器的编码;
只要保证以上四个采用的编码方式一样,就不会出现乱码问题。
配环境变量
[没有data文件夹的]初始化mysql
mysqld --initialize-insecure --user=mysql
安装服务
mysqld --install mysql
启动服务
net start mysql
关闭服务
net stop mysql
移除服务
mysqld --remove mysql
服务式启动
查看编码(cmd)
show variable like %character%;
初始化mysql(没有data文件夹的情况下):
mysqld –initialize-insecure
安装服务:
mysql –-install mysql
启动:
net start mysql
关闭服务:
net stop mysql
还可以移除服务:
mysqld –-remove
通常第一次安装需要服务启动设置 以上两个常用用于解决乱码
2、什么是约束
规则
什么是数据约束
对数据进行约束限制(定义)规则
数据类型:简单的数据约束
目的:
为了保证数据的完整性符合逻辑、正确();
数据完整性:
域完整性:表中字段满足特定的数据类型或者约束。
实体完整性:主键标识一个实体
引用完整性:表与表之间的规则
自定义完整性(用户自己定义的规则):
对表中字段属性的约束。
数据类型:
int 11个长度 第一位为正负
char 定长(10) 不足10位,空格补齐
varchar 变长(10)最大10位
约束分类:
非空约束(not null):不能为空,必须有值
唯一约束(unique):不能重复
主键约束(primary):非空+唯一组合(一张表只有一个主键)
默认值(default):
自增长(auto-increase): 用在int型+主键
SQL语言
(Structured Query Language ) 结构化查询语言
作用:处理数据库的计算机语言,建库、建表、约束等增删改查操作。
遵循ANSI标准
SQL语言分类:
DML:数据处理语言(增删改数据)insert into delete update
DQL:数据查询语言(查询数据)select
DDL:数据定义语言(创建库、表、约束。。)
1、DML
单行注释(--)
多行注释(/*语句*/)
单行运行需要选中单行运行
--增加数据
INSERT INTO tb_star_info VALUE(10,’张学友’,’男’,52,’51162117540021’,’2018-10-9’);
右键运行已选择的实现插入数据。
--修改数据
UPDATE tb_star_info SET s_age=53,s_card_id=’511621486’ WHERE s_id=10;
--删除
DELETE FROM tb_star_info WHERE s_id=5;--常通过主键来删除。删除切记带条件
其他删除功能:效果顺序
drop>trancate>delete
总结:乱码问题
约束定义、作用
完整性:域完整性、实体完整性、引用完整性、自定义完整性
约束的分类:默认、非空、主键、自增
SQL概念
SQL语言分类:DML、DQL、DDL
语句要么全大写要么全小写,关键字建议大写
DML增加insert into表名value(值);值和字段对应
修改:update 表名 set 字段1=值1,字段2=值2.。。【where 条件】
删除:delete from 表【where 条件】
作业:
建电影表
用SQL语句并抄写
插入5条数据
并使用修改、删除
lesson 3
回顾
DML:数据处理语言
增加:INSERT INTO 表 VALUES(值1,值2,。。。);
删:DELETE FROM 表 【WHERE 条件】;
改:UPDATE 表 SET 字段1=值1,字段2=值2,。。。【WHERE 条件】;
DQL:数据查询语句
DDL:数据定义语言
新知识点
指定字段
INSERT INTO tb_star_info(s_name,s_age,s_card_id,s_sex) VALUES(‘唐嫣’,23,‘12546483’,‘女’);
注意:字段顺序可以变换,但是形参和实参必须一对一;
2、批量插入
INSERT INTO tb_star_info(s_name,s_age,s_card_id,s_sex) VALUES(值1,值2,…),( 值1,值2,…),( 值1,值2,…),( 值1,值2,…);
3、全表删除
1)DELETE FROM 表【WHERE 条件】当不加条件就全表删除,一条一条删除
2) truncate表 关键字也是清空表。一次清空
3)drop关键字将整个表删除
4)效率drop>truncate>delete
5)delete删除后自增将不是从1开始
6)truncate删除后自增从1开始
4、设置当前时间:默认值 CURRENT_TIMESTAMP,字段类型需要datetime或者timestamp;
5、查询
5.1 查询全表数据
select * from 表名;
注:*代表通配符。
5.2 指定字段查询
SELECT f_name FROM tb_film_info;
5.3精确查询
SELECT * FROM tb_film_info WHERE f_type=’科幻片’;
5.3.2 条件精确查询
SELECT f_name, f_score FROM tb_ film_info WHERE f_score>80;
格式:SELECTE 字段1,字段2,。。。FROM 表名 WHERE 条件;
6、关系运算符:=
!=
>
<
>=
<=
7、多条件查询:AND\OR
SELECT * FROM tb_ film_info WHERE (f_type=’爱情片’ OR f_type=’动作片’) AND f_score>90;
注意:优先级AND>OR,可以采用括号改变优先级。
8、NOT IN条件查询(不包含于)
SELECT * FROM tb_ film_info WHERE f_type NOT IN (‘爱情片’,‘动作片’);
9、IN查询
SELECT * FROM tb_ film_info WHERE f_type IN (‘爱情片’,‘动作片’);等价于OR
10、IS NULL为空 和 IS NOT NULL 不为空
SELECT * FROM tb_ film_info WHERE f_type IS NULL;
SELECT * FROM tb_ film_info WHERE f_type IS NOT NULL;
11 BETWEEN关键字
评分50-90
SELECT * FROM tb_ film_info WHERE f_score BETWEEN 50 AND 90;
评分<50或者>90;
SELECT * FROM tb_ film_info WHERE f_score NOT BETWEEN 50 AND 90;
范围查询:IN—包含 相当于OR;
NOT IN -不包含于 相当于多个AND;
BETWEEN 值1 AND 值2;
NOT BETWEEN
12、模糊查询:
like +’%A%’
like +’A&’
like+’%A’
like+’A%B’
模糊定位:-
方式1中间含有某个关键字:
SELECT * FROM tb_ film_info WHERE f_name LIKE ‘%神%’;
方式2以某个关键字结尾:…神
SELECT * FROM tb_ film_info WHERE f_name LIKE ‘%神’;
方式3以某个关键字开头:神…
SELECT * FROM tb_ film_info WHERE f_name LIKE ‘神%’;
方式3 多个关键字查询 神…局
SELECT * FROM tb_ film_info WHERE f_name LIKE ‘神%局’;
(模糊定位)方式4 下划线代表一个字符
SELECT * FROM tb_ film_info WHERE f_name LIKE ‘神_特工局’;
作业例题:
-- 查询类型不是恐怖片的电影
SELECT * FROM tb_film_info WHERE f_type !='恐怖片';
-- 查询分数大于50分,小于等于90的电影用 and
SELECT * FROM tb_film_info WHERE f_score>50 AND f_score<90;
-- 查询分数大于50分,小于等于90的电影用 BETWEEN
SELECT * FROM tb_film_info WHERE f_score BETWEEN 50 AND 90;
-- 查询分数小于50分或者大于90的电影用 OR
SELECT * FROM tb_film_info WHERE f_score<50 OR f_score>90;
-- 查询分数小于50分或者大于90的电影用 BETWEEN
SELECT * FROM tb_film_info WHERE f_score NOT BETWEEN 50 AND 90;
-- 查询电影类别为空的电影信息
SELECT * FROM tb_film_info WHERE f_type IS NULL;
-- 查询电影类别不为空的电影信息
SELECT * FROM tb_film_info WHERE f_type IS NOT NULL;
-- 查询中国 或者美国的电影
SELECT * FROM tb_film_info WHERE f_origin='中国' OR f_origin='美国';、
-- 查询动作片 或者 科幻片
SELECT * FROM tb_film_info WHERE f_type='动作片' OR f_type='科幻片';
-- 查询 美国的电影,并且是科幻片
SELECT * FROM tb_film_info WHERE f_origin='美国' AND f_type='科幻片';
-- 查询 科幻片 并且是 美国的,并且评分大于80 的电影信息
SELECT * FROM tb_film_info WHERE f_origin='美国' AND f_type='科幻片' AND f_score>80;
-- 查询不是印度片,但是分数要大于等于75分,并且年份是最近两年(2017-2018年)电影信息
SELECT * FROM tb_film_info WHERE f_score>=75 AND f_origin !='印度' AND f_play_year BETWEEN 2017 AND 2018;
-- 查询美国的电影 并且 是科幻片 或者评分大于80 电影信息
SELECT * FROM tb_film_info WHERE f_origin='美国' AND (f_type='科幻片' OR f_score>80);
-- 查询动作片和科幻片,并且要评分大于50分的电影信息(只需要显示电影的名称、类别、评分)
SELECT f_name, f_type,f_score FROM tb_film_info WHERE (f_type='动作片' OR f_type='科幻片' ) AND f_score>50;
-- 查询日本的爱情、动作片,并且评分大于80分的电影信息 (只需要显示电影名称,和电影类别,电影产地)
SELECT f_name,f_type,f_origin FROM tb_film_info WHERE f_origin='日本' AND (f_type='爱情片' OR f_type='动作片') AND f_score>80;
-- 查询 科幻片 动作片 爱情片的电影信息(只需要显示电影名称,和电影类别)用两种方式-- in
SELECT f_name,f_type FROM tb_film_info WHERE f_type IN('科幻片','动作片','爱情片');
SELECT f_name,f_type FROM tb_film_info WHERE f_type='科幻片' OR f_type='动作片' OR f_type='爱情片';
-- 查询电影类别不是恐怖片,剧情片的电影信息(用两种方式)
SELECT * FROM tb_film_info WHERE f_type !='恐怖片' AND f_type !='剧情片';
SELECT * FROM tb_film_info WHERE f_type NOT IN('恐怖片','剧情片');
-- 查询出所有带神字的电影
SELECT * FROM tb_film_info WHERE f_name LIKE'%神%';
-- 查询最后一个字为神的电影
SELECT * FROM tb_film_info WHERE f_name LIKE '%神';
-- 查询第一个字为神的电影
SELECT * FROM tb_film_info WHERE f_name LIKE '神%';
-- 查询开头尾我,结尾为神的电影
SELECT * FROM tb_film_info WHERE f_name LIKE '我%' AND f_name LIKE '%神';
-- 查询电影名字中包含神的电影,并且他的类型为科幻片,并且是评分>=70
SELECT * FROM tb_film_info WHERE f_name LIKE '%神%' AND f_type='科幻片' AND f_score>=70;
lesson 4
知识点:
1、 模糊定位_
_:表示任意单个字符
like ‘_a’
like ‘a_’
like ‘_ _’
如要查找四个字的电影:SELECT * FROM tb_film WHERE f_name LIKE ‘_ _ _ _’;
2、分组查询
关键词:group by 关键字
select s_class from tb_stu_info group by s_class;
分组查询结果只显示每个组的第一条数据。
3、聚合函数
count() //count(*)统计有多少条数据
max()
min()
sum()
avg()
别名: AS 别名
例:
select s_subject,count(*) from tb_stu_info group by s_subject;
select s_subject as ‘科目’,count(*) as ‘参加人数’ from tb_stu_info group by s_subject;
SELECT MAX(s_score) FROM tb_stu_info;
SELECT MIN(s_score) FROM tb_stu_info;
SELECT SUM(s_score) FROM tb_stu_info WHERE s_name=’蒋建兵’;
SELECT AVG(s_score) AS ‘平均分’ FROM tb_stu_info WHERE s_name=’黄镇东’;
SELECT s_class, SUM(s_score) FROM tb_stu_info GROUP BY s_class;
SELECT s_class, AVG(s_score) FROM tb_stu_info GROUP BY s_class;
SELECT s_subject, MAX(s_score) FROM tb_stu_info GROUP BY s_subject;
SELECT s_subject, MIN(s_score) FROM tb_stu_info GROUP BY s_ subject;
查询每个学生的总分和平均分
SELECT s_name,SUM(s_score),AVG(s_score) FROM tb_stu_info GROUP BY s_ name;
排序查询,order by 字段 [asc\desc],字段2[asc\desc] //如果字段1相等时按照字段2排序
asc:升序
dsc:降序
默认:asc
查询出6班成绩大于70并且按照从高到低
SELECT s_name, s_score FROM tb_stu_info WHERE s_class=’6班’ AND s_score>70 ORDER BY s_score DESC;
GROUP BY s_student_id HAVING s_score>70 ODER BY s_score ASC;
其中HAVING表示分组后的条件
而 where是原始数据条件。
group by x;将所有具有相同X字段值得记录放在一个分组里
group by x,y;将所有具有相同X字段和Y字段的记录放在一个分组
DISTINCT:去除重复关键字,如COUNT(DISTINCT s_student_id)
lesson5
知识点:
数据约束
自增
主键
非空
唯一
外键约束
2、外键:指另一张表的主键
作用:多张表建立连接,保证数据一致性、完整性
restrict与no action表示删除时检查是否有外键,如果有则不允许删除。
cascade级联删除,表示删除主键信息时,外键信息同时都删除
set null :主键删除记录时,把外键字段设置为null
3、连接查询
1)内连接 INNER JOIN ON 查询两张表有对应关系的数据
-- 两个表ID相同连接
SELECT * FROM student_info AS st INNER JOIN score_info AS sc ON st.s_id=sc.s_id;
-- 查总成绩,按照降序
SELECT s_name,SUM(s_score) sum FROM score_info sc INNER JOIN student_info st ON sc.s_id=sc.s_id GROUP BY st.name ORDER BY sum DESC;
2)外连接查询
左连接
LEFT JOIN ON 以左边的表为基准展示,右边的没有数据的显示为空
右连接
RIGHT JOIN ON 以右边的表为基准展示,左边的的数据没有的显示为空
4、分页查询
SELECT * FROM 表名 LIMIT n,m;
其中n:代表从第几条数据开始
m:代表显示多少条数据。
写法二:LIMIT n;
相当于LIMIT 0,n;
分页逻辑:LIMIT(当前页-1)*每页显示条数,每页显示条数;
5、合并查询:
union 去重查询
union all 不去重查询
lesson6
1、子查询
当一个结果是另一个查询的条件时,称之
子查询的时候要记得写上别名,不然容易混淆表字段
2、嵌套查询
当一个查询的结果的表当做另一个查询的原表
3、
字符串函数
char_length(str):返回字符串(str)字数 字符数
length(str):获取存储的长度【utf-8字符占3个字节】。字节数
用法select +函数
4、拼接字符串
concat(str,str2,…);拼接字符串
5、替换函数
replace(str1,str2,str3);
str1:需要替换的字符串 目标字符串
str2:需要替换的字符 被替换的字符
str3:替换成什么字符 用于替换的字符
update 表 set f_name=concat(‘《’,f_name,’》’);
substring(str,index);截取函数;
substring(str,index,length);
str:截取的字符串
index:开始的位置
length:截取的长度
ltrim()去掉左边空格
rtrim()去掉右边空格
lower()转换小写
upper()转大写
6、数字函数
ABS(x)绝对值
ceil(x):返回大于X的最大整数
floor(x):返回小于x 的最大整数
round(x):四舍五入
rand():返回[0,1)的随机数,不包括1
7、日期函数
获取当前系统日期:now():
获取当前日期:curdate()
获取当前时间:curtime();
选取当前日期:date(now());
选取当前时间:time(now());
选取当前时间的年月日:
year(now());
month(now());
day(now);
date_format(date,’%Y-%m-%d %H:%i:%s’);
8、时间比较函数
TIMESTAMPDIFF(str,date1,date2)
str1:比较的类型:年、月、日 可以按照年、月或者日来比较
值=date2-date1
lesson 7
DDL数据定义语言
1、 创建数据库:
CREATE DATABASE 库名
创建库设置编码
ALTER DATABASE aaa CHARACTER SET utf8mb4
-- 建库设置编码
CREATE DATABASE IF NOT EXISTS 库名 CHARACTER SET utf8mb4;
-- 删除数据库
DROP DATABASE IF EXISTS 库名;
注意:在创建或者删除数据库的时候加上判断 IF EXISTS/ NOT EXISTS
建库总结:
新建:create if not exists
修改:alter
删除:drop if exists
注意:drop谨慎
2、建表
create table表名(字段1 数据类型,字段2 数据类型)
步骤:
use 库名;
create table if not exists 表名(s_id int, s_name varchar(50), s_sex char(1), s_card char(18));内部括号内指定长度
3、查看创建的表
DESC 表名;
4、修改已经创建的表名
ALTER TABLE student_info RENAME tb_student_info;
5、修改已经创建的字段数据类型
alter table 表 modify 字段 新类型 例如 float(总长度,小数点后位数)
6、添加新字段
alter table 表 add(新字段1 数据类型,新字段2 数据类型);
7、修改字段名
alter table 表 change 字段名 新字段名 新数据类型;
8、删除列
alter table 表 drop 字段列
9、删除表
drop if exists 要删除的表
10、查看表结构
desc 表名;
修改:
修改表名
alter table表名 rename 新的表名;
修改列名:
alter table表名 change 原列名 新列名 新数据类型或者原数据类型
修改字段数据类型:
alter table表名 modify 列 数据类型;
添加字段:
alter table表名 add(字段1 数据类型,字段2 数据类型);
删除字段:
alter table表名 drop 字段名;
删除表:
drop table if exists表名
删除列: alter table 表 drop 列
11、数据约束:
非空:
添加 alter table表名 modify 列 数据类型 not null;
删除 alter table表名 modify 列 数据类型 null;
默认:
添加 alter table表名 alter 列 set default ‘值’;
删除 alter table表名 alter 列 drop default;
唯一:
添加 alter table表名 add unique 约束名(对应字段);
删除 alter table表名 drop key 约束名;
主键:
添加 alter table表名 add primary key(对应字段);
删除 alter table表名 drop primary key;
自增长:
添加 alter table表名 modify 列名 int auto_increments;
添加 alter table表名 modify 列名 int;
外键:
添加 alter table 外键表 add constraint 约束名 foreign key(外键列) references 主键表(主键列) on delete set null
on update set null
删除 :
第一步:删除外键
alter table 外键表 drop foreign key 约束名;
第二步:删除索引名
alter table 外键表 drop index 索引名;
注意:在mysql中 唯一约束=唯一索引
lesson 8
DCL 数据库控制语言
1、创建用户
create user 用户名@IP地址 IDENTFIED BY ‘密码’;
2、给用户授权
GRANT ALL ON db_star.* TO 创建好的用户@IP地址
3、撤销授权
revoke 权限2,权限2 ON 数据库.* from 用户名@IP地址;
4、查看权限
show grant for 用户名@IP地址
5、删除用户
DROP USER 用户名@IP地址;
JDBC:java连接数据库
1、连接数据库
通过JDBC连接数据库步骤
1)导包(驱动)
2)加载驱动 Class.forName(“com,mysql,jdbc.Driver”);
Class.forName() 含义:加载参数指定的类,并且初始化它.
3)参数
数据库地址:jdbc:mysql://127.0.0.1【localhost】:3306/数据库名
用户名:root
密码:root
4) Connection con=DriverManager.getConnection(数据库地址,用户名,密码 );
第一个异常可能没导包,
第二个异常可能链接异常
1、确认mysql是否启动
2、url\账户\密码参数是否正确
3、URL:数据库、IP地址、端口号是否正确
JDBC原理:
公用接口 协议标准
各个数据库厂商遵循这个规范 实现这个接口 JDBC驱动
lesson9
JDBC增删改
1、创建发送器
通过Conection对象创建Statement发送器
2、通过Statement的一个方法,executeUpdate(String sql)
3、返回受影响行数,int类型
注意:SQL后面不需要额外加分号,程序自动加,只能写一条,不可以多写几条语句。
查询
1、创建发送器
2、通过Statement的executeQuery(String sql)
3、返回结果集Resultset
解析ResultSet提供了getXxx()方法
关闭资源
倒着关闭
JDBC操作数据库步骤:
1、 导jar包
2、注册驱动
3、创建发送器
4、发送sql 语句(执行)
5、处理执行结果
6、释放资源
Statement类
int executeUpadate(String sql)
ResultSet executeQuery(String sql);
lesson10
知识点
float(a,b)
double(a,b)
decimal(a,b)精确
bigint 大数据
视图:
数据库中虚拟的表,内容由查询定义
语法:select * from 视图名
JDBC
获取结果集(列)
ResultSet:getMetaData();
得到元数据集ResultSetMetaData 对象
返回列数 getcolumn()获得列数
防SQL注入
PreparedStatement Statement接口的子接口,更加强大