My SQL数据库

博客介绍了数据库的CMD操作,包括创建、查看、删除数据库,创建、修改表结构及表记录的增删改等,还提及DOS操作数据乱码解决方式。同时详细阐述了SQL-CURD,涵盖运算符、逻辑运算符、检索、排序、去重、分组查询、关联查询和子查询等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、CMD操作(数据库可视化工具也可操作)

1、创建数据库

	-- 格式:
	create database 数据库名;
    create database 数据库名 character set 字符集;

2、 查看服务器中的所有的数据库:

 show databases;

3、删除数据库(谨慎操作

  drop database 数据库名称;

4、查看某个数据库的定义的信息:

 show create database 数据库名;

5、切换数据库:

 use 数据库名;

6、创建表:

	-- 格式:
      create table 表名(
      // 字段名 类型(长度) 约束,
      id int primary key,  //创建主键
      alter table 表名 drop primary key;  //删除主键
      )
  主键自动增长:一般主键是自增长的字段 ,不需要指定。实现添加自增长语句, 主键字段后加  auto_increment(只适用MySQL)

表操作:

	# 查看数据库中的所有表:
      -- 格式:
      show tables;
    # 查看表结构:
      -- 格式:
      desc 表名;            
    # 删除表 :
      -- 格式:
       drop table 表名;

7、 修改表结构:

	alter table 表名 add 列名 类型(长度) 约束;//作用:修改表添加列.
    alter table 表名 modify 列名 类型(长度) 约束;  //作用:修改表修改列的类型长度及约束
    alter table 表名 change 旧列名 新列名 类型(长度) 约束;  //作用:修改表修改列名.
    alter table 表名 drop 列名; 	//作用:修改表删除列.
    rename table 表名 to 新表名;  // 作用:修改表名
    alter table 表名 character set 字符集;  //作用:修改表的字符集

8、插入表记录:

 	 insert into(列名1,列名2,列名3..) values  (1,2,3..); -- 向表中插入某些列
     insert intovalues (1,2,3..); --向表中插入所有列
   注意:
            *插入的数据应与字段的数据类型相同
            *数据的大小应该在列的长度范围内
            *在values中列出的数据位置必须与被加入列的排列位置相对应。
            *除了数值类型外,其它的字段类型的值必须使用引号引起。
            *如果要插入空值,可以不写字段,或者插入 null。	
            *对于自动增长的列在操作时,直接插入 null值即可。

9、更新表记录:

	-- 语法:
		update 表名 set 字段名=,字段名=;
        update 表名 set 字段名=,字段名=where 条件;
        -- 值如果是字符串或者日期需要加;
 注意:
        *列名的类型与修改的值要一致;
        *修改值得时候不能超过最大长度;

10、删除表记录:

   	-- 语法:
           delete from 表名 [where 条件];
面试题:
        删除表中所有记录使用delete from表名; 还是用truncate table 表名;
        删除方式:delete 一条一条删除,不清空auto_increment记录数;
        truncate 直接将表删除,重新建表,auto_increment将置为零,从新开始;

DOS操作数据乱码解决方式:

在图中与客户端有关的编码设置
        *client connetion result 和客户端相关;
        *database server system 和服务器端相关 ;
        *将客户端编码修改为gbk;
        *set character_set_results=gbk; / set names gbk;
        
        以上操作,只针对当前窗口有效果,如果关闭了服务器便失效。如果想要永久修改,通过以下方式:
        * 在mysql安装目录下有my.ini文件
        * default-character-set=gbk 客户端编码设置				                  *
        *character-set-server=utf8 服务器端编码设置
       
        *注意:修改完成配置文件,重启服务

二、SQL-CURD(更新20220617)

1、运算符

= :等于
> :大于
< :小于
>= :大于等于
<= :小于等于
<>!= :不等于

2、逻辑运算符

not 运算符:非 !
and 运算符:并且 &&
or  运算符:或者 ||
例:
	--判断
	typeid is not null
	typeid is null 
	---赋值
	typeid=null    

3、检索~根据条件进行查询

select列名1,列名2,列名3...(*:所有列)
from 表名 
where 
--条件
age>11 and sex='男'
orderby 列名1,列名2
limit 5--查询几条,限制条数

4、排序

--根据年龄倒叙排序desc倒叙asc升序默认是升序
select * from studentinfo
--如果第一列数值一样的情况下才会触发第二列的排序
order by age desc,Birthday asc;
--limit 2,5 从第2开始获取5条
--limit 5 获取5条
select * from studentinfo
order by age desc,Birthday asc
limit 10;

5、Distinct去重

--distinct排重
--distinct是对结果集排重,如果单表查询中有主键,百分之百不重复,这个写没有意义
select DISTINCT * from studentinfo;
select DISTINCT gender,age from studentinfo;

6、模糊检索

1)like模糊查询

