10.23 数据库学习总结

编程入门 行业动态 更新时间:2024-10-16 00:25:57

10.23 <a href=https://www.elefans.com/category/jswz/34/1771350.html style=数据库学习总结"/>

10.23 数据库学习总结

数据库的分类

1.关系型:

  • 定义:表与表之间存在关系
  • 常见的关系型数据库: mysql  sqlserver   oracle

2.非关系型

  • 定义:表和表之间不存在关系,每张表都是独立的
  • 常见非关系型数据库: Redis   mongodb

主要学习的内容Mysql

特点
Mysql 数据库的特点:体积小、速度快、总体拥有成本低,尤其是开放源码 

Mysql 的使用

简单的SQL命令:

#查看版本号:
select version();
#查看本地所有的数据库:
show databases;
#查什么写什么:
select xxxx';
#切换数据库:
use test; 
#查看所有的表:
show tables;
#退出:
Exit

表结构

表结构先确定列  确定列先确定数据类型。

数据类型   

数值型  :  int   bigint  decimal 
字符型   :char -定长   varchar---变长       text/longtext

时间型   :    date--年月日    datetime--年月日 时分秒

SQL中的分类

DDL数据定义语言(Data Definition Language)

代表关键字:create  创建,drop 删除, alter修改

DML数据操作语言(Data Manipulation Language)

代表关键字:insert 增,delete 删,update改 

DQL数据查询语言(Data Query Language)  

代表关键字:select 查询 

DDL 数据库定义语言

1.create 创建     

语法 create Table  表名(

列, 数据类型

);

代码如下

CREATE TABLE  t_order(
id int AUTO_INCREMENT PRIMARY KEY,
nun int,
addr VARCHAR(50),
name  VARCHAR(10),
phone CHAR(11)
)

2.drop 删除

语法: drop table 想删除的表名

代码如下

drop table 想删除的表名

3.DDL的增强  关键字alter

1.修改表名  关键字rename.

语法 alter table 表名 rename 新表名

代码

alter table student rename student_01

 2.更改字段 关键字 change   注意 change 可以更改字段,也可以更改字段的数据类型.

语法:-alter table表名change列名 新列名数据类型;

代码

alter table t_order change addr saddr VARCHAR(12);

3.添加列关键字 add

语法:alter table表名add列名类型;

代码

alter table student add name2 char(3);

4.-删除列关键字drop

语法:alter table表名drop列名

代码

alter table student drop sname;

5.更改新的列数据类型:关键字 modify

语法: -alter table表名modify列名新数据类型;

代码

alter table t_order 表名 MODIFY nun 列名 char(2) 新的数据类型 ;

DDL中的约束:

1.主键自增   关键字  AUTO_INCREMENT  PRIMARY KEy

创建时添加主键自增代码

CREATE TABLE  t_order(
id int AUTO_INCREMENT PRIMARY KEY,   主键自增添加
nun int,
addr VARCHAR(50),
name  VARCHAR(10),
phone CHAR(11)
)

2.主键  关键字 PRIMARY KEY

在创建时创建主键

CREATE TABLE  t_order(
id int  PRIMARY KEY,
nun int,
addr VARCHAR(50),
name  VARCHAR(10),
phone CHAR(11)
)

3.外键 /物理外键  关键字foreign key(主键) reference 另一张表的表名(另一张表中想要的外键)

定义:

定义: 一个表中的外键是另一个表中的主键

项目中不允许加物理外键, 只加逻辑外键。

逻辑外键  : 就是不使用外键, 写上就行。

CREATE TABLE  t_order(
id int  PRIMARY KEY,
nun int,
addr VARCHAR(50),
name  VARCHAR(10),
phone CHAR(11)
foreign key(id) reference 另一张表的表名(另一张表中想要的外键)
)

4.默认值和非空值  关键字default 默认值 not null 非空

在创建表格时添加

create table temp2(id int not null,`name` varchar(30) default  'abc',sex varchar(10) not null default '男');

5. 唯一 关键字 unique 

在创建表格是添加唯一约束

