欢迎光临散文网 会员登陆 & 注册

MySQL数据库简笔(第一篇系列笔记-后续持续上传)

2023-08-26 08:00 作者:是泷泷哟  | 我要投稿

MySQL安装包以及资料(比较全)百度网盘链接:

链接:https://pan.baidu.com/s/1jQdDfUdZqEa6ZOYonTTtdg?pwd=1314 

提取码:1314

Mysql

MySQL在此电脑上是 cmd    实际上在现实中是 c/s 形式的   一个客户端 用户可以操作的可以点击的这种 服务端  就是mysql server 负责给客户端提供服务  

如何在cmd中启动 mysql服务

net stop Mysql    // 关闭mysql服务

net start Mysql  // 启动mysql服务

# 解释一下 在这里大小写其实都可以 都不影响 只要你敲击的是对的就没事了  干就完了#链接MySQL服务
mysql -u 用户(在cmd中是root 这个管理员权限大 牛逼) -p (以用户名 密码的方式去登陆 接下来要输入mysql密码)
Enter password : 123456  

三种关闭MySQL的方式

\q       quit    exit  #这三种方式都能退出 mysql  还有一种暴力的方式 直接把终端关了

cls  清空屏幕

添加data文件 就是保存数据的文件夹

cd C:\Program Files\MySQL\MySQL Server 5.7\bin   # 先移动到安装MySQL的文件夹
mysqld --initialize-insecure --user=root   #输入这样一行命令 甭管是啥意思 输入就完了 输入完成回车后 会生成一个data文件 干就完了# 显示所有的仓库
show databases;     # 后面的分号不要忘了 #创建仓库
create database student;  # create就是创建的意思 database 就不用加复数形式了  最后跟上个表名
#创建仓库比较有逼格的写法
create database if not exists student;   # if not exists 简单来说就是查看这个仓库是不是存在 不存在的话就创建一个

删除数据库

drop database student; # 删除指定的数据库
#更加高级的写法
drop database if exists student; # 如果存在即删除

查看创建student仓库的语句

mysql>  show create database student;
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| student  | CREATE DATABASE `student` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

#从这里可以看到仓库是怎么创建的 语句是什么样的

创建数据库并且指定字符

create database if not exists student charset=gbk   #也可以是utf8
#在学习练习的时候使用gbk  但是上传到服务器的时候 记得使用utf8 这是全世界公认的中文字符编码

修改数据库字符编码

alter database teacher charset=gbk
#alter相当于是一个更新的操作  修改字符编码

引用数据库并且查看是否创建了表

mysql> use longlong_school;
Database changed    #指定了接下来用哪个数据库

show tables; #查看该数据库有多少个表

创建一个表

mysql> create table student(   #创建表 后面用括号接上然后回车 这样描写看的清楚些
   -> id int,      #字段的名字   后面的是数据类型  后面用“,”跟上回车直接
   -> name varchar(30),    #这里的字符类型是 varchar 括号里面的是长度
   -> age int  #最后你没有字段可写不用写括号
   -> );   #最后用分号来结尾

创建一个表(B格)

create table if not exists teacher(   #查看是不是有这个表
   -> id int auto_increment primary key comment '主键id',  
   #  auto_increment 自动增长
   #  primary key 主键
   #  comment '主键id'  # 前面的英文单词是注释的意思  后面的是注释的内容
   —> name varchar(30) not null    #这个字段不为空
name varchar(30) not null comment '老师的名字',      
phone varchar(20) comment '电话号码',  
address varchar(100) default '暂时未知' comment '住址'  #default 默认值
)engine=innodb;  #最后一个逼格最牛逼 是指定数据库的引擎


# 插入一个注册表可能产生的一些问题
# age int[varchar(10)] default "没说就是永远的19岁" comment "bilibili大学学生的年龄"
  # 此情况 default后面的字符文字和该定义的字符格式产生冲突问题 所以可以更改的有两种情况
   #  1 将字符类型 int 改为 varchar 这样就可以直接完美兼容
   #  2 将default这个累赘的东西直接删除 我们在comment后面可以对该字段进行一个描述 避免出现问题