运算符说明
%代表任意长度字符串
-代表一个字符
escape转译字符(注意:ESCAPE‘/’含义:/之后的_不作为通配)

2)正则表达式

运算符说明
“.”匹配任意单个的字符
“[]”匹配在[]内的任意一个字符
“[^]”匹配不在[]内的任意一个字符
“*”匹配零个或多个在它前面的字符
“^”匹配文本的开始字符
“$”匹配文本的结尾字符
“+”匹配+前面的字符1次或多次
“{n}”匹配前面的字符至少n次
--模糊匹配like和regexp/1[a-z]2/1--like类似正则,一套规则,但是规则很简单
--_代表一个字符%任意字符
select * from studentinfo where student name like '王%';
select * from studentinfo where student name like '%处%';
select* from studentinfo where student name like '王_';
--身份证号以410和412开头
select * froms tudentinfo where studentno REGEXP '^[410|412]';

7、分组查询

1)聚合函数

获取某些列的最大值、最小值、平均值等统计分析信息,有时候还需要计算出究竟查询到多少行数据项。分别有:sum、count(注意非空值)——计数,结果集有几行、max、min、avg

--根据性别分组
--count计数:求所有非空(空指的是count中书写的列的内容全部为空)条数的
select gender,count(*),count(age),max(age),min(age),avg(age),
--多行转一列
GROUP_CONCAT(studentname)
from studentinfo
group by gender;
--如果没有groupby所有数据算是一组进行聚合
select count(*) from studentinfo;

2)分组Groupby

--计算各个城市的人数
selectcity,count(*) from studentinfo group by city;
--计算各个城市的男生女生人数
select city,gender,count(*) from studentinfo group by city,gender;

3)Having子句

Having目的:对分组后的数据做过滤

--年龄>15的班级人数大于5的班级是?
--年龄>15是分组钱的过滤:where,需要在groupby前
--人数>5是分组后的过滤:having,需要书写在groupby后边
select classid,count(*) from studentinfo
where age>15
group by classid
having count(*)>5;

8、关联查询

内连接:
	根据关联条件,左表和右表数据都是完整的,这条记录就会显示。
外连接:
	保证至少一张表的完整性
左外连接:
	保证左表完整
右外连接:
	右表完整
全外连接:
	保证两张表的完整性
交叉连接:
	笛卡尔乘积(交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行再一一组合,相当于两个表“相乘”)**

1)内连接(等值连接)

select列名from表名
	[inner]join表名 --inner 可省略
on 关联条件
	**[inner]join表名
on 关联条件

2)外连接

--左外
select studentid,studentname,studentinfo.classid,classname
from studentinfo
left join classon studentinfo.classid = class.classid;

--右外
select studentid,studentname,studentinfo.classid,classname
from studentinfo
right join classon studentinfo.classid = class.classid;

--全外
select studentid,studentname,studentinfo.classid,classname
from studentinfo
left join classon studentinfo.classid = class.classid
union   --合并结果集自动排重
select studentid,studentname,studentinfo.classid,classname
from studentinfo
right join classon studentinfo.classid = class.classid;

3)交叉连接(笛卡尔乘积)

