数据库

it2022-05-05  182

数据库分为关系型数据库和非关系型数据库

关系型数据库

是以二维表的形式存储常见数据库:

sql sever 收费 中大型数据库 Oracle 收费 甲骨文 超大型公司适用 DB2 收费 IBM(银行/电信) mysql 免费 瑞典mysql AB 学习 sqlite 迷你数据库 嵌入式设备中 电视机顶盒 设置mysql的字体:mysql --default-character-set=gbk -uroot -proot

名词介绍

数据库服务器:数据库服务器其实就是一个软件,比如我们安装的mysql软件(或者mariadb软件)mysql服务器软件需要安装在服务器硬件上(就是一台计算机)才可以让外界来访问

数据库:在mysql服务器中,可以创建很多的数据库(database) 通常情况下,一个web站点对应一个数据库

数据表:在数据库(database)中,可以创建很多张表(table)通常情况下,一张表用于保存一类数据,例如网站中的所有用户信息会保存在一张表中,所有商品信息会保 存在另一张表中。

表记录:数据表(table)中,可以插入很多条表记录 数据表往往保存一类数据,对应java中的一个类。一条表记录往往对应java中的一个具体的实例。

MySql建库建表

查看数据库、查看数据表

1、查看mysql服务器中所有数据库

show databases;

2、进入数据库

use test;

3、查看当前库中的所有表

show tables;

提示: mysql数据库不区分大小写

创建数据库、创建数据表

1、创建数据库

–删除mydb1库(如果存在) drop database if exists mydb1; ‐‐ 重新创建mydb1库 create database mydb1 charset utf8;

2.查看、进入mydb1库

show databases; use mydb1;

3、创建数据表

‐‐ 删除stu学生表(如果存在) drop table if exists stu;

--创建stu学生表 create table stu( id int, ‐‐ 学生编号 name varchar(20), ‐‐ 学生姓名 gender char(1), ‐‐ 学生性别 birthday date, ‐‐ 出生年月 score double ‐‐ 考试成绩 );

‐‐ 查看表结构 desc stu;

char、varchar、text都可以表示字符串类型,其区别在于: (1)char在保存数 据时, 如果存入的字符串长度小于指定的长度n,后面会用空格补全。 (2)varchar和text保存数据时, 按数据的真实长度存储, 剩余的空间可以留给别的数据用. (3)char会造成空间浪费(不足指定长度的会用空格补全), 但是由于不需要计算数据的长度, 因此速度更 快。(即以空间换时间) (4)varchar和text是节省了空间,但是存储的速度不如char快,因为要计算数据的实际长度。(即以时间 换空间)

日期类型

date:年月日time:时分秒datetime:年月日 时分秒timestamp:时间戳(实际存储的是一个时间毫秒值),与datetime存储日期格式相同。 timestamp大表示2038年,而datetime范围是1000~9999 timestamp在插入数、修改数据时,可以自动更新成系统当前时间

字段约束

– primary key(主键约束):表示当前列的值不能为空且不能重复 – unique(唯一约束):表示当前列的值不能重复 – not null(非空约束):表示当前列的值不能为空 –auto_increment(自动增加):一般设为主键自动增加添加数据时候可以写null

SQL语句

1 什么是SQL语言?

Structured Query Language:结构化的查询语言 SQL是操作所有关系型数据库的通用的语言 SQL语言的分类: DDL ‐‐ 数据库定义语言,指CREATE、ALTER、DROP等操作( 即创建、删除、修改数据库和数据表 ) DML ‐‐数据操作语言,指INSERT、UPDATE、DROP等操作( 即数据表中数据的增、删、改操作 ) DQL ‐‐数据查询语言(指SELECT操作,即数据表中数据的查询操作)

更新表记录(insert/update/delete)

insert‐‐插入表记录

插入记录的语法: insert into 表名(列1,列2…) values(值1, 值2…); ‐‐insert用于向指定的表中插入哪些列, 以及给予哪些值 如果要为所有的列插入值, 可以省略表名后面的列列表,例如: insert into 表名 values(值1, 值2…);