create table student01(`name` varchar(5),id int UNIQUE  // 创建表格时添加唯一)

DML(数据操作语言) 重点

1.Insert 新增

INSERT into student(name,age,sex)VALUES('张三',l8,'男');

2.update  修改 

update表名set列名1=值,列名2=值where列名=值;
UPDATE t_student set score='100'  where id=2;直接修改不用管以前的 直接覆盖

3.删除   delete

删除
delete from表名where列名=值;
delete from student where name='张三';

DQL(数据查询语言)

select  查询

select 列限定 from 表限定 where 行限定

DQL 中的条件判断

1.and  且,和,的意思,一般用于 必须符合两个添加的判断,等同于java中的 &&

select *from student WHERE name='张三' AND score>91;

2.or或的意思,一般用于 符合一个添加判断的情况下,等同于java中的 ||.

select *from student WHERE name='张三' or score>91;

3.between  and   在...之间  

语法 :

select 列限定 from 表限定 where 列名 between 值1 and 值2;

select *from student WHERE score BETWEEN 95 AND 1000;

4.In  在指定数据中

语法 :

select 列限定 from 表限定 where 列名 in(值1,值2....);

select *from student WHERE score in(98,97);    in( 写谁找谁)

5.模糊查询like  注意点: % 匹配任意个数的任意字符 _ 匹配单个任意字符

语法 : select 列限定 from 表限定 where 列名 like  '值' ;如果想要查询 _ 或者 % 需要转义  \%   \_

删除学生信息表中,姓“小”的学生。(2分)
DELETE   FROM student_info WHERE name LIKE '小%'

6.Order by 排序

语法 : select 列限定 from 表限定 order by 列名 asc/desc  注意点:Asc : 升序Desc : 降序

SELECT * FROM student ORDER BY score DESC  /倒叙
SELECT * FROM student ORDER BY score Asc # 正序

7.Limit   限制条数,通常和order by一起使用,因为我们使用排序之后,再去获取前几条数据,比较有价值,比如成绩前三名

语法 : select 列限定 from 表限定 limit 条数;

select *FROM student LIMIT 1;

select 列限定 from 表限定 limit 开始值(不包含) ,条数;

select *from student LIMIT 1,3;  不包括1 取3个值

经典题

查询成绩表中每个学生的成绩,包括学生学号、姓名、课程、成绩、成绩等级(score_level)字段,其中成绩等级字段取值逻辑为:根据成绩score字段,60<=score<75为及格,75<=score<85为良,85<=score<=100为优,其余为不及格。SELECT *,(CASE WHEN score<75 and score>=60 THEN '及格'WHEN score<85 and score>=75 THEN  '良'WHEN score<100 and score>=85 THEN'优'END 
)as score FROM student_score as ss JOIN student_info  as si  on ss.stdno=si.stdno 

 MQL 中的group by 组函数      

先分组再排序

先分组再过滤

count(*) : 总条数

#count(*) : 总条数
select COUNT(*)as '总条数' FROM student WHERE id;

max(字段名) : 最大值

#max(字段名) : 最大值
select max(score) as'最大值' FROM student WHERE score;

min(字段名) : 最小值

#min(字段名) : 最小值
select min(score) as'最小值' FROM student WHERE score;

avg(字段名) : 平均值

#avg(字段名) : 平均值
select avg(score) as'平均值' FROM student WHERE score;

sum(字段名) : 总和

#sum(字段名) : 总和
select sum(score) as'总和' FROM student WHERE score;

MQL常用函数:

1.返回字符个数  关键字char_length()

select CHAR_LENGTH('武正旭');

2.返回字符所占字节数 关键字select  length('中国'); 注意点  MySQL中,一个UTF8编码的汉字占3个字节

SELECT length('中国')

3.拼接符  关键字 concat  

#select  concat(  '=',  'a',  'b',  'c');


4.拼接符select CoNCAT_WS ('|','a','v','g');  第一个字符是分割符

select CoNCAT_WS ('|','a','v','g')

5. upper('abcd');转成大写

select upper('acas')


6.select  lower('ABCD');转小写.

select lower('ABCD')


7.  切割select  substring(  '系统信息类',  1,  3  );  三个参数 第一个是切割内容,第二个是开始切割的位置下标,第三个是从开始切割的位置往后切割几刀.

select SUBSTRING('欢乐麻将',1,2);

DQL中的Having    过滤   先分组再过滤

从HAVING中得出的执行顺序:表限定>行限定>列限定

having  可以使行限定 最后执行

DQL合并执行

union 去重

union all 不去重

DQL中的子查询

三种情况的说明及注意事项

在select 后边的子查询

在from 后边的子查询

在where后边的子查询 

1.在select 后边  注意点

1.一定要在两个表之间找好对应关系(teacher.id必须是主键或者必须保证teacher.id在teacher表中是唯一的)

2.子查询中只能有一个字段(子查询的结果必须是一行一列)

使用子查询的时候,建议大家养成使用别名的好习惯,这样可以让我们的查询语句更加清晰。别名可以用来命令新字段,也可以用来命名新表.

select*,(select name from teacher where id=s.teacher id)as'老师姓名'from student as s;

2.在from 后边  注意点

当位于FROM后面时,要注意

1.我们可以把子查询当成一张虚拟的表

2.必须要有别名,因为子查询优先被执行,子查询的别名,可以让别的查询当做表或者列去操作

select *,
case rank
when 'A' then '优'
when 'B' then '良'
when 'C' then '差'
end rank_ch
from (
select *,
case // 不常用的 case when
when score < 60 then 'C' 
when score >=60 and score <80 then 'B' 
when score >=80 then 'A' 
end as rank 
from student
) a;

3.在where 后边

注意点

当位于WHERE后面时,要注意

  1. 多条数据要用in而不要用=,如果确定子查询的结果为一行一列的话,就可以用 = 等于
  2. 如果返回结果为多行一列的话 要用 in , 一列是必须的,必须是一列

3.子查询中的SELECT后面只能有一个字段(多个字段的话会报错)

DQL中的多表查询

1.行转列

什么是行转列 :通过SQL语句 实现这样的功能,就叫行转列

正常的查询结果是这样

 

可是我想要的结果是这样...

 

end

2..场景一(多行转一行多列)

 

可以使用下面的SQL语句(group by 与 case when结合使用即可实现):

select name,max(case coursewhen 'java' then scoreend) Java, max(case coursewhen 'MySQL' then scoreend) MySQLfrom test_9group by name;

思路分析 :

首先我们默认的情况 每个名字都输出两次,而最终结果只有一次名字,所以肯定是 以名字分组 group by

select * from test_9 group by name;

对我们来说 ,id,课程,和分数都不需要了,只需要有名字 然后再把java和mysql放上去

select name , 1 as java , 1 as MySQL from test_9  group by name;

然后再使用聚合函数聚合(此处理解“聚合”,相当于把多行数据压扁成一行)

select name,max(case coursewhen 'java' then scoreend) Java, max(case coursewhen 'MySQL' then scoreend) MySQLfrom test_9group by name;

场景二(多行转一行一列)

相关函数

concat(值,’拼接符’,值 ) : 拼接,多行数据只会拼接一行group_concat(值,’拼接符’,值 ) : 拼接,多行压扁到一行

思路分析 :

第一步:拆分问题,先按分组的思路

select name,1 as '各科成绩' from test_9 group by name;

 第二步:将课程名与成绩拼接成一列

select name,concat(course,'=',score) as '各科成绩'from test_9 group by name;

 第三步:利用group_concat函数将多行压扁到一行

select name,group_concat(course,'=',score) as '各科成绩'from test_9 group by name;

 第四步:修改分隔符(默认是逗号)

select name,group_concat(course,'=',score separator ' | ') as '各科成绩'from test_9 group by name;

 第五步:按课程名称排序

select name,group_concat(course,'=',score order by course asc  separator ' | ') as '各科成绩'from test_9 group by name;

DQL-连接查询  多表查询

最简单的多表查询 : select * from 表1,表2;

内连接: 

 inner join 

特点:丢失表的特有属性

外连接:

1.left join   保留左表的特有属性, 丢失右表的特有属性

2.  right   join   保留右表的特有属性, 丢失左表的特有属性

在使用 join 连接查询 时,on和where条件的区别如下:
    1、on条件是在生成临时表时使用的条件,需要和链接查询一起使用。必须放两张表关联关系的逻辑外键
    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。

  

完整版的政旭教学

-- 数据库
-- 查看数据库
show databases;-- DDL  数据库定义语言  databases defined language    create  alter  drop
create table demo1(
ids int PRIMARY KEY auto_increment,
name char(22),
addr varchar(22)
)ENGINE = INNODB  default CHARSET=utf8alter table demo1 rename demonewalter table demonew add newlie varchar(22)
alter table demonew add FOREIGN KEY(ids) REFERENCES demo(id)alter table demonew change newlie oldlie varchar(22)alter table demonew drop oldliealter table demonew MODIFY  name varchar(22)
alter table demonew modify name varchar(22) not null 
alter table demonew modify name varchar(22) default 'wzx'drop table demonew -- DML数据操作语言   insert   update   delete   
insert  into demo1   VALUES(3,'b','asda')update demo set id = 120 where id =  1delete from demo where id = 120

-- DQL   数据查询语言
# 条件判断
# 组函数
# 常用函数
select *
from demoselect *
from demo
where id = 2select *
from demo
where id between 1 and 100select *
from demo
where id in (2, 3)select *
from demo
where id is not nullselect *
from demo
where id = 2or id = 111select *
from demo
where name like 'b'select *
from demo
limit 0,5select *
from demo
order by id ascselect name, count(*)
from demo
group by nameselect upper('asdasa')
select lower('ADASDASD')select version()select concat('1', 'a')select concat_ws('=', 'a', 'b')# 子查询,嵌套查询,多表联查
select *
from demo
where id in (select ids from demo1)
select *
from demo
where id in (2, 3, 111, 121)alter table demoadd addr varchar(22)select *
from demoinner joindemo1ON DEMO.ID = demo1.idsselect *
from demoleft join demo1 on demo.id = demo1.idsselect *
from demoright join demo1 on demo.id = demo1.ids

更多推荐

10.23 数据库学习总结

本文发布于:2024-03-05 19:19:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1713151.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据库

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!