注意:表名千万不要取 long int varchar 这样的名字  会报错

补充:说出来创建表时的最大隐患问题   当你定义字符类型为 int(11) 时 你输入的只能是10位的数据 估摸着 它把11 位的数据 分成了 -2的10次方 到 2的10次方   所以当你想要输入11位的电话号码时 最好输入int(12)  相反字符串就没有这样的顾虑  因为它没有正负数这个概念     当你定义的这个数不可能为负数时 不妨试试unit类型

查看表的结构比较好看的那种

desc teacher;  #输入这行命令可以查看表的结构
+---------+--------------+------+-----+----------+----------------+
| Field   | Type         | Null | Key | Default  | Extra          |
+---------+--------------+------+-----+----------+----------------+
| id      | int(11)      | NO   | PRI | NULL     | auto_increment |
| name    | varchar(30)  | NO   |     | NULL     |                |
| phone   | varchar(20)  | YES  |     | NULL     |                |
| address | varchar(100) | YES  |     | 暂时未知  |                |
+---------+--------------+------+-----+----------+----------------+

修改表

# 具体大概的流程是 进行什么样的操作 操作类型 操作的具体对象 进行怎么样的具体操作 后面的是操作改变的

alter table fuck add age varchar(20) not null; # 加上add你就可以在最后添加内容
alter table fuck add gender varchar(1) after name;  # 指定添加到谁的后面  after指定 后面的那个就是字段
alter table fuck add fuck varchar(1) first;  # 这种就是直接放在最前面
alter table fuck drop fuck; # 删除指定的字段    
alter table fuck change age age int(3);  # 修改指定的字段  需要跟上关键字 change 咱解释下后面为什么会有两个age 一个是原来的字段名 后面的是修改后的名字 你可以随便改后面的名字 后面的数据类型你也可以自己去修改     这个是修改字段类型和字段名
alter table fuck modify age varchar(3);   # 只修改字段的类型
# 这里说一个问题 假如你修改字段类型 它后面还有比如不为空 就是 not null default 后面也标注了默认值  你要是不加上它会直接全部删的一干二净  很坑
alter table fuck rename to longlong;   # 修改表的名字

插入数据

insert into fuck_to (id, name, gender, age, phone, address) values(1, 'longlong', '男', '19', '15823735335', '武汉');    #表中插入数据 insert into  '插入' 操作的对象 (要添加的字段名称) values(添加的具体的数据 ——>注意数据类型要与上述字段数据类型一致)
# 查看插入的数据  select * from  fuck_to   查询fuck_to表上的所有的数据 并且显示出来
# 要是写入的数据是按照表的完整的来的 你不妨写一下如下这一行
insert into fuck_to value(~~~~~) #后面跟上一堆的东西 不过要注意的是 你写如入的数据类型记得和上面的定义时候的数据类型一摸一样
#一次性插入多行数据
insert into fuck_to values(1, 'longlong', '男', '19', '15828779335', '武汉'),(1, 'longlong', '男', '19', '158234788755', '武汉'); #大致是这样的 用逗号可以实现插入多行数据

结合上面的数据 做出解释 id定义为 自动增长 所以id可以写成 null  但是有些定义为 not null 这样的就必须要阐述其值

删除数据

delete from fuck where id=4; #删除数据 delete是删除 where 删谁? id=4 是指定要删除的东西
delete from fuck where name="Tom" #假设tom有三个的话 这一条语句会一次性直接删除三条数据
#所以我们要注意 删除的时候删除唯一的东西就行 比如说id这一类东西是唯一的 因为设置了~~~
delete from fuck where age>30;  #会把age大于30的删除
delete from fuck; #删除该数据表中所有的数据 不建议要遍历 太慢了
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
truncate table fuck;        #给你创建一个原模原样的表 不过表中的数据都被清空了 相当于骨架子还给你留着 不过里面的东西都干没了

# 小细节 你如果用delete 来清空表的话 它里面的id会一直延续下去 比如你之前插入了四行 用delete删除了之后 再重新插入数据 id会从5开始 但是你用truncate将所有的数据内容删除后 id会重新从1开始