注意: (1)只能在给所有列插入值时, 才可以省略列列表, 否则会报错 (2)在插入值时, 如果没有省略列列表, 那么列列表和值列表要一一对应 (3)在插入值时, 如果省略了列列表, 那么值列表中值的顺序要和声明列的顺序一致 (4)在插入字符串和日期时, 字符串和日期要用单引号引起来。 因此,在通过CMD访问数据库时,好一登录就设置 “set names gbk”,即可避免在插入数据时或者查询 数据时数据乱码

update‐‐修改表记录

update 表名 set 需要修改的列 update stu set score=score+10

delete‐‐删除表记录

delete from 表名 where 需要操作的列 delete from stu where name='王海涛';

书写规范

SQL语句的书写顺序: select… from… where… group by… order by… SQL语句的执行顺序: from… – 确定要查询的是哪张表 (定义表别名) where… – 从整张表的数据中进行筛选过滤 select… – 确定要显示哪些列 (定义列别名) group by… – 根据指定的列进行分组 order by… – 根据指定的列进行排序

like模糊查询

查询emp表中姓名中以"刘"开头的员工,显示员工姓名。

select name from emp where name like '刘%';

%和_都是通配符,表示任意的字符 但是 % 表示任意0~多个字符 _ 表示一个任意的字符

排序查询

对查询的结果进行排序使用 order by关键字。

order by 排序的列 asc 升序 ↑(默认可以不写) order by 排序的列 desc 降序 ↓

分组查询

对所查询的记录可以根据某一列进行分组, 分组使用group by。 ‐‐ 将员工按照部门进行分组

select * from emp group by dept;

聚合函数查询

max()或min() ‐‐ 返回某列的大值或小值 count() ‐‐ 返回某列的行数 sum() ‐‐ 返回某列值之和 avg() ‐‐ 返回某列的平均值 ceil(数值) ‐‐ 向上取整 floor(数值) ‐‐ 向下取整 round(数值) ‐‐ 向下取整 rand(数值) ‐‐ 随机数

a) 可以使用count(*)统计记录行数 b) 多个聚合函数可以一起查询

‐‐ 例如:根据部门进行分组,统计每个部门员工人数和平均薪资 select dept, count(*) 员工人数, avg(sal) 平均薪资 from emp group by dept;

c) 聚合函数不能用在where子句中 d) 在没有分组的情况下,聚合函数不能和其他普通字段一起查询

外键和表关系

外键:唯一标识其他表中的一条记录,用来通知数据库两张表列与列之间的对应关系, 并让数据库帮我们维 护这样关系的键就叫做外键。 外键作用: 确保数据库数据的完整性和一致性

添加外键: 例如:foreign key(dept_id) references dept(id)

备份数据库

打开cmd命令:

输入 mysqldump -uroot -p 库的名字 > 保存在哪里 mysqldump -uroot -p db10 > d:/db10.sql 读取数据 mysql -uroot -p db10 < d:/db10.sql

分页查询

在mysql中,通过limit进行分页查询: limit (页码-1)*每页显示记录数, 每页显示记录数 38.查询emp表中的所有记录,分页显示:每页显示5条记录,返回第 1 页。

select * from emp limit 0, 5; select * from emp limit 5, 5; select * from emp limit 10, 5; select * from emp limit 15, 5;

关联查询、外连接

笛卡尔积查询

select * from emp,dept;

内连接:和笛卡及一样只是用法不一样

select * from dept inner join emp on dept_id = dept.id;

左外连接:是在内连接查询的基础上, 加上左边表有但是右边表没有(显示为null)的记录

select * from dept left join emp on dept_id = dept.id;

右外连接:是在内连接查询的基础上, 加上右边表有但是左边表没有(显示为null)的记录

select * from emp right join dept on dept_id = dept.id;

– where是在分组之前进行过滤, 在where子句中, 不可以使用列别名和聚合函数 – having是在分组之后进行过滤, 在having子句中, 可以使用列别名和聚合函数


最新回复(0)