数据库概述及MySQL—CRUD基础入门

版权声明:非经本人允许,禁止转载 https://blog.csdn.net/Kfie66/article/details/82025673

 

一,数据库概述

1.什么是数据库?

  • 数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合.

  • 文件系统, 数据的仓库

2.数据库管理系统?

  • 数据库管理系统(DataBase Management System,DBMS):指一种管理和操作数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。

  • 数据库 = 数据的集合+数据库软件

    注意:通常情况下,经常会用数据库来表示他们使用的数据库软件,这经常会引起混淆,确切的说,数据库软件应该为数据库管理系统,数据库是通过数据库管理系统创建和操作的。

3.常见的关系型数据库

  • MYSQL:开源小型数据库。已经被Oracle(甲骨文公司)收购了.MySQL6.x版本开始收费.

  • Oracle:收费的大型数据库。Oracle公司的产品.Oracle收购SUN公司,收购MYSQL。

  • DB2:IBM公司的收费数据库,应用于银行系统中.(安全性很高的数据库)

  • SQLServer:微软公司.收费的中型的数据库.

  • SyBase:已经淡出历史舞台.提供了一个非常专业数据建模的工具PowerDesigner.

  • SQLite: 嵌入式的小型数据库,应用在手机端.

  • 和java相关的数据库: mysql , oracle

二,数据库的安装和卸载(对照文档进行安装)

1.安装需要注意的地方

  • 安装路径文件夹名称中不要有空格和中文字符

2.卸载需要注意的地方

  • 一定要删除的两个文件夹(数据库安装路径,数据存放路径,这两个文件夹在配置文件里面my.ini)

  • 一个软件对应一个数据库

  • 一个实体(类)对应一张表

三,sql概述

1.什么是sql?(数据库软件来操作数据库的命令)

  • SQL:Structure Query Language。(结构化查询语言),数据库软件通过sql语句操作数据库服务器

  • SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。

  • 各数据库厂商(mysql,oracle,SqlServer)都支持ISO的SQL标准。

  • 各数据库厂商在标准的基础上做了自己的扩展。

2.sql的分类(了解)

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;

    ​ CREATE、 ALTER、DROP这些关键字是用于创建、修改、删除数据库表格的。(与表中数据的操作没有关系)

  • DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(用于对表中的数据进行增删改)INSERT、 UPDATE、 DELETE这些语言插入、修改、删除数据。【重点】(只跟表中数据的增删改操作有关系)

  • DCL(Data Control Language):数据控制语言,用来定义访问权限安全级别

    ​ grant 一句话:这个跟咱们没有多大关系。

  • DQL(Data Query Language):数据查询语言,用于查询数据。【重点】

    SELECT 这些语言用于查询数据 【重要】

四,对数据库的CRUD【了解】

补充:修改用户名

  • 修改用户名:

    • use mysql;

    • update user set user="新用户名" where user="旧用户名";

    • flush privileges;

连接数据库服务器的步骤

  • 1.在cmd中输入: mysql -u root -p然后回车, 输入密码然后回车

  • 2.在cmd中输入: mysql -uroot -p密码

1,创建数据库

1.1语法

create database 数据库名 character set 字符集;

字符集(charset):符号和编码。

校对规则(collation):是在字符集内用于比较字符的规则,(了解)

1.2练习

  • 创建一个da08的数据库(默认字符集)

    • create database da08;

  • 创建一个da08的数据库,指定字符集为gbk

    • create database da08 character set gbk;

  • 创建一个day的数据库,指定字符集为gbk,校对规则为gbk_chinese_ci

    • create database day character set gbk collate gbk_chinese_ci;

2.查看数据库

2.1查看所有的数据库

  • show databases;

2.2查看数据库的定义(查看数据库的字符集),查看某个数据库的建库语句

  • show create database 数据库名(了解)

3.删除数据库

  • drop database 数据库名;

    • 删除day的数据库

      • drop database day;

4.修改数据库

  • alter database 数据库名 character set 字符集名;

    • alter database day character set utf8;

注意:

  • 是utf8,不是utf-8

  • 不是修改数据库名

