MySQL数据库

一、什么是数据库

        数据库就是用来存储数据的,网页、程序等现实的数据都是从数据库中取出来的。Mysql是一个关系型数据库,存储数据形式是表格形式。

        一个项目对应着一个数据库,数据库服务器下面可以有很多个数据库,一个数据库中可以有很多个表,一个表中可以有很多个字段和数据。

(本文主要讲解 mysql 在 cmd/可视化工具 上的操作命令)

二、通过命令操作数据库

#1.连接数据库服务器的命令
mysql -uroot -p
Enter password: ******

#2.展示当前服务器下面有多少个数据库
show databases;

#3.新建一个数据库 	  create database 库名;
create database person;

#4.删除库  		drop database 库名;	//慎用
drop database person;
#5.选中库			use 库名;
use person;
#6.查看当前数据库下面有多少张表
show tables;

#7.创建表
create table 表名字 (字段1 数据类型,字段2 数据类型,...);

#8.换一种方式创建表
create table person (
 -> id int,
 -> name varchar(32),
 -> age int
 -> );

#9.查看表的结构
desc person;

#10.删除表
drop table person;		//慎用

2.1、修改创建好的表字段

#1.删除age字段   语法格式:alter table 表名 drop  字段;
alter table person drop age;

#2.添加age字段语法格式:  alter table 表名  add 字段 数据类型;
alter table person add age int;

#3.在指定的字段的后面添加一个字段,name的字段的后面添加一个字段 
#语法格式:alter table 表名 add 字段 数据类型 after 字段;
alter table person add sex boolean after name;

#4.修改一个字段的数据类型  name数据类型 varchar 改为char类型
#语法格式:alter table 表名 modify 字段 修改后的数据类型;
alter table person modify name char(20);

#5字段和数据类型一起修改
alter table person change sex gender int;

#6.添加一个字段
#数据类型 text  文本 字符串 不限制大小
alter table person add info text;

#7.加薪资字段  小数
#  float(8,2);
#  double(8,2);
#  decimal(8,2);
#最大长度是8位 其中小数占2位
alter table person add salary decimal(8, 2);

#8.展示表中的数据
desc person;

2.2、添加数据到表

#1.插入一条数据到表中
insert into person values (值1, 值2,....);

#2.删除数据
DELETE FROM 表名称 WHERE 列名称 = 值
#删除多条数据
delete from person where id in (1,3,4);


#3.修改数据
UPDATE 表名称 SET 列名称 = 新值,列名称=新值,... WHERE 列名称 = 某值

#4.查询
#选择所有的数据
select * from person;

#查询指定的字段的数据
#select 字段1,字段2,字段3,... from 表名;
select id, name, salary  from person;

#按照字段进行查询的时候,可以对字段进行起别名
#select 字段1 as 别名1, 字段2 as 别名2 , ... from 表名
select id as "编号", name as "名字", salary as "薪资" from 		person;

2.3、通过条件查询数据

下面的运算符可在 WHERE 子句中使用:

操作符描述
=等于
<>不等于
>大于
<小于
>=大于等于
<=小于等于
BETWEEN在某个范围内
LIKE搜索某种模式

代码案例如下:

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

#例1
select * from person where id=6;
#例2
select * from person where name like "%王%";

#例3
select * from person where gender = 1 and(&&) age = 29;
#例4
select * from person where age < 30 or(||) gender = 0;

#ORDER BY 语句用于对结果集进行排序。
select 字段 from 表 order by 字段 asc;默认是升序  asc可以省略
select 字段 from 表 order by 字段 desc;
#例5
select * from person order by salary;
#例6
select * from person order by salary desc, age asc;

#额外:
limit :限制输出
#注意事项:    limit 必须在where  和   order by的后面
	limit 数字;
	limit 数字1, 数字2;
#数字1    偏移量
#数字2    数据的个数

2.4、通过条件查询指定字段的数据

select 方法(字段名字) FROM 表名;

#方法:
#求一个字段中数据的最大值
	max();	   
#求一个字段中数据的最小值
	min();
#求一个字段中数据的平均值
	avg();
#求一个字段中所有数据的和
	sum();
#统计当前表中数据的个数
	count(*);

2.5、事务操作

事务操作:事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
set autocommit = 0;
语句1;
语句2;
commit;(提交)		或者		rollback;(回滚)

2.6分组统计

        GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。

#以谁分组,就展示谁(select)
	select 字段名 from 表名 group by 字段名;
#展示且计数
	select 字段名,count(*)  from 表名 group by 字段名;
#一般使用group by的时候 需要对分组之后的数据进行筛选,使用having,不能where
	select 字段名,count(*) from 表名 where 属性 > 1 group by gender having count(*) > 1;

三、约束

3.1、数据约束

        在创建表的时候,一定要对字段进行约束,这样插入数据的时候,才更加合理,约束性。

#1、默认值	default
	如果添加数据时当前字段没有被赋值,则设置为默认值
	
#2、非空	not null
	如果当前字段由非空约束,则添加数据时该字段必须被赋值

#3、唯一	unique
	如果当前字段由唯一约束,则不能添加重复数据

#4、主键	primary key
	如果当前字段由主键约束,该字段的数据必须唯一且非空。一个表只有一个主键,且主键字段和数据真实属性无关

#5、自增长	auto_increment	(一般配合主键修饰)
	如果当前字段由自增长约束,插入新数据时会自动创建主键字段的值
	
#6、时间字段
	timestamp	默认值		current_timestamp
	date
	