更新表

update fuck set name="泷泷" where id=1;    #update更新 set后面是你要更改的东西   where 后面是条件 你该的对象的东西     你要注意where这一类东西 记住你想更新一条数据 就要注意where后面的条件
update fuck set name="泷泷",phone="13~~~" where id=1;  #where后面的一定要写  注意条件的把控  
update fuck set address="上海" where id=3 or id=2  #这句话的意思就是可以把id为3或者id为2的数据改成上海 不过好像都改成上海了
update fuck set address="荆门" where name="泷泷" or name="梦梦";  #更改数据条件需写清楚 不要搞错
----+------+--------+-----+-------------+---------+
| id | name | gender | age | phone       | address |
+----+------+--------+-----+-------------+---------+
|  1 | 泷泷 | 男     | 19  | 15828788735 | 荆门    |
|  2 | 小超 | 男     | 19  | 18338778979 | 贵州    |
|  3 | 梦梦 | 女     | 19  | 15828787835 | 荆门    |
+----+------+--------+-----+-------------+---------+

SQL注入攻击

结合上面的这样的语句 我们知道 where 语句不写的话 会将所有数据值都进行更改
黑客就是利用这一特性 用脚本将你所有的数据进行更改

查询数据

select * from fuck_to(表名); # 这样的查询会把表中所有的数据显示出来  当然哈,你所要查询的表中应该是有数据的 不应该是空的 所以一切的前提是  create table 创建了表的结果  insert into ~~~~ values ~~~~~ 插入了表中的基本数据后 你才可以显示数据
select id,name,age from fuck_to(表名); # 你可以抽取几个感兴趣想要查询的关键字 然后将它输出出来 中间用"," 分隔开来

注意事项:

mysql> show variables like 'character_set_%';
+--------------------------+---------------------------------------------------------+|
Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | gbk                                                     |
| character_set_connection | gbk                                                     |
| character_set_database   | gbk                                                     |
| character_set_filesystem | binary                                                  |
| character_set_results    | gbk                                                     |
| character_set_server     | latin1                                                  |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
#  在练习的时候 我们使用的终端环境是gbk格式  但是要真正在企业当中去用的话 是utf-8 这样的中文国际编码
#  需要注意的是 当出现中文乱码的时候 要查看编码是不是对的 就是到底是gbk字符格式还是utf-8的格式 是否与当前操作环境相符

int 类型的大小 以及实际操作时候的注意事项

smallint unsigned   #  smallint 两个字节大小   unsigned 无符号