5.其它操作

  • use 数据库名; 切换数据库/声明要使用的数据库(在创建表之前,一定要切换到某个数据库)(重要)

    • use da08;

  • select database(); 查看正在使用的数据库

注意:

  • 在创建表之间一定要指定数据库. use 数据库名;

五,对表的CRUD

1.创建表(重点)

1.1语法

​ create table 表名(

​ 列名 类型 约束,​ 列名 类型 约束,​ 列名 类型 约束);

​ 字段(列名) int;

1.2 类型

  • 整型 int

  • 浮点型: float, float(5,2)--> 999.99, -999.99 一般不需要这样指定长度。

  • 字符串: char(10); 固定长度, 最大可以放10个字符 . 当 要输入的字符长度是固定的时候使用char

    ​ varchar(10);可变长度, 最大可以放10个字符.

  • 文件: BLOB 二进制

    注意: 在公司,存文件是把文件放在服务器(电脑)上,将放文件的路径存到数据库.

  • 时间类型

    * date*:年-月-日

    datetime:年-月-日-时-分-秒

    time:时-分-秒

    timeStamp: 时间戳(显示也是年-月-日), 能表示的范围是1970年1月1日0时到2038年的时间。在修改该条数据的时候会自动更新为当前时间

1.3 约束,

  • 即规则, 类似集合里面的泛型 List<String> list ;

  • 作用:保证用户输入的数据类型和格式保存到数据库中是正确的

约束种类:

  • 1.not null: 非空 约束

  • 2.unique;唯一约束, 后面的数据不能和前面重复

  • 3.primary key;主键约束(非空+唯一); id字段一般都有主键约束

    • 每张表都应该有一个主键

  • 4.auto_increment; 自动增长列 ,一定是和主键一起使用的。

id类型(用于做主键)

  • 通常给id int类型设置主键约束, auto_increment

1.4练习

  • 创建一张学生表(含有id字段int,姓名字段varchar,性别字段为int类型. id为主键自动增长)

    • create table student(id int primary key auto_increment, name varchar(100), sex int);

2.查看表

2.1查看所有的表

show tables;

2.2查看表的定义结构(查看表的字段)

desc 表名;

2.3 查看建表语句(不重要)

show create table 表名

3. 修改表

(除了修改表名之外,都是以: alter table 表名 开头)

3.1语法

  • 增加一列alter table 表名 add 字段名 类型 约束;

    • alter table student add age int not null;

  • 修改列的类型约束; alter table 表名 modify 字段 类型 约束 ;

    • alter table student modify name varchar(10) not null;

  • 修改列的名称,类型,约束; alter table 表名 change 旧列名 新列名 类型 约束; 新列名必须指定类型

    • alter table student change stuname name varchar(10) not null;

  • 删除一列alter table 表名 drop 列名

    • alter table student drop age;

  • 修改表名 ; rename table 旧表名 to 新表名

    • rename table student to studentinfo;

3.2练习

  • 给学生表增加一个grade字段(列)

    • alter table student add grade int not null;

  • 给学生表的sex字段改成字符串类型

    • alter table student modify sex varchar(20);

  • 给学生表的grade字段修改成class字段(改列名)

    • alter table student change grade class int;

  • 把class字段删除

    • alter table student drop class;

  • 把学生表修改成老师表

    • rename table student to teacher;

4.删除表

drop table 表名;