#综合实例
mysql> create table person6(
    -> id int primary key auto_increment,
    -> name varchar(32) not null,
    -> age int default 10,
    -> info text unique,
    #添加系统当前时间
    -> createTime timestamp default current_timestamp
    -> );

3.2、外键的约束

        如果两个表中有相关的数据,删除一个表(主表)的数据,另一个表(副表)的数据也要改变。因此可以添加一个外键约束,将两个表联系起来。

mysql> create table 表名 (
	-> constraint fk_表1_表2 foreign key(该表的属性)  references 另一个表(对应的属性)
    -> );
    
#加上外键约束以后,增删改  有的时候会报错:
#只有按照下面的操作才不会报错
增加的时候: 先增加主表 再增加副表
删除的时候: 先删除副表 再删除主表
修改的时候: 先修改副表 再修改主表

#级联操作:
修改和删除时只需要修改一个,两个表的数据都会修改
#级联修改和级联删除
mysql> create table 表名 (
	-> constraint fk_表1_表2 foreign key(该表的属性)  references 另一个表(对应的属性)
    -> on delete cascade
    -> on update cascade
    -> );

四、联表查询(重点)

4.1、常规的联表查询

mysql> select 字段	//查什么
    -> from 表1,表2	//从哪里查
    -> where 表1.属性 = 表2.属性 and 表1.属性 = 值;

下边是例子:

mysql> select * from dept;
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
|       4 |    A部    |
|       5 |    B部    |
|       6 |    C部    |
+---------+-----------+


mysql> select * from emp;
+--------+----------+---------+---------------------+
| emp_id | emp_name | dept_id | reg_time            |
+--------+----------+---------+---------------------+
|      3 | 张三    |       4 | 2023-04-10 10:46:04  |
|      4 | 李四    |       4 | 2023-04-10 10:46:08  |
|      5 | 王五    |       4 | 2023-04-10 10:46:11  |
+--------+----------+---------+---------------------+


#例子1:联表查询,查看 erbei 属于哪个部门
mysql> select emp.emp_name, dept.dept_name
    -> from emp, dept
    -> where emp.dept_id = dept.dept_id and emp.emp_name = "李四";
+----------+-----------+
| emp_name | dept_name |
+----------+-----------+
| 李四     |    A部    |
+----------+-----------+

4.2、内连接联表查询

        只是换了一种写法

#可以关联一个表,也可以关联多个表
SELECT 	column_name(s)  	查什么
FROM 	table_name1    		从哪查  表1
INNER JOIN table_name2   	关联 表2
ON 		table_name1.column_name=table_name2.column_name		通过哪个属性关联
(
    INNER JOIN table_name2   	关联 表3
	ON 		table_name1.column_name=table_name2.column_name
)

#INNER JOIN 与 JOIN 是相同的

4.3、外连接(开发少用)

#分为左外连接和右外连接:

#LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
mysql> select *
    -> from dept d
    -> left outer join emp e
    -> on d.dept_id = e.dept_id;
+---------+-----------+--------+----------+---------+---------------------+
| dept_id | dept_name | emp_id | emp_name | dept_id | reg_time            |
+---------+-----------+--------+----------+---------+---------------------+
|       4 |   A部    |      3 |   张三    |       4 | 2023-04-10 10:46:04 |
|       4 |   B部    |      4 |   李四    |       4 | 2023-04-10 10:46:08 |
|       6 |   C部    |   NULL |  NULL     |    NULL | NULL                |
|       7 |   D部    |   NULL |  NULL     |    NULL | NULL                |
+---------+-----------+--------+----------+---------+---------------------+


#RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
mysql> select *
    -> from emp e
    -> right outer join dept d
    -> on e.dept_id = d.dept_id;
+--------+----------+---------+---------------------+---------+-----------+
| emp_id | emp_name | dept_id | reg_time            | dept_id | dept_name |
+--------+----------+---------+---------------------+---------+-----------+
|      3 |  张三    |       4 | 2023-04-10 10:46:04 |       4 |   A部    |
|      4 |  李四    |       4 | 2023-04-10 10:46:08 |       4 |   B部    |
|   NULL | NULL     |    NULL | NULL                |       6 |   C部    |
|   NULL | NULL     |    NULL | NULL                |       7 |   D部    |
+--------+----------+---------+---------------------+---------+-----------+

五、开发中如何使用多表联查

5.1、一对多查询或者多对一查询

#场景: 一个老师对应多个学生
#常规查询:
mysql> select teacher.t_name, student.s_name
    -> from teacher, student
    -> where teacher.t_id = student.teacher_id and teacher.t_name = "老师";
    
#内连接查询:
mysql> select t.t_name,s.s_name
    -> from teacher t
    -> inner join student s
    -> on t.t_id = s.teacher_id
    -> where t.t_name = "老师";

5.2、多对多查询

#场景: 一个学生对应多个课程,一个课程对应多个学生

#增加一个中间表,各存放一个数据
#常规查询:
mysql> select stu.s_name, course.c_name
    -> from stu, stu_course, course
    -> where stu.s_id = stu_course.s_id and stu_course.c_id = course.c_id and stu.s_name = "学生名";
    
#内连接查询: 
mysql> select s.s_name, c.c_name
    -> from stu s
    -> inner join stu_course sc
    -> on s.s_id  = sc.s_id
    -> inner join course c
    -> on sc.c_id = c.c_id
    -> where s.s_name = "学生名";

六、对sql的归纳(了解)

1.数据库查询语言  DQL
	查询select
2.数据库定义语言  DDL
	建库、建表、修改库、修改表
3.数据库操作语言  DML
	insert delete update
4.数据库事务语言  DTL
	事务
5.数据库控制语言  DCL
	权限管理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值