-- 建表举例
CREATE TABLE `daka`(
`dakaiid` int NOT NULL,
`studentid` int NULL DEFAULT NULL,
`riqi` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARYKEY(`dakaiid`) USINGBTREE) ENGINE = InnoDB CHARACTER SET = utf COLLATE=utf8_general_ci 
ROW_FORMAT=Dynamic;
-- ----------------------------
--Recordsofdaka
-- ----------------------------
INSERT INTO `daka` VALUES(1,2011001002,'2011-01-01');
INSERT INTO `daka` VALUES(2,2011001002,'2011-01-02');
INSERT INTO `daka` VALUES(3,2011001003,'2011-01-01');
CREATE TABLE `riqi`(
`riqi` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- --------------------------
-- Recordsofriqi
-- ----------------------------
INSERT INTO `riqi` VALUES('2011-01-01');
INSERT INTO `riqi` VALUES('2011-01-02');
INSERT INTO `riqi` VALUES('2011-01-03')

-- 查询
select StudentName,riqi.riqi,daka.studentid
from studentinfo
cross join riqi
left join daka on studentinfo.StudentID = daka.studentid
and daka.riqi = riqi.riqi;

4)一种特殊的连接:自连接

--自连接:关联查询(关联的是自己,自己关联自己)
select 自己.stuname,组长.stuname
	fromtab_stu 自己 
left join 
	tab_stu 组长
on 自己.zuzhang = 组长.stuid;

9、子查询

  1. 子查询结果为多行一列(可以当作多个值来用(1,2,3,4))
-- 查询存在有85分以上成绩的课程名字
	-- 先查85分以上成绩的课程cno
	SELECT DISTINCT cno from scores where degree > 85;
	-- 根据cno查 cname
	SELECT cs.cno,cs.cname from courses cs where cs.cno in (SELECT DISTINCT cno from scores where degree > 85);

  1. 子查询结果为一个值。(可以作为字段使用)
-- 查询成绩表中分数最高的同学的记录
SELECT * from scores where degree = (SELECT max(degree) from scores);
  1. all子查询

① all可以与=、>、>=、<、<=、<>结合是来使⽤,分别表示等于、⼤于、⼤于等于、 ⼩于、⼩于等于、不等于其中的所有数据。当所有数据都满足才是true,会返回满足所有条件的数据。
② in关键字用于where子句中用来判断查询的表达式是否在多个值的列表中。返回满足in列表中的满足条件的记录。
③ 只要大于其中的所有值才会被显示。

-- 查询选修编号为3-105且成绩高于选修编号为3-245的课程同学的cno,sno,degree
/*
分析:
 第一步:我需要查出编号为3-105的所有的成绩
 第二步:查出课程为3-245的最高成绩
总结:3-105的成绩 要高于 3-245的成绩最大值
*/
-- 先查3-245的最大成绩
SELECT max(degree) from scores where cno='3-245';

SELECT * from scores 
where cno='3-105' 
and degree > (SELECT max(degree) from scores where cno='3-245');

-- 方法二:
-- 查出课程为3-245的所有成绩
SELECT degree from scores where cno='3-245';

SELECT * from scores WHERE cno='3-105' and degree > all(
  SELECT degree from scores where cno='3-245'
);
  1. any/some子查询

any 可以与=、>、>=、<、<=、<>结合起来使⽤,分别表示等于、⼤于、⼤于等于、⼩于、⼩于等于、不等于其中的任何⼀个数据。也就是说只要有任意一个满足就是true。并且显示满足条件的数据。

  1. 使⽤exists 和 not exists ⼦查询

where exist (⼦查询)如果该⼦查询有结果数据(⽆论什么数据,只要⼤于等于1⾏),则就为true,否则就为false
如果内层select返回true则外层select可以返回值,否则就返回空。

-- 查询全部的学生,如果子条件满足的情况下
-- 如果存在年龄大于40的学生,那么就展示全部的学生
SELECT * from student WHERE EXISTS (SELECT * from class where classid=4);

-- 查询全部的学生,如果子条件不满足的情况下
-- 如果存在年龄大于20的学生,那么就不展示全部的学生
SELECT * from student WHERE NOT EXISTS (SELECT * from student where age>20);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值