六,对表里面数据的CRUD(重点

准备工作:

​ 创建一张明星表(明星id,明星名字,明星年龄,明星身价,明星性别,明星类型.备注:明星id是主键,自动增长)

create table star(id int primary key auto_increment, name varchar(50), age int, price int, sex varchar(10), cno int);

1.插入数据

insert into 表名(列,列..) values(值,值..);

	insert into star(name,age,sex,price,cno) values("张三",18,"male",10000,1);
insert into 表名 values(值,值....)有多少列values后面就要写多少个值,哪怕你要为空你也得写null。
	insert into star values(null,"宝宝",28,5000,'male',1);
	insert into star values(null,"霆锋",38,8000,'male',1);
	insert into star value(null,"羽凡",48,4000,"male",1);
	insert into star value(null,"蓉蓉",35,5000,'female',2);
	insert into star values(null,"小白",30,8000,'female',2);
	insert into star values(null,"房祖名",29,1000,'male',3);
	insert into star values(null,"柯震东",28,2000,'male',3);
	insert into star values(null,"周立波",40,1000,'male',3);
	insert into star values(null,"王全安",50,250,'male',4);
	insert into star values(null,"黄海波",40,500,'male',4);
	insert into star values(null,"周杰",50,3000,'male',5);
	insert into star values(null,"黄子韬",28,6000,'male',5);

注意:

  • 没有赋值的列,系统自动赋为null

  • 列名与列值的类型、个数、顺序要一一对应。

  • 值不要超出列定义的长度。

  • 如果插入空值,请使用null

  • 插入的日期和字符串,需使用引号。

命令行插入中文数据报错:

  • 关闭mysql服务

  • 修改配置文件 my.ini中客户端的编码为gbk

  • 重新开启服务

2.更新记录(如果不加条件,就更新所有行的数据)

2.1语法

update 表名 set 字段 = 值 ,字段 = 值 [where 条件]

2.2练习

  • 将所有明星的性别改成女性

    • update star set sex='female';

  • 将宝宝的性别改成男性

    • update star set sex='male' where name='宝宝';

  • 将蓉蓉的价格改成-250

    • update star set price=-250 where name="蓉蓉";

  • 将房祖名的价格在原价格的基础上增加2000

    • update star set price=price+2000 where name='房祖名';

3.删除记录(表还在)

3.1语法

delete from 表名 [where条件];如果没加条件相当于将表中的数据全部删除。

truncate table 表名 ; 将表中的所有数据都删除

区别:

  • DELETE 删除表中的数据,表结构还在; 删除后的数据可以找回

  • TRUNCATE 删除是把表直接删除,然后再创建一个同样的新表。删除的数据不能找回。执行速度比DELETE快。

3.2练习

  • 删除表中名称为’蓉蓉’的记录

    • delete from star where name='蓉蓉';

  • 删除表中的所有记录

    • delete from star;

4.查询记录(重点中的重点,难点)

4.1语法

select 列名,列名 聚合函数 from 表名 [WHERE --> group by -->having--> order by]

4.2练习

4.2.1 查询所有的列的记录 select * from 表名;

  • 查询明星表的所有记录

4.2.2查询某张表特定列的记录 select 字段名1,字段名2 from 表名;

  • 查询明星表的姓名和年龄字段

4.2.3 去重查询 (distinct 字段) : select distinct 字段名 from 表名;

​ 去除重复记录

  • 把年龄重复的给筛选

    • select distinct age from star;

注意:

  • 要distinct关键字后面的字段都重复才会去重

4.2.4 别名查询 (字段 as 别名, as可以省略) 只是为了展示得更容易看懂一点,其实没啥作用

  • 查询明星名称和价格,明星价格通过别名‘身价’来显示

    • select name,price as '身价' from star

4.2.5运算查询(+,-,*,/等) (注意:只是展示出来的时候做了运算,实际表中的数据没变)

  • 把明星名称,和明星身价+1000查询出来

    • select price+1000 from star;

注意:

  • 运算查询在数值类型的字段之间是可以的

  • 字符串时间这些做运算查询,结果是没有意义的

4.2.6 条件查询 (控制查询出来的数据行数) 【重点,难点】 <>不等于

注意:

1.between...and...: 包含临界值 eg: between 3000 and 6000相当于: 3000<=price<=6000

in(set) in(13,18,20,35)

2.模糊查询,like和占位符一起使用:

查询以"张"开头的人 name like “张%” name like "张_" name like "%国%"

% : 多位(0~n)​ _ : 一位

  • 查询价格>3000的明星

    • select * from star where price>3000;

  • 查询价格在3000到6000之间的明星

    • select * from star where price between 3000 and 6000;

  • 查询id在1,5,10,15集合内的明星

    • select * from star where id in(1,5,10,15);

  • 查询明星名称以'黄'开头的明星

    • select * from star where name like "黄%";

  • 查询明星名称以周开头并且周字后有两个字的明星信息

    • select * from star where name like "周__";

  • 查询价格大于3000并且年龄大于30的明星的信息

    • select * from star where price>3000 and age>30;

  • 查询价格大于5000或者名字以周开头的明星信息

    • select * from star where price>5000 or name like "周%";

  • 查询名字不以"周"开头的明星

    • select * from star where name not like "周%";

4.2.7排序; order by 列名 升序asc(默认) , 降序 desc 排序语句放在查询语句的最后面!

  • 查找所有明星的记录,按照价格升序

    • select * from star order by price asc;

  • 查找所有明星的记录,按照价格升序,如果价格一样,按照年龄降序

    • select * from star order by price asc,age desc;

应用场景:

1.qq, 微信 ,陌陌, 探探, 花田  附近的人 . 距离

2.京东, 淘宝, 价格

4.2.8聚合函数 (聚合函数前不能有字段名,如果一定要有,那么该字段名只能是用来分组的字段名)

聚合函数不能用在where条件中

聚合函数是用来做纵向运算的函数

count(*|有非空约束的字段名);统计指定列中不为NULL的记录行数,一般用于统计表中的总数据条数。为了统计数据的准确性,括号中传入有非空约束的列的列名或者 *

​ 如果要统计表中的总数据条数,那么count( *|不能为空的字段名)

​ sum(); 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0

​ max(); 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算

​ min();计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算

​ avg(); 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0

  • 统计明星表的总数据条数

    • select count(*) from star;

    • select count(id) from star;

  • 求明星价格的总和

    • select sum(price) from star;

  • 查询明星的最大价格

    • select max(price) from star;

  • 查询明星的平均价格

    • select avg(price) from star;

4.2.9分组 (group by 列) group by不能单独使用,只要是分组查询select后面要接列名的话一定要是用于分组的列名

  • 分组查询,单独使用 group by , 只显示各个组的第一条数据

  • 只需要稍微了解,group by 结合group_concat()使用,可以展示每一组的数据集合

    • select cno,group_concat(name) from start group by cno; 分组查询select后面一定要跟上分组的字段名

  • group by 结合聚合函数使用(聚合函数前写的字段名必须是用于分组的字段名)(重要!!!)

    • 统计每一组的数据个数

      • select cno,count(*) from star group by cno;

    • 统计每一组的数据的总价格

      • select cno,sum(price) from star group by cno;

    • 统计每一组的数据中价格最小的那个

      • select cno,min(price) from star group by cno;

  • 根据明星类别(cno)分组,统计不同明星类别的个数

    • select cno,count(*) from star group by cno;

  • 根据明星类别分组,统计不同明星类别的总价格

    • select cno,sum(*) from star group by cno;

4.2.10 分组后筛选(having)

  • 根据明星类别分组,统计不同明星类别的个数,并且该明星类别数量大于2的

    • select cno,count(*) from star group by cno having count(*) > 2 ;

4.2.11 外键约束

  • 添加外键 :

    alter table 表1 add [constraint 外键名] foreign key(字段) references 表2(字段);

  • 查看默认外键名 show create table 表名;

  • 删除外键 : alter table 表名 drop foreign key 外键约束名

注意:

  • having 是分组后筛选

where 和 having的区别

  • 1.having 是在分组后对数据进行过滤. where 是在分组前对数据进行过滤

  • 2.having 后面可以使用聚合函数,where后面不可以使用聚合函数

  • 3.having 后面的条件中只能出现前面select后出现过的字段名或者是与分组有关的聚合函数

    • 根据明星类别分组,统计不同明星类别的个数,并且过滤掉明星年龄小于30的明星

      • select cno,count(*) from star where age>=30 group by cno;

  • 4.WHERE是分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。

顺序:

**select...from 表名 where 条件 group by 字段 having 条件或聚合函数 order by 升序或降序**

猜你喜欢

转载自blog.csdn.net/Kfie66/article/details/82025673