1.定义
问题1:什么是数据库?
是长期储存在计算机内的、有组织的、可共享的数据集合。
数据库中的数据按一定的数据模型组织、描述和储存。
而且存储的数据具有较小的冗余度、较高的数据独立性和易扩展性,
并可为各个用户共享。
简单来说数据库就是存储数据的仓库或者数据集合
但Mysql不是数据库,数据库也不是Mysql。)
问题2:什么是数据库管理系统?
数据库管理系统(DBMS),
是位于应用程序与存储数据的之间的一层数据管理软件。
是基础软件,是一个大型复杂的软件系统
管理数据的软件
问题3:常见的数据库管理系统有哪些?(管理数据)
数据库管理系统是软件 让我们去操作数据库
Mysql、Oracle、Sql server等…
问题4:什么是SQL?
SQL 是用于访问和处理数据库的标准的计算机语言
人通过sql语句来管理数据库,查询数据
问题5:什么是Mysql?
MySQL 是最流行的关系型数据库管理系统
关系型有表的结构
2.登录Mysql数据库
2.1 启动Mysql
(1)DOS->net start mysql
(2)开始->服务
(3)mysql的控制台(MySQL Command Line Client)
2.2 Dos窗口登录
mysql –u root –p密码
2.3 第三软件软件登录(Navicat)
相关概念:
localhost 指代本机电脑
127.0.0.1等价于localhost
3306固定的
mysql连接的端口号3306
外界访问要经过这个端口号
root 超级用户管理员(最高权限)
初始化界面:
再创建相同的连接,那么里面的数据库是一模一样,
同一个,只不过是改了名字,和新的连接,没有意义。
除非连接非本地的服务器 或创建了新的服务器 那就不一样
3.结构化查询语句SQL
问题6:结构化查询语句的种类有哪些?
| DDL(数据定义语言) | (很少)
Data Definition Language
定义和管理数据对象,如数据库,数据表等
CREATE、DROP、ALTER (关键字)
| DML(数据操作语言) | (第二用的多)
Data Manipulation Language
用于操作数据库对象中所包含的数据
INSERT、UPDATE、DELETE (关键字)
| DQL(数据查询语言) | (重点)
Data Query Language
用于查询数据库数据
SELECT(关键字)
| DCL(数据控制语言) | (几乎不用)
Data Control Language
用来管理数据库的语言,包括管理权限及数据更改
GRANT、COMMIT、ROLLBACK(关键字)
4.DDL实战(命名最好不要中文)
4.1数据库CRUD实战
4.1.1 Navicat之DDL实战
1.创建连接
2.创建数据库
3.查看数据库
4.使用数据库
5.删除数据库
注意点:
utf8_general_ci是一个遗留的校对规则,不支持扩展。
它仅能够在字符之间进行逐个比较。
这意味着utf8_general_ci校对规则进行的比较速度很快,
但是与使用utf8_unicode_ci的校对规则相比,比较正确性较差。
4.1.2 Dos窗口之DDL实战
1.创建数据库(先进入数据库 msql -uroot -pxx)
CREATE DATABASE 数据库名; (大小写通用)
【db datebase 最好要加 以便查看 db_123;(英文最好)】
右击连接–刷新
2.查看数据库
SHOW databases;
3.使用数据库
USE 数据库名;
【复制可以直接右击所要的,然后右击就能复制出来了。】
4.删除数据库
DROP DATABASE 数据库名;
4.2数据表CRUD实战
4.2.1 Navicat之DDL实战
1.创建表(命名 t_123)
tab 到下一行
2.查看表(打开表)
(关系型数据库类似表)
默认第一行是在id的下面。
3.删除表
4.修改表(设计表)
5.复制表
4.2.2 Dos窗口之DDL实战
4.2.2.1创建表
(1)先查询 show databases;
(2)然后使用 USE 数据库名;
(3)如下:
(可以看对象信息里的DDL)
CREATE TABLE [IF NOT EXISTS] 表名 (
字段1 数据类型 [字段属性|约束][索引][注释],
……
字段n 数据类型 [字段属性|约束][索引][注释]
)[表类型][表字符集][注释];
表名 可以加`` (1 旁边的)为了防止名称不规范或者类似表名
举例:
create table t_user(
id int(32) not null auto_increment,
name varchar(32)
primary key(id)
);ENGINE =InnoDB DEFAULT CHARSET = utf8;
IF NOT EXISTS如果不存在,就可以存在,如果存在,就不能创建。
IF NOT EXISTS 如果不写这个 在创建同一个 会报错 写了就不会写报错
也不会执行 创建这张相同的表 不会覆盖。
4.2.2.2查看表
查看表是否存在
USE 数据库名;
SHOW tables;
查看表定义
USE 数据库名;
DESC 表
;
顺序:
show databases; 展示连接中有哪些数据库
use xxx; 使用数据库
create table xxxx();创建表
show tables; 展示数据库中有那些表(可以不写)
desc xxxx; 展示表中的属性
4.2.2.3删除表
DROP TABLE [IF EXISTS] 表名;
USE 数据库;//desc 表名;
DROP TABLE IF EXISTS student
;
注意点:
当你看数据库中的某个表时,你必须先进去这个表。
注意点:
默认值 为varchar 255 int 11 习惯用偶数 中文要 偶数
4.2.2.4修改表
#修改表名
ALTER TABLE 旧表名 RENAME [TO] 新表名;
#添加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [属性];
举例:
alter table t_user add pwd varchar(32) not null;
#修改字段
ALTER TABLE 表名 CHANGE 原字段名 新字段名 数据类型 [属性];
举例:
alter table t_user change pwd pwd2 varchar(32);
alter table t_user change pwd pwd2 varchar(62);
#删除字段
ALTER TABLE 表名 DROP 字段名;
4.2.2.5复制表(先 desc 表名;)
查询表中的详细数据:select * from t_user0907_new;
复制表(结构加数据)(常见)
create table t_user3 (as) select * from t_user;
复制表的结构,不复制数据(常见)
create table t_user6 as select * from t_user where 1!=1;
复制表中某些属性作为新表的属性
create table t_user4 as select id,name from t_user;
4.3数据CRUD实战
4.3.1 Navicat之DML实战
1.添加数据
2.删除数据
3.修改数据
4.查询数据
4.3.2 Dos窗口之DML实战
4.3.2.1 增加数据
insert into db_jc3(name,pwd) values(‘ccc’,'122343 ');
(id 不用关心 自动添加)
增加多种数据:
INSERT INTO表名( 字段1,字段2,…) VALUES (值1, ‘值2’, …);
4.3.2.2 删除数据
delete from db_jc3 where id = 6;
4.3.2.3 修改数据
update db_jc3 set name=‘marong,zaima’,pwd=‘123’ where id = 5;
4.3.2.4 查询数据
查询所有
select * from 表名
题外话 desc 是查表结构
通过id查询一条记录
select * from db_jc3 where id = 4;
模糊查询name得到记录集
select * from db_jc3 where name like CONCAT(’%’,‘m’,’%’);
name 可以加个撇 ``区分 系统自带的属性关键字是为了防止跟关键字冲突
5.添加主外键
5.1 Navicat之主外键实战
主键:
让某一个列当中的值成为唯一的值。 唯一性
注意点:
每次要新建一个表
因为会根据之前最大的序号走下去。
比如是删除一个数据id4,那么再加会变成下一个id5。
就是为了知道你已经删除id=4了,【id4这个4会永远保存下来】。
id加主键一般加上自动递增 互存的
1 2 3 4 不写也会自动加
自动递增是int独有的。
外键:
外键 产生之间的相互联系
当你联系了,超出这个范围,就会报错。
注意点:roleID 要与t_role的id类型要一样
主从表
主表
在数据库中建立的表格即Table,
其中存在主键(primary key)用于与其它表相关联,
并且作为在主表中的唯一性标识。
从表
以主表的主键(primary key)值为外键 (Foreign Key)的表,
可以通过外键与主表进行关联查询。
从表与主表通过外键进行关联查询。
主表,从表 –》设计数据库
主从表设计好了
那先添加数据顺序:
1.添加数据顺序:先添加主表数据,再添加从表数据
2.删除数据顺序:先删除从表数据,再删除主表数据
6.1语法
6.1.1 语法顺序
SELECT *
FROM table_name
[ WHERE … ] #指定结果需满足的条件(用得最多)
[ GROUP BY …] #指定结果按照哪几个字段来分组
[HAVING …] #过滤分组的记录必须满足的次要条件
[ ORDER BY… ] #指定查询记录按一个或者多个条件排序
[ LIMIT ] #指定查询的记录从哪条至哪条(用得最多)
Limit 放在最后!
顺序不能改
6.1.2 实战案例
6.1.2.1 别名as (控制台变,实际还是不变)
select sex as ‘性别’ from student;
只是看着变了,实际得内容没变,所以叫别名。
6.1.2.2 查询空行is null
null 和 空字符串的关系 :
is null 不等于 空字符串
举例:
phone 为 null;
select * from student where phone is null; null 只能用 is
如果不是null 会报 Empty set。
phone 为 空;
select * from student where phone = “”;
6.1.2.3 order by排序
asc 或者不写 升序 desc 降序
举例:
select studentNo as ‘学生学号’,studentResult as ‘分数’
2from result order by studentResult desc;
6.1.2.4 limit分页 面试题
语法:
[LIMIT [位置偏移量,]行数];
m 制定第一个返回记录行的偏移量
n 制定返回记录行的最大数目
(m不指定则偏移量为0,从第一条开始返回前n条记录)
举例: RESULT表
SELECT * FROM result
LIMIT 5 #返回前5条记录
SELECT * FROM result
LIMIT 5,10 #返回6-15条记录
m,n
m代表从第几位开始 m 不包括
n代表读多少条数据
6.1.2.5 in关键字
注意点:
in里面只能是逗号,in里面可以加无数个数据
in里面相当于一个数组(在这个集合),in一般配合子查询使用
SELECT * FROM student where studentNo = 10000;
SELECT * FROM student WHERE studentNo IN (10000,10001,10002);
SELECT * FROM student WHERE studentNo = 10000 OR
studentNo = 10001 OR studentNo = 10002;
第三条 与 第二条 等价 意思是获取其中的某行值。
SELECT * FROM student;
SELECT 所有的字段逗号隔开FROM student;
(与*等价)
SELECT studentNo,loginPwd FROM student;
//获取部分字段(几条记录)
6.2常用函数
6.2.1 聚合函数
(聚合函数的返回值是单个值!!)
AVG() 返回某字段的平均值
SELECT AVG(studentResult) AS '学生平均值' from result;
SELECT sum(studentResult)/count(studentResult)
AS '学生平均值' from result;
两者等价
COUNT() 返回某字段的行数
SELECT count(1) FROM student;
SELECT count(studentNo) FROM student;
SELECT count(*) FROM student;//所有的都会来一遍
上面三者等价,效率由高到低。(查询表中的行数)
MAX() 返回某字段的最大值
SELECT MAX(studentResult) FROM result;
MIN() 返回某字段的最小值
SELECT MIN(studentResult) FROM result;
SUM() 返回某字段的和
6.2.2 字符串函数
CONCAT(str1,str1…strn) 字符串连接
from dual 系统表 不写也没事
SELECT CONCAT('hello','worl','d') FROM DUAL;
===》helloworld
INSERT(str,pos,len,newstr) 字符串替换 (数 1开始)
从3开始(包括3) 一共有10长度 (从3开始 啊)
SELECT INSERT('这是SQL Server数据库',3,10,'MySQL');
===》这是MySQL数据库
中文两个字节一个字符 但这边是整体 只算一个
LOWER(str) 将字符串转为小写
SELECT LOWER('MySQL');==》 mysql
UPPER(str) 将字符串转为大写
SELECT UPPER('MySQL');==》MYSQL
SUBSTRING(str,num,len) 字符串截取
SELECT SUBSTR('JavaMySQLOracle',5,5);;==》MySQL
6.2.3 时间日期函数
WEEK(date)
返回日期date为一年中的第几周 SELECT WEEK(NOW());
年月日 时分秒
NOW()
获取当前日期和时间 SELECT NOW();
CURDATE()
获取当前日期 SELECT CURDATE();
CURTIME()
获取当前时间 SELECT CURTIME();
SELECT CURDATE();
年月日
YEAR(date)
返回日期date的年份 SELECT YEAR(NOW());
MONTH(date)
返回当前日期date的月 SELECT MONTH(NOW());
DAY(date)
返回当前日期date的日 SELECT DAY(NOW());
SELECT CURTIME();
时分秒
HOUR(time)
返回时间time的小时值 SELECT HOUR(NOW());
MINUTE(time)
返回时间time的分钟值 SELECT MINUTE(NOW());
SECOND(time)
返回时间time的秒值 SELECT SECOND(NOW());
6.2.4 数学函数
CEIL(x) 返回大于或等于数值x的最小整数 cell 意思 天花板
SELECT CEIL(2.3)
返回:3
:> 2.0 的结果都是3
FLOOR(x) 返回小于或等于数值x的最大整数 float 意思 地板
SELECT FLOOR(2.3)
返回:2
:< 3.0 的结果都是2
ROUND(x) 这才是四舍五入
SELECT ROUND(2.5);
返回:3
:> 2.4 的结果都是3
小科技
两个有关联的 用外键连接
连点两个然后右击 逆向表到模型
6.3 多表关联查询
t_role表
t_user表
6.3.1内连接inner join
SELECT *
FROM t_user as s
INNER JOIN t_role AS r
ON s.roleID = r.id;
*也可以改成s.id,s.name,r.roleName
6.3.2左(外)连接left join(常见)
左外连接:
左为主表,右为码表
交集 和 主表独有的部分,
只是这样理解,他们不是主副表关系。
SELECT *
FROM t_user as s //主表
left JOIN t_role as //r码表
ON s.roleID = r.id;
6.3.3右(外)连接right join(不常用)
左外连接:
左边是码表,右边是主表
SELECT *
FROM t_role as r
RIGHT JOIN t_user as s
ON s.roleID = r.id;
as 的话 别名 只是表别名 得不出值
得出具体的值别名 就能显示出来
6.3.4自连接(很重要)
自连接 应用场景
如 网站京东开头 一个一个里面父子孙连接
category_1
category_2
category表
这个就是自连接的表,已经把两张表连在一起了。
需求:
把category表看做两张一模一样的表,
然后将这两张表连接查询(自连接)
如何拆分上述category表
SELECT a.categoryName AS '父类名称',
b.categoryName AS '子类名称'
FROM category as a,category as b
WHERE a.categoryid = b.pid;
7. DQL高级
7.1 子查询
子查询就是整成一句话
遇到问题要学会从外往里 先搞最外层 可以拆分
7.2 分组group by
分组一般要配合聚合函数一起用
多次group by 用逗号隔开 不用再写 group by
同理 order by也是一样
7.3 HAVING……
作用: 是筛选满足条件的组
注意点:
- having 一般和 group by一起使用,having在后面。
- where子句中不能使用聚合函数,而having子句中可以。
题外话:
查询名字的类型:
查询姓名姓某的人where name like ‘某%’
查询名字中带有“某”的人where name like ‘%某%’
查询名字中第二个字是"某"的人where name like ‘_某%’
UNION 指令
它的目的是将两个 SQL 语句的结果合并起来。
as 别名 可以省略
数值类型 不要单引号 字符串用单引号
distinct 不重复
SELECT DISTINCT Depart FROM teacher;
范围 可以写 between and
中文乱码解决:
SET NAMES gbk; 中文乱码 临时解决
my.ini => default-character-set = utf8
=>character-set-server = utf8中文乱码长期解决
;代表结束
多条语句同时执行 可以加分号
一条一条执行 那就只需要在几条语句里最后加分号
(clear清空)
刷新:
空白处的刷新 数据的刷新
表格刷新 是结构
注释:# 注释 crtl + /注释
如果navicat里的类型是double类型,
那么设置长度,就必须要设置小数点。
----2021.09.(04&07&08&09&11)