首页 > 数据库 >MySQL——个人入门到入土

MySQL——个人入门到入土

时间:2023-09-26 16:45:16浏览次数:50  
标签:入门 level -- player 入土 MySQL where select name

SQL

SQL:结构化查询语言,全称是 Structured Query Language

通常分为四类(括号内为他们的一些关键字):

  • DDL:数据定义语言(create,drop,alter,truncate等)——定义数据库对象(库、表、列这些)
  • DML:数据操作语言(insert,update,delete,call等)——用于CUD(增删改)
  • DQL:数据查询语言(select,where等)——用于查询数据
  • DCL:数据控制语言(grant,revoke等)——定义数据库的访问权限和安全级别,创建用户

通常我们可以使用命令行或者图形化GUI(比如Navicat)来操作数据库,看个人喜好,对于数据的导入导出,非常推荐使用图形化GUI进行操作,看上去更加人性化和直观

请善用Ctrl + F进行查找


基础

  1  -- 以下如无特殊说明,game均指代为你的数据库名字,注意,没有写分号说明这个行不是代码的结束,也就是代码换行了。
  2  -- 查看当前已经存在的数据库
  3  show databases;
  4  ​
  5  ​
  6  #### 创建数据库和表
  7  -- 创建一个新的数据库
  8  create database game;
  9  ​
 10  -- 删除数据库
 11  drop database game;
 12  ​
 13  -- 进入到指定数据库中(创建表必须步骤),然后创建表(player)
 14  use game;
 15  create table player (
 16      id INT,
 17      name VARCHAR(100),
 18      level INT,
 19      exp INT,
 20      gold DECIMAL(10,2)
 21  )
 22  ​
 23  -- 查看表结构
 24  desc player;
 25  ​
 26  -- 修改表结构类型/字段名,新增字段,删除字段,设置默认值
 27  alter table player modify column name varchar(200); # 这里表示修改name的类型为varchar(200),player为你的表名,name表示你要修改类型的字段名
 28  alter table player rename column name to nick_name; # 这里表示把字段名name修改为nick_name
 29  alter table player add column last_login datetime;  # 新增一个字段,名为last_login,类型为datetime
 30  alter table player drop column last_login; # 删除字段last_login
 31  alter table player modify level INT default 1;  # 设置level字段的默认值为1,modify后跟字段名和字段类型(不做任何设置的话,默认值为null)
 32  ​
 33  -- 删除表
 34  drop table player;
 35  ​
 36  #######################################################################
 37  ​
 38  #### 对表内数据进行操作(假设表结构为id,name,level,exp,gold一样,类型你可以参考上面创建表的)
 39  -- 新增数据
 40  insert into player (id, name, level, exp, gold) values (1, '张三', 1, 1, 1); # 标准写法
 41  insert into player values (1, '张三', 1, 1, 1);   # 数据顺序和表结构一致,可以使用这种写法,效果同标准写法
 42  insert into player (id, name) values (1, '张三'); # 只写部分对应的名称,没有列出来的部分会使用设置好的默认值进行填充
 43  ​
 44  insert into player (id, name) values (1, '张三'), (2, '李四'), (1, '王五');   # 你也可以同时插入多条数据,当然它也可以有上面的三种写法
 45  ​
 46  -- 查询数据
 47  select * from player;   # 查询player表的所有列,*代表所有的列,你也可以指定
 48  ​
 49  -- 更新数据(where条件子句在#### 条件子句 目录中)
 50  update player set level = 1 where name = '张三'; # 更新player表的数据,把名字为'张三'对的那行数据的level字段设为1
 51  update player set exp = 1; # 更新player表数据,把表内数据的exp值都设为1
 52  update player set exp = 0, gold = 0; # 同上,这里是同时设置了多个字段的值,也可以用where
 53  ​
 54  -- 删除数据
 55  delete from player where gold = 0; # 删除player表gold为0的全部数据
 56  delete from player;  # 删除表内所有结构
 57  ​
 58  #######################################################################
 59  ​
 60  #### 数据导入和导出
 61  -- 数据导出(执行后会要求你输入密码),文件会保存在你的mysql目录下
 62  mysqldump -u 用户名 -p 数据库名称 表名称(省略则导出整个数据库的所有数据) > 文件名
 63  mysqldump -u root -p game > game.sql # 例子,省略了表名称,导出整个数据库的所有数据到game.sql文件中
 64  ​
 65  -- 数据导入(执行后会要求你输入密码),没有报错就说明成功
 66  mysql -u 用户名 -p 数据库名称 < 文件名
 67  mysql -u root -p game < game.sql # 例子,省略了表名称
 68  ​
 69  #######################################################################
 70  ​
 71  #### 条件子句(where, and, or, not, in等),可以同时使用,优先级为,可以使用括号来提升优先级
 72  -- 可以搭配select,update,insert等一起使用,下面是一些例子
 73  select * from player where level = 1; # 查询表中level字段值等于1的数据
 74  select * from player where level > 1; # 查询表中level字段值大于1的数据
 75  select * from player where level > 1 and level < 5;  # 查询表中level字段值大于1同时小于5的数据
 76  select * from player where level > 1 and level < 5 or exp > 1 and exp < 5;  # 查询表中level字段值大于1同时小于5的,或者exp字段值大于1同时小于5的数据
 77  ​
 78  select * from player where level in (1, 3, 5); # 查询表中level字段值为1或3或5的数据
 79  select * from player where level between 1 and 10; # 查询表中level字段值在1到10的数据,等价于(where level >= 1 and level <= 10)
 80  select * from player where level not in (1, 3, 5); # 查询表中level字段值不为1或3或5的数据
 81  ​
 82  -- 通配符查询(%表示任意个字符,_表示一个字符),你也可以使用正则表达式来实现
 83  select * from player where name like '王%'; # 查询表中name字段值第一个字为'王'的数据
 84  select * from player where name like '%王%'; # 查询表中name字段值含有'王'的数据
 85  select * from player where name like '王_'; # 查询表中name字段值第一个字为'王',且长度为2的数据
 86  select * from player where name like '王__'; # 查询表中name字段值第一个字为'王',且长度为3的数据
 87  ​
 88  -- 正则表达式(常用通配符在下面表格查询)
 89  select * from player where name regexp '^王.$'; # 查询表中name字段值第一个字为'王',且长度为2的数据
 90  select * from player where name regexp '王'; # 查询表中name字段值含有'王'的数据
 91  select * from player where name regexp '[王张]'; # 查询表中name字段值含有'王'或者'张'的数据
 92  select * from player where name regexp '王|张'; # 查询表中name字段值含有'王'或者'张'的数据 
 93 ​ 
 94 -- 练习(表为player,字段名为email) 
 95 # 查找邮件地址以zhangsan开头的玩家 
 96 select * from player where email regexp '^zhangsan'; 
 97 select * from player where email like 'zhangsan%'; 
 98 # 查找邮件地址以a/b/c开头的玩家 
 99 select * from player where email regexp '^[abc]'; 
100 select * from player where email regexp '^[a-c]'; 
101 # 查找邮件地址以new结尾的玩家 
102 select * from player where email regexp 'net$'; 
103 select * from player where email like '%net'; 
104 ​ 
105 -- 查询空值 
106 select * from player where email = null; # 错误写法!!!!!!!! 
107 select * from player where email is null; # 查询player表邮箱为null的数据 
108 select * from player where email is not null; # 查询player表邮箱<不>为null的数据 
109 select * from player where email <=> null; # 等同于(is null),不推荐 
110 select * from player where email = ''; # 查询空字符串,注意查询空字符串和null是不一样的操作 
111 ​ 
112 -- 排序 
113 select * from player order by level asc; # 按player表的level字段升序进行排序(默认为升序,也就是asc可以省略) 
114 select * from player order by level desc; # 按player表的level字段降序进行排序 
115 select * from player order by level desc, exp asc; # 按player表的level字段降序,值相同的情况下,按exp字段进行升序 
116 select * from player order by 5 desc; # 假设level在表里是第5个字段,那么这里等同于按player表的level字段降序进行排序 
117 ​ 
118 -- 聚合函数(AVG平均,COUNT总数,MAX最大值,MIN最小值,SUM求和) 
119 select count(*) from player; # 查询player表中数据的总条数 
120 select avg(level) from player; # 查询player表level字段的平均值 
121 ​ 
122 -- 分组(可以结合聚合使用),看不懂最下面有图可以帮助参考 
123 select level, count(level) from player group by level; # 查询每个等级的玩家数量,相当于统计每个level有多少相同的值 
124 select sex, count(*) from player group by sex; # 查询每个性别有多少条数据 
125 ​ 
126 ​ 
127 select level, count(level) from player group by level having count(level) > 4; # 查询基础上,只看level大于4的数据统计 
128 select level, count(level) from player group by level having count(level) > 4 order by count(level) desc; # 在查询基础上,只看level大于4的数据,同时要求按照level的降序进行展示 
129 ​ 
130 -- 截取字符串 
131 select substr(name, 1, 1), count(substr(name, 1, 1)) from player group by substr(name, 1, 1) having count(substr(name, 1, 1)) >= 5 order by count(substr(name, 1, 1)) desc limit 3, 3; 
132 # substr:用于截取字符串,第一个参数为需要被截取的字符串,第二个参数是开始的位置,第三个是截取的长度 
133 # substr(name, 1, 1),表示截取name的第一个字符,也就是姓氏 
134 # 使用group by对姓氏进行分组,count(substr(name, 1, 1))表示获取姓氏的总条数 
135 # 使用having过滤姓氏数量大于等于五的姓氏 
136 # order by对姓氏总数进行降序排列 
137 # limit:如果只是limit 3,那么就是只返回3条,如果为limit 3, 3,那么就表示从第四个数据开始返回,返回3条(分页查询原理),换句话说,第一个3表示返回的条数,第二个3表示从第几个数据开始返回 
138 ​ 
139 -- distinct去重/union合并(并集)/intersect交集/except差集 
140 select distinct sex from player; # 获取全部玩家性别类型(换句话说就是对sex进行了并集,相同的数据只展示一次,也就是展示全部可能的结果) 
141 ​ 
142 select * from player where level between 1 and 3 
143 union 
144 select * from player where exp between 1 and 3; 
145 # 相当于获取了所有等级1到3和经验1到3的玩家,等同于(where (level between 1 and 3) or (exp between 1 and 3)) 
146 # union会默认去除重复的记录,如果你不需要去除,可以向下面这样写 
147 select * from player where level between 1 and 3 
148 union all 
149 select * from player where exp between 1 and 3; 
150 ​ 
151 select * from player where level between 1 and 3 
152 intersect 
153 select * from player where exp between 1 and 3; 
154 # 获取同时符合两个查询条件的值,等同于(where (level between 1 and 3) and (exp between 1 and 3)) 
155 ​ 
156 select * from player where level between 1 and 3 
157 except 
158 select * from player where exp between 1 and 3; 
159 # 查找等级在1到3,但是经验不在1到3的玩家 
160 ​ 
161 ####################################################################### 
162 ​ 
163 #### 子查询(一个查询结果作为另一个查询结果的条件),as别名,子查询创建新表/插入数据,exists判断是否有查询结构 
164 -- 子查询 
165 select avg(level) from player; # 查询玩家平均等级 
166 select * from player where level > (select avg(level) from player); # 查询大于平均等级的玩家 
167 select level, round((select avg(level) from player)), round((select avg(level) from player)) from player; 
168 # round用于对数据四舍五入到一个整数 
169 # 这条语句是用于查询所有玩家的等级和平均等级的差值,你可以在最下面看图来帮你理解这句话 
170 ​ 
171 -- 别名 
172 select avg(level) as avg_value from player; # 查询玩家平均等级,并且把列名设为avg_value 
173 select level, round((select avg(level) from player)) as average, 
174 round((select avg(level) from player)) as diff 
175 from player; 
176 # 同样这段效果可以在下面找图帮你理解 
177 ​ 
178 -- 子查询创建新表/插入数据 
179 create table new_player select * from player where level < 5; # 查询等级小于5的玩家数据,同时新创建一个表叫做new_player,然后把查询到的数据存入进去(表结构和查询的表结构是一致的) 
180 ​ 
181 insert into new_player select * from player where level between 6 and 10; # 查询玩家等级在6到10之间的数据,然后把他们插入到表new_player中 
182 ​ 
183 -- 判断查询结果是否存在(只会返回0或者1) 
184 select exists (select * from player where level > 100); # 是否存在等级大于100的玩家数据,存在返回1,否则为0 

重点(表关联/索引/视图)、

表关联:

用于查询多个表中的数据,关联表之间必须有相同的字段(一般使用主键和外键关联),有以下三种类型

内连接(inner join):返回两个表中都有的数据

左连接(left join):返回左表中所有的数据

右连接(right join):返回右表中所有的数据

 1  select * from player inner join equip on player.id = equip.player_id;
 2  # player为玩家表,有一个id字段,equip为装备表,有一个player_id字段,他们通过这个字段进行内连接
 3  ​
 4  select * from player left join equip on player.id = equip.player_id;
 5  # player为玩家表,有一个id字段,equip为装备表,有一个player_id字段,他们通过这个字段进行内连接
 6  # 由于是左连接,会返回player的全是数据,然后右边会拼接equip的数据,如果没有和player匹配的equip数据,就用null来填充
 7  ​
 8  select * from player right join equip on player.id = equip.player_id;
 9  # player为玩家表,有一个id字段,equip为装备表,有一个player_id字段,他们通过这个字段进行内连接
10  # 由于是右连接,会返回equip的全是数据,然后右边会拼接player的数据,如果没有和equip匹配的player数据,就用null来填充
11  ​
12  -- 你也可以用where来实现,也可以加别名,效果同内连接,例如
13  select * from player p, equip e where p.id = e.player_id;
14  ​
15  ### 注意:如果不指定查询条件,会产生笛卡尔积(很有可能吃完你的数据库分配的内存导致GG)
16  ### 表关联本质就是笛卡尔积再加上条件过滤实现的

索引:

提高查询效率的数据结果

 1  -- unique:唯一索引,fulltext:全文索引,spatial:空间索引,index_name:索引名称,tbl_name:你的表名,index_col_name:表内一个或者多个字段名(也就是指明我们要对哪些字段进行索引的创建)
 2  -- 通常用于主键或者经常查询的字段(也就是where后面的条件)
 3  create [unique|fulltext|spatial] index index_name on tbl_name (index_col_name,...);
 4  alter table tbl_name add index index_name (index_col_name,...);  # 也可以用这句
 5  ​
 6  -- 假设我们现在有一张表testDemo,里面有一个字段为email,我们对这个字段进行索引的创建
 7  create [unique|fulltext|spatial] index email_index on testDemo (email);
 8  ​
 9  -- 查看表的索引(testDemo可以替换成你的表名)
10  show index from testDemo;
11  ​
12  -- 删除表索引,email_index为索引名称,testDemo为表名称
13  drop index email_index on testDemo;

视图:

动态展示查询的结果(类似于排行榜),这些结果发生变化后(增删改),视图也会动态进行更新

他会把查询的结果保存在一张表里(在view下的表),可以用select进行查询

1  -- 创建视图
2  create view top10 as select * from player order by level desc limit 10; # 创建一个名为top10的视图,保存玩家等级中最高的前十名玩家数据
3  ​
4  -- 修改视图
5  alter view top10 as select * from player order by exp desc limit 10; # 修改名为top10的视图,把他更改为保存玩家经验最高的前十名玩家数据
6  ​
7  -- 删除视图(top10为视图名字)
8  drop view top10

通用字符串

字符含义
. 任意一个字符
^ 开头
$ 结尾
[abc] 其中任意一个字符
[a-z] 范围内的任意一个字符
A|B A或者B

 

分组理解图

子查询理解图

 

标签:入门,level,--,player,入土,MySQL,where,select,name
From: https://www.cnblogs.com/MorningMaple/p/17729907.html

相关文章

  • LINUX第一天常用命令入门
    Linux命令初体验su命令  作用:用于切换系统不同的用户。 #不带-表示直切换到改用户不加载用户的环境变量#root用户切换到普通不用输入密码[colorfulroot~]#sujack[colorfuljack/root]$#短横线-表示切换用户且加载该用户的环境变量,且进入该用户家目录[yuchao......
  • MySQL正则表达式:模式匹配、中文匹配、替换、提取字符串
    在MySQL中,使用REGEXP或RLIKE操作符进行正则表达式匹配,而使用NOTREGEXP或NOTRLIKE操作符进行不匹配。一些常用的MySQL正则表达式语法:匹配字符:.:匹配任意字符(除了换行符)。[]:匹配方括号中的任意字符。[^]:匹配不在方括号中的任意字符。匹配重复:*:匹配零个或多个前面的字符。+:匹配一个......
  • 网安工具 | Windows便携式渗透测试环境PentestBox入门到进阶使用指南
    [点击......
  • MySQL主从复制实践
    MySQL主从复制实践多个数据库间主从复制与读写分离的模型​ 在一主多从的数据库体系中,多个从服务器采用异步的方式更新主数据库的变化;业务服务器在执行写或者相关修改数据库的操作是在主服务器上进行的,读操作则是在各从服务器上进行​ Mysql主从复制的实现原理图大致如下​......
  • MySQL配置文件
    /etc/my.cnf默认配置#Foradviceonhowtochangesettingspleasesee#http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html[mysqld]##Removeleading#andsettotheamountofRAMforthemostimportantdata#cacheinMySQL.Start......
  • Mysql使用 jemalloc 内存分配器
    /usr/lib64/libjemalloc.so是一个动态链接库文件,它包含了jemalloc内存分配器的实现。jemalloc是一个通用的内存分配器,旨在为多线程应用程序提供优秀的性能。它通常被用在需要高效内存管理的应用程序中,如数据库服务器、Web服务器等。安装库文件这个库文件一般是通过系统的包......
  • 专为小白打造—Kafka一篇文章从入门到入土
    一、什么是KafkaMQ消息队列作为最常用的中间件之一,其主要特性有:解耦、异步、限流/削峰。Kafka和传统的消息系统(也称作消息中间件)都具备系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性等功能。与此同时,Kafka还提供了大多数消息系统难以实现的消息顺序性保......
  • Linux系统之安装MySQL8.0版本
    一、MySQL介绍1.1MySQL简介MySQL8.0是最新版本的MySQL数据库管理系统,是一种关系型数据库管理系统,由Oracle公司开发和维护。MySQL8.0带来了一系列新特性,包括多个性能提升,更好的安全性和扩展性,以及新的管理功能。1.2MySQL特点更好的性能:MySQL8.0提供了对于大型查......
  • Windows 安装并配置 MySQL 5.7
    Windows安装并配置MySQL5.7 Windows下安装MySQL有两种方式:下载安装包,根据向导提示一步步安装,不需要什么配置,比较简单下载压缩包,通过命令来安装和配置本文介绍第二种安装方法,使用的MySQL版本为5.7.38假设你已经下载了MySQL压缩文件安装包(官网下载地址:https://www.mysql.......
  • mysql 获取最近6个月的年月
      @s< 5 控制多少个月  SELECT DATE_FORMAT(DATE_SUB(CURDATE(),INTERVAL@s:=@s+1MONTH),'%Y-%m')AS`mon` FROM mysql.help_topic, (SELECT@s:=-1)temp WHERE @s<5 ORDERBYmon......