TINYINT1 Bytes(-128,127)(0,255)小整数值SMALLINT2 Bytes(-32 768,32 767)(0,65 535)大整数值MEDIUMINT3 Bytes(-8 388 608,8 388 607)(0,16 777 215)大整数值INT或INTEGER4 Bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值BIGINT8 Bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值FLOAT4 Bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值DOUBLE8 Bytes(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值

浮点型

----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| number_1 | float(3,1)  | YES  |     | NULL    |       |
| number_2 | double(5,2) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

float
double
#前面的是总长度  后面的是小数长度   加入你插入的数超过了规定的小数长度 那么数据库就会采取四舍五入的方式  比如你输入 2.98 根据四舍五入后  结果就是3.0这个数
# 会有丢失精度的问题  存钱存一些关键的数据不会被使用

定点数

decimal  # 不会四舍五入    小数跟整数是分开存的  可以用来存钱   也支持无符号

字符串

varchar # 变长字符 可以回收后面你没有用到的空间
char # 定长字符  
text # 长文本数据  比如你博客里面的长文章 就可以使用这个存储

布尔类型

boolean # true false  保存真假

枚举类型

gender enum('man','woman','?','nothing','it')
+--------+----------------------------------------+------+-----+---------+-------+
| Field  | Type                                   | Null | Key | Default | Extra |
+--------+----------------------------------------+------+-----+---------+-------+
| gender | enum('man','woman','?','nothing','it') | YES  |     | NULL    |       |
+--------+----------------------------------------+------+-----+---------+-------+
# 枚举类型就是你只能取里面的这几个数据   不能取其他数据 规定死了
# 别看它显示的时候是字符串 其实存的时候是 1 2 3 4 这样的数
mysql> insert into t_5 values(2);
+--------+
| gender |
+--------+
| ?      |
| woman  |
+--------+
# 我们存入2 的时候它具体显示的是 woman  根据枚举的排序来的 这样更加节省空间
# 这样存入数据也是枚举的另类存储方式


# 枚举类型的速度快 节省空间 限制数据  把那种不要脸的数据 直接用枚举类型就可以解决

set 集合类型

#比如你在b站上选择你喜欢的标签 用什么来存取 当然是用set啦
hobby set('哲学','经济学','文学','IT','数学','美学')  
+-------+------------------------------------------------+------+-----+---------+-------+
| Field | Type                                           | Null | Key | Default | Extra |
+-------+------------------------------------------------+------+-----+---------+-------+
| hobby | set('哲学','经济学','文学','IT','数学','美学')   | YES  |     | NULL    |       |
+-------+------------------------------------------------+------+-----+---------+-------+

# insert into t_6 values('IT','经济学');   错误样例 我们要一次性存入数据 而不是分成两个字符串形式
# 正确的方式
mysql> insert into t_6 values('IT,经济学');  
# 输入的顺序无所谓 最后会按照set里面的内容来重新排序

补充:你可以看作是 enum 单选  set 多选

时间日期类型

最好每张表单都有一个时间类型  记录代码上传 或者修改的时间
实际使用的时候 datetime 就可以 这个比较完整 显示的清楚些

# 时间这地方还有一点补充的地方
## 在用户进行配置的时候会有一种假象 我输入的时候自动填充时间或者说每次更新的时候数据表也自动更新时间

类型大小 ( bytes)范围格式用途DATE31000-01-01/9999-12-31YYYY-MM-DD日期值TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间YEAR11901/2155YYYY年份值DATETIME8'1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'YYYY-MM-DD hh:mm:ss混合日期和时间值TIMESTAMP4'1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYY-MM-DD hh:mm:ss混合日期和时间值,时间戳+-------------+----------+------+-----+---------+-------+
| Field       | Type     | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| createdTime | datetime | YES  |     | NULL    |       |
+-------------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into t_7 values('2023-06-05 16:16:00');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t_7;
+---------------------+
| createdTime         |
+---------------------+
| 2023-06-05 16:16:00 |
+---------------------+
1 row in set (0.00 sec)

# 在实际开发过程中 不会让我们手动插入数据 一般是通过java或者其他语言插入

列属性完整性

列属性问题

auto_increment # 自增长有一个弊端 当你有四行数据的时候 你将其中的第三行数据删除后
# 你再想插入id为 3 的数据它就会报错
# 有了auto_increment 必须有 PRI 但是有PRI 不一定要有 auto_increment

主键的作用以及企业用途

绝对唯一且能够确认数据的唯一性不可重复性被我们称为主键
# 不可能为重复的 一个表只能有一个主键  这个主键也可能由很多个字段组成

组合键(复合键)

极端情况 两个字段弄成一个主键

唯一键 *

在这单个表里面是唯一的 不会在其他表中看到克隆版
# 可以为空 但是必须是唯一的
unique # 唯一键 像电话号码和身份证这种的 不可能为重复的 唯一 字如其意

phone varchar(20) unique  # 设置唯一键
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| phone | varchar(20) | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+

#  删除唯一键
alter table t_11 drop index phone  # index 后面指明唯一键的名称

外键  (删除会有点东西)

  1. ## 就是两个表之间有相同的内容 比如学生表中的学生姓名  应该跟是他共有相同的字段的干饭表 也有学生的姓名
    ###  也有主表跟从表的概念
    foreign key (外键字段) references 主表(主键字段);  #外键字段的来自主键哪个字段的干活
    # foreign key  : 在从表要设置的外键的字段  
    # (外键字段) : 和主表对应的字段
    # references  来自哪个表

    ### 十分重要的一件事  就是单独指认 外键 需要单独写一行
     ### 十分重要的一件事  就是单独指认 外键 需要单独写一行
    ### 十分重要的一件事  就是单独指认 外键 需要单独写一行


    ### 后期修改字段
    # alter table eatery_2(表名) add foreign key (外键字段) references 主表(主键字段);

    #       创建一个主表    在这两个表的情况下 主表的主键字段是外表的外键引入
    create table stu(
       -> stuid int(4) primary key,
       -> name varchar(20)
       -> );
       
       
    #       从表  
    create table eatfuck(
       -> id int primary key,
       -> money decimal(10,4),
       -> stuid int(4),    # 创建和主表相同的字段  用于链接  当然名字可以不一样 不过里面数据的格式和数据的内容应该是重复的
       -> foreign key (stuid) references stu(stuid)  # 单独起一行 用于声明外键 若和字段写一行 会报错
       -> );

    #  最后的效果
    ## 如果Key是MUL, 那么该列的值可以重复 (网上官方的)   就和access数据库的可重复一样
    +-------+---------------+------+-----+---------+-------+
    | Field | Type          | Null | Key | Default | Extra |
    +-------+---------------+------+-----+---------+-------+
    | id    | int(11)       | NO   | PRI | NULL    |       |
    | money | decimal(10,4) | YES  |     | NULL    |       |
    | stuid | int(4)        | YES  | MUL | NULL    |       |
    +-------+---------------+------+-----+---------+-------+


    #  删除外键:需要删除表生成的别名  
    ## 以下是查询了eatfuck 这个表的创建方式之后反馈的
    | eatfuck | CREATE TABLE `eatfuck` (
     `id` int(11) NOT NULL,
     `money` decimal(10,4) DEFAULT NULL,
     `stuid` int(4) DEFAULT NULL,  PRIMARY KEY (`id`),  KEY `stuid` (`stuid`),  CONSTRAINT `eatfuck_ibfk_1` FOREIGN KEY (`stuid`) REFERENCES `stu` (`stuid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk |


    eatfuck_ibfk_1 # 是我们删除外键是要删除的字段 不是stuid哦 ######

    # 删除操作
    alter table eatfuck drop foreign key eatfuck_ibfk_1; # key 后面的是当前外键从表生成的别名字段


    ### 外键的三种使用操作

    置空: #用于外键删除数据    你删除主表的数据 从表的数据还是会保存 不过id变成了null而已 就和食堂打饭一样的 你不可能删除了用户之后你的钱还一并删除吧  (主表相当于用户 你主表用户删除了 从表的用户id 不会直接被干掉 就像你的钱财一样 你钱财的用户名都被删除了 你钱还能存在? 所以直接指认id为空  你money 这个字段的数据还在  小钱钱就保住了)

    级联: #用于外键更新数据  属于那种一荣俱荣一损俱损的 主表更新了数据 从表有关联的也会一并更新
    # 大哥动了 小弟也要跟着行动  差不多是这个意思


foreign key(stuId) references stu(stuId) on delete set null on update cascade

置空操作

on delete set null # 设置置空

级联操作

on update cascade # 设置级联

联合操作  

### 级联
select * from stu;
+-------+-------+
| stuId | name  |
+-------+-------+
|     1 | tom   |
|     2 | jerry |
+-------+-------+

select * from eatery;                  
+----+----------+-------+
| id | money    | stuId |
+----+----------+-------+
|  1 |  20.5000 |     2 |
|  2 |  78.6000 |     1 |
|  3 |  99.9000 |     2 |
|  4 | 748.4000 |     1 |
|  5 | 748.4000 |     2 |
+----+----------+-------+

### 将主表的id进行更改后 发现从表 进行外键关联的这个表 相对应的数据也进行了更改
update stu set stuId='4' where name='tom';  

select * from stu;
+-------+-------+
| stuId | name  |
+-------+-------+
|     2 | jerry |
|     4 | tom   |
+-------+-------+

select * from eatery;                  
+----+----------+-------+
| id | money    | stuId |
+----+----------+-------+
|  1 |  20.5000 |     2 |
|  2 |  78.6000 |     4 |
|  3 |  99.9000 |     2 |
|  4 | 748.4000 |     4 |
|  5 | 748.4000 |     2 |
+----+----------+-------+

# 只要进行了外键关联 级联就是牵一发动全身 多用于更新操作 以上案例就可以体现出来

### 置空
# 删除id为2的数据 我们来看看外键关联表会怎么样
delete from stu where  stuId='2';

select * from eatery;
+----+----------+-------+
| id | money    | stuId |
+----+----------+-------+
|  1 |  20.5000 |  NULL |
|  2 |  78.6000 |     4 |
|  3 |  99.9000 |  NULL |
|  4 | 748.4000 |     4 |
|  5 | 748.4000 |  NULL |
+----+----------+-------+

# 删除就是置空 更新就是级联 大致可以这样来分  前提是你在制作外键从表的时候记得
foreign key(stuId) references stu(stuId) on delete set null on update cascade

单表查询

select

select
#select是一个常见的术语,它表示从多个选项中选择一个来执行的操作。例如,当我们在计算机程序中使用select语句时,可以根据条件的不同,选择执行不同的代码块。

select 'fuck your' as bitch;
+-----------+
| bitch     |
+-----------+
| fuck your |
+-----------+       ##  as 后面的是别名    as 也可以省略,但是为了装逼我们保留下来

select 2*7;
+-----+
| 2*7 |
+-----+
|  14 |
+-----+

from

from
#用于介绍某个东西的来源、起始点或者来源地
## 一般使用的时候后面跟上表名

select * from t1;
# 后面跟上来自什么表就行

select * from t1,t2;
# 跟上两个表会有化学反应

#### 笛卡尔集
# 当两个表查询时,规则是:从第一张表中,取出一行和第二张表的每一行进行组合,返回结果【含有两张表的所有列】

# 简单粗暴来说就是杂乱组合 第一张表每一行数据 都要带上第二张表每行     ###  就是特么矩阵相乘

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tom   |
|    2 | jerry |
+------+-------+
2 rows in set (0.00 sec)

mysql> select * from t2;
+-------+-------+
| scor1 | scor2 |
+-------+-------+
|    98 |    99 |
|    47 |    78 |
+-------+-------+
2 rows in set (0.00 sec)

mysql> select * from t1,t2;
+------+-------+-------+-------+
| id   | name  | scor1 | scor2 |
+------+-------+-------+-------+
|    1 | tom   |    98 |    99 |
|    2 | jerry |    98 |    99 |
|    1 | tom   |    47 |    78 |
|    2 | jerry |    47 |    78 |
+------+-------+-------+-------+

dual

#在MySQL中,dual 是一个虚拟的表,通常用于在查询中保证至少有一行结果返回。dual 表只有一列和一行,可以用于测试、健康检查和生成临时数据等场景。

例如,在查询中使用 dual 虚拟表可以返回当前日期和时间:

SQL
SELECT NOW() FROM dual;
上述查询将返回当前的日期和时间。由于 dual 表只有一行,因此可以确保至少有一行结果返回。

需要注意的是,在某些MySQL版本中,dual 可能不是必须的。在这些版本中,可以直接使用常量或表名来代替 dual,例如:

SQL
SELECT NOW();
上述查询在这些版本的MySQL中同样能够返回当前的日期和时间。

select now() from dual;
+---------------------+
| now()               |
+---------------------+
| 2023-06-16 17:59:48 |
+---------------------+

select 2*7 as res from dual;  # 完整的写法是这样  不过可以省略不写  dual只是个虚拟的表 用于测试使用

where

where    # 一条一条的去筛选 从表那去筛选
#后面只需要跟上指定的条件就行 比如> < >= <=  and or not 啥啥啥的

select * from t2 where age>=18;  
+------+------+
| id   | age  |
+------+------+
|    1 |   18 |
|    2 |   23 |
+------+------+

select * from longlong where name='泷泷' or  name='梦梦';
+----+------+-----+-------------+--------------------------------------------------+
| id | name | age | phone       | address                                          |
+----+------+-----+-------------+--------------------------------------------------+
|  1 | 泷泷 |  19 | 15828758885 | 湖北省鄂州市华容区武汉职业技术学院(葛店校区)         |
|  2 | 梦梦 |  19 | 17727527225 | 湖北省鄂州市鄂城区凤凰街道77号鄂州职业大学东校区     |
+----+------+-----+-------------+--------------------------------------------------+

and # 同理 加上and 在查询成分复杂的数据的时候 可以更好的细分差别

in

in
# 包括   还有一种not in 不包括

select * from longlong where name in('泷泷','梦梦');      
+----+------+-----+-------------+--------------------------------------------------+
| id | name | age | phone       | address                                          |
+----+------+-----+-------------+--------------------------------------------------+
|  1 | 泷泷 |  19 | 158272877835 | 湖北省鄂州市华容区武汉职业技术学院(葛店校区)         |
|  2 | 梦梦 |  19 | 177712875585 | 湖北省鄂州市鄂城区凤凰街道77号鄂州职业大学东校区     |
+----+------+-----+-------------+--------------------------------------------------+

# 跟python的in差不多一个理

select * from longlong where name in('泷泷','梦梦') or age='18';   # 可以组合使用 嘿嘿
+----+----------+-----+-------------+--------------------------------------------------+
| id | name     | age | phone       | address                                          |
+----+----------+-----+-------------+--------------------------------------------------+
|  1 | 泷泷     |  19 | 15822222335 | 湖北省鄂州市华容区武汉职业技术学院(葛店校区)         |
|  2 | 梦梦     |  19 | 17771507854 | 湖北省鄂州市鄂城区凤凰街道77号鄂州职业大学东校区     |
|  3 | 云翔泷梦 |  18 | 1582787545 | 湖北省荆门市沙洋县                   |
+----+----------+-----+-------------+--------------------------------------------------+

between ... and ...

# 第一种写法  这种比较简单粗暴 没有逼格
select * from t3 where age>=15 and age<25;
+------+------+
| id   | age  |
+------+------+
|    1 |   18 |
|    2 |   19 |
|    3 |   15 |
|    4 |   21 |
+------+------+

# 第二种写法   不过这是一个闭区间范围
select * from t3 where age between 15 and 21;
+------+------+
| id   | age  |
+------+------+
|    1 |   18 |
|    2 |   19 |
|    3 |   15 |
|    4 |   21 |
+------+------+

is null  

# 对这里的写法是 is null   is 在这里就是表示有没有的意思

select * from t3 where age is null;   # 查询为空
+------+------+
| id   | age  |
+------+------+
|    5 | NULL |
+------+------+

select * from t3 where age is not null;  # 查询不为空
+------+------+
| id   | age  |
+------+------+
|    1 |   18 |
|    2 |   19 |
|    3 |   15 |
|    4 |   21 |
|    5 |   34 |
+------+------+

聚合函数

select * from score ;
+------+------+---------+---------+
| id   | math | chinese | english |
+------+------+---------+---------+
|    1 |   98 |      99 |     100 |
|    2 |   87 |      79 |      90 |
|    2 |   87 |      79 |      90 |
+------+------+---------+---------+

select sum(math) from score;   # 求出math这一列的和      
+-----------+
| sum(math) |
+-----------+
|       272 |
+-----------+

select max(math) from score; # 最大数
select min(math) from score; # 最小数
select avg(math) from score; # 平均
select count(math) from score;  # 统计

like

# 模糊查询
select * from student where name like '张%';
+----+--------+--------+------+-------------+
| id | name   | gender | age  | phone       |
+----+--------+--------+------+-------------+
|  4 | 张三   | 0      |   15 | 15454797999 |
|  5 | 张八   | 0      |   17 | 14876467998 |
|  7 | 张跃进 | 0      |   18 | 14177378373 |
+----+--------+--------+------+-------------+
# 其中like 后面是条件    重点介绍下 % 变相于有些语言中的* 等于一个或者多个字符#

select * from student where name like '张_';
+----+------+--------+------+-------------+
| id | name | gender | age  | phone       |
+----+------+--------+------+-------------+
|  4 | 张三 | 0      |   15 | 15454797999 |
|  5 | 张八 | 0      |   17 | 14876467998 |
+----+------+--------+------+-------------+
# _  这个下划线代表一个字符 #

以上两种字符结合着头脑可以设计一些条件筛选出来  模糊查询对条件的筛选很有效

order by

desc #表示降序
asc #表示升序
# order by 排序查询 age 设置的条件字段  
mysql> select * from info order by age desc;  
+----+------+--------+---------+
| id | age  | gender | address |
+----+------+--------+---------+
|  3 |   26 | 女     | 北京    |
|  1 |   25 | 男     | 上海    |
|  6 |   24 | 女     | 深圳    |
|  2 |   23 | 女     | 上海    |
|  4 |   23 | 男     | 北京    |
|  5 |   21 | 男     | 上海    |
+----+------+--------+---------+


group by 分组查询

select avg(age) as '年龄' ,gender as '性别' from info group by gender;
+---------+------+
| 年龄    | 性别  |
| 23.0000 | 男   |
| 24.5000 | 女   |
+---------+------+

# 解释一下上面的语句  查找年龄的平均值  按什么来查呢  就按照group by 后面的那一行条件来查
## group by 后面的可以看作是 分组的条件 就是按照什么为一组  然后输出这个组每个元素的信息(这些信息可能是由很多的数据组成的)

## 后者是你要分组的对象 前者是聚合函数 或者说数据一类

Group_concat()

GROUP_CONCAT(xxx):#是将分组中括号里对应的字符串进行连接.如果分组中括号里的参数xxx有多行,那么就会将这多行的字符串连接,每个字符串之间会有特定的符号进行分隔。
# 简单粗暴来说就是把分组后的数据 挪到一行来显示  就是女性的显示一行 男性的显示一行的那种

select group_concat(name) , gender from student group by gender;
+------------------------------------+--------+
| group_concat(name)                 | gender |
+------------------------------------+--------+
| Tom,longlong,张三,张八,王五,张跃进   | 0      |
| Jerry                              | 1      |
+------------------------------------+--------+

# 比较好玩


# 结合上面两个再次说明一下要想达到分组的目的效果  找准分组的条件 需要分组显示的数据  前者多为聚合函数 或者说 group_concat一类的数据  

having

### 对查询之后的数据进行筛选  (对结果进行筛选)    ## 补:不是对数据库进行筛选哦
#@
SELECT avg(age) as '年龄' ,address as '地区' from info group by address having 年龄 >24
# 以上是对查询之后的结果进行筛选   having后面的字段 与筛选出来的结果字段一一对应
# 意思就是 你as后面是啥 你having后面的条件就是该字段
## 注: 除非你把as后面的字段进行更改 否则就是as改掉后的或者原字段内容
@#
where : 是对数据进行筛选后再查询   就是先判断条件再把满足条件的筛选出来

limit

限定起始位置 默认0开始
select * from info limit 0,3;        
+----+------+--------+---------+
| id | age  | gender | address |
+----+------+--------+---------+
|  1 |   25 | 男     | 上海    |
|  2 |   23 | 女     | 上海    |
|  3 |   26 | 女     | 北京    |
+----+------+--------+---------+

# 查找年龄最大的三个人的信息
select * from info order by age desc limit 3;
+----+------+--------+---------+
| id | age  | gender | address |
+----+------+--------+---------+
|  3 |   26 | 女     | 北京    |
|  1 |   25 | 男     | 上海    |
|  6 |   24 | 女     | 深圳    |
+----+------+--------+---------+
# 以age对查询数据进行降序排列 再对目标截取前三名   limit 后面跟大多数语言一样  从零开始 结束那里是个开区间(0,3) 会取012

distinct all

distinct :  去重   # 解释下all :默认情况下咱们忽略了而已
select distinct address from info;              
+---------+
| address |
+---------+
| 上海    |
| 北京    |
| 深圳    |
+---------+


MySQL数据库简笔(第一篇系列笔记-后续持续上传)的评论 (共 条)

分享到微博请遵守国家法律