赞
踩
?? 作者主页:不吃西红柿
**?? 简介:**CSDN博客专家??、信息技术智库公号作者 简历模板、PPT模板、学习资料、面试题库、技术互助【关注我,都给你】
??欢迎点赞 ?? 收藏 留言??
?? 耗时1年整理,硬核文章目录:https://t.1yb.co/zHJ
目录
SQL ( Structure query language ) 结构化查询语言
数据库(Database)就是按照数据结构来组织,存储和管理数据的仓库 专业的数据库是专门对数据进行创建,访问,管理,搜索等操作的软件,比起我们自己用文件读写的方式对象数据进行管理更加的方便,快速,安全
对数据进行持久化的保存
方便数据的存储和查询,速度快,安全,方便
可以处理并发访问
更加安全的权限管理访问机制
数据库分两大类,一类是 关系型数据库。另一类叫做 非关系型数据库。
1.下载安装mysql
brew install mysql@5.7
如果看到以下界面则表示已经下载安装成功
2.启动mysql mysql.server start
3.关闭mysql mysql.server stop
4.登录mysql mysql -u root -p
1. 在MySQL官网 http://dev.mysql.com/downloads/mysql/ 上面下载ZIP安装包(第二个:Windows (x86, 64-
bit), ZIP Archive)。
2. 下载完成后解压,将其放到想要安装的目录下。
例如:D:MySQL5.7mysql-5.7.17-winx64
3. 新建一个my.ini配置文件,原始的my-default.ini配置文件只是个模版,不要在里面改动。 my.ini的内容如下:
[mysql] default-character-set=utf8
[mysqld] port = 3306 basedir=D:MySQL5.7mysql-5.7.17-winx64 datadir=D:MySQL5.7mysql-5.7.17- winx64data max_connections=200 character-set-server=utf8 default-storage-engine=INNODB explicit_defaults_for_timestamp=true
4. 在安装路径下新建一个空的data文件夹。
5. 以管理员身份运行cmd,进入bin目录,执行 mysqld --initialize-insecure --user=mysql 命令。不进行这一
步,安装完成之后无法启动服务。
6. 依然在管理员cmd窗口的bin目录下,执行 mysqld install 命令安装。完成后会提示安装成功。
7. 依然在管理员cmd窗口的bin目录下,执行 net start mysql 命令启动MySQL服务。
8. 修改环境变量,添加"D:MySQL5.7mysql-5.7.17-winx64in"。
9. 在普通cmd窗口中,进入bin目录,执行 mysql -u root -p 命令,默认没有密码,回车进入。
认识库,表的概念和关系 mysql的基本命令: 登录,查看库,选择库,查看表, 创建库,创建表,添加数据,查询数据。
mysql -u root -p ? ? MacBook-Pro:~ yc$ mysql -u root -p Enter password: Welcome to the MySQL monitor.? Commands end with ; or g. Your MySQL connection id is 4 Server version: 5.7.28 Homebrew Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql>
库==>数据库==>就像文件夹一样,库里面可以存储很多个表)
show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
±-------------------+
4 rows in set (0.00 sec)
use mysql; 查看当前库中的所有数据表
show tables;
±--------------------------+
| Tables_in_mysql |
# 查看user表中的所有数据的所有字段 select * from user;
# 查看 user表中的所有数据的 host和user字段列 select host,user from user;
±----------±--------------+
| host | user |
±----------±--------------+
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
±----------±--------------+
库就像是文件夹,库中可以有很多个表 表就像是我们的excel表格文件一样 每一个表中都可以存储很多数据
mysql中可以有很多不同的库,库中可以有很多不同的表 表中可以定义不同的列(字段), 表中可以根据结构去存储很多的数据
create database 库名 default charset=utf8; 创建库
±--------------------------+
| columns_priv |
| db |
| engine_cost |
…
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
±--------------------------+
31 rows in set (0.00 sec)
create database tlxy default charset=utf8;
– Query OK, 1 row affected (0.01 sec)
show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| tlxy |
±-------------------+
5 rows in set (0.00 sec)
– 进入库 use tlxy;
create table 表名( 字段名 类型 字段约束, 字段名 类型 字段约束, 字段名 类型 字段约束, )engine=innodb default
charset=utf8;
– 创建用户表 create table user(
name varchar(20),
age int,
sex char(1)
)engine=innodb default charset=utf8;
– Query OK, 0 rows affected (0.16 sec)
– 向 user 表中 添加 name,age,sex 数据
insert into user(name,age,sex) values(‘admin’,26,‘男’); – Query OK, 1 row affected (0.00 sec)
insert into user(name,age,sex) values(‘张三’,22,‘女’);
查看表中的数据
select * from user; ±-------±-----±-----+ |name |age |sex | ±-------±-----±-----+ |admin| 26|男 | |张三 | 22|女 | ±-------±-----±-----+ 2 rows in set (0.00 sec)
SQL语言分为4个部分:DDL(定义)、DML(操作)、DQL(查询)、DCL(控制)
G 格式化输出(文本式,竖立显示) s 查看服务器端信息
c 结束命令输入操作
q 退出当前sql命令行模式
h 查看帮助
连接, 打开库, 操作, 关闭退出
1) SQL 语句可以换行, 要以分号结尾
2) 命令不区分大小写. 关键字和函数建议用大写
3) 如果提示符为 '> 那么需要输入一个’回车
4) 命令打错了换行后不能修改, 可以用 c 取消
数据库管理系统中, 可以有很多库, 每个数据库中可以包括多张数据表
查看表: show tables;
创建表: create table 表名(字段名1 类型,字段名2 类型)engine=innodb default charset=utf8; 创建表: 如果表不存在,则创建, 如果存在就不执行这条命令
create table if not exists 表名(字段1 类型,字段2 类型);
create table if not exists users(
id int not null primary key auto_increment, name varchar(4) not null,
age tinyint,
sex enum(‘男’,‘女’)
) engine=innodb default charset=utf8;
删除表: drop table 表名;
表结构: desc 表名;
查看建标语句:show create table users;
插入
insert into 表名(字段1,字段2,字段3) values(值1,值2,值3);
insert into 表名(字段1,字段2,字段3) values(a值1,a值2,a值3),(b值1,b值2,b值3); 查询
select * from 表名;
select 字段1,字段2,字段3 from 表名;
select * from 表名 where 字段=某个值;
修改
update 表名 set 字段=某个值 where 条件;
update 表名 set 字段1=值1,字段2=值2 where 条件;
update 表名 set 字段=字段+值 where 条件;
删除
delete from 表名 where 字段=某个值;
exit; 或者 quit;
数据类型是定义列中可以存储什么类型的数据以及该数据实际怎样存储的基本规则数据类型限制存储在数据列列中的数据。例如,数值数据类型列只能接受数值类型的的数据在设计表时,应该特别重视所用的数据类型。使用错误的数据类型可能会严重地影响应用程序的功能和性能。
更改包含数据的列不是一件小事(而且这样做可能会导致数据丢失)。
数据类型: 整型、浮点型、字符串、日期等
最常用的数据类型是串数据类型。它们存储串,如名字、地址、电 话号码、邮政编码等。 不管使用何种形式的串数据类型,串值都必须括在引号内 有两种基本的串类型,分别为定长串和变长串
定长串:char
1. 接受长度固定的字符串,其长度是在创建表时指定的。 定长列不允许存储多于指定长度字符的数据。
2. 指定长度后,就会分配固定的存储空间用于存放数据 char(7) 不管实际插入多少字符,它都会占用7个字符位置
变长串 varchar
存储可变长度的字符串 varchar(7) 如果实际插入4个字符, 那么它只占4个字符位置,当然插入的数据长度不能超过7个字符。
注意
既然变长数据类型这样灵活,为什么还要使用定长数据类型 回答:因为性能,MySQL处理定长列远比处理变长列快得多。
Text 变长文本类型存储
数值数据类型存储数值。MySQL支持多种数值数据类型,每种存储的数值具有不同的取值范围。支持的取值范围越大,所需存储空间越多
与字符串不一样,数值不应该括在引号内
decimal(5, 2) 表示数值总共5位, 小数占2位 tinyint 1字节(8位) 0-255。-128,127 int 4字节。 -21亿,21亿。0-42亿 float.
MySQL中没有专门存储货币的数据类型,一般情况下使用DECIMAL(8, 2)
有符号或无符号
所有数值数据类型(除BIT和BOOLEAN外)都可以有符号或无符号
注意
如果将邮政编码类似于01234存储为数值类型,则保存的将是数值1234,此时需要使用字符串类型 手机号应该用什么进行存储呢
MySQL使用专门的数据类型来存储日期和时间值
datetime 8字节1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
二进制数据类型可存储任何数据(甚至包括二进制信息),如图像、多媒体、字处理文档等
其中%表示任意数量的任意字符,_表示任意一位字符
1、表中每一行都应该有可以唯一标识自己的一列,用于记录两条记录不能重复,任意两行都不具有相同的主键值
2、应该总是定义主键 虽然并不总是都需要主键,但大多数数据库设计人员都应保证他们创建的每个表具有一个主 键,以便于以后的数据操纵和管理。
要求
(例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。)
数据库的操作:数据库创建 ;数据库删除
数据表的操作:数据表的创建;数据表的修改 (表结构) ;数据表的删除
# 链接mysql数据库后,进入mysql后可以操作数据
# 1. 创建库
create database if not exists tlxy default charset=utf8;
– 1. 数据库 tlxy 如果不存在则创建数据库,存在则不创建
– 2. 创建 tlxy 数据库,并设置字符集为utf8
– 3. 无特殊情况都要求字符集为utf8或者utf8mb4的字符编码
# 1. 查看所有库 show databases;
# use 库名 use tlxy
删库有风险,动手需大胆(哈哈哈,大不了西红柿带你跑路)
# 删除库,那么库中的所有数据都将在磁盘中删除。 drop database 库名
语法格式:
create table 表名(字段名,类型,【字段约束】,。。。); 实例:
# 以下创建一个 users 的表 create table users(
– 创建ID字段,为正整数,不允许为空 主键,自动递增
id int unsigned not null primary key auto_increment,
– 创建 存储 名字的字段,为字符串类型,最大长度 5个字符,不允许为空 username varchar(5) not null,
– 创建存储 密码 的字段,固定长度 32位字符, 不允许为空
password char(32) not null,
– 创建 年龄 字段,不允许为空,默认值为 20
age tinyint not null default 20
)engine=innodb default charset=utf8;
# 查看表结构 desc users;
#查看建表语句
show create table users;
创建表的基本原则:
语法格式:alter table 表名 action (更改的选项)
添加字段
# 语法:alter table 表名 add 添加的字段信息 --在users表中 追加 一个num字段
alter table users add num int not null;
– 在指定字段后面追加字段 在 users 表中 age字段后面 添加一个 email 字段 alter table users add email varchar(50) after age;
– 在指定字段后面追加字段,在 users 表中 age字段后面 添加一个 phone alter table users add phone char(11) not null after age;
– 在表的最前面添加一个字段
alter table users add aa int first;
删除字段
# 删除字段 alter table 表名 drop 被删除的字段名 alter table users drop aa;
修改字段
语法格式: alter table 表名 change|modify 被修改的字段信息 change: 可以修改字段名,
modify: 不能修改字段名。
# 修改表中的 num 字段 类型,使用 modify 不修改表名
alter table users modify num tinyint not null default 12;
# 修改表中的 num 字段 为 int并且字段名为 nn alter table users change num mm int;
# 注意:一般情况下,无特殊要求,不要轻易修改表结构
# 语法:alter table 原表名 rename as 新表名
# 在常规情况下,auto_increment 默认从1开始继续递增 alter table users auto_increment = 1000;
# 推荐在定义表时,表引擎为 innodb。
# 通过查看建表语句获取当前的表引擎
mysql> show create table usersG;
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
# 直接查看当前表状态信息
mysql> show table status from tlxy where name = 'users’G; *************************** 1. row ***************************
Name: users
Engine: InnoDB
# 修改表引擎语句
alter table users engine = ‘myisam’;
drop table 表名
其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送
**一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。**那服务器进程对客户
端进程发送的请求做了什么处理,才能产生最后的处理结果呢?客户端可以向服务器发送增删改查各类请求,我们
这里以比较复杂的查询请求为例来画个图展示一下大致的过程:
虽然查询缓存有时可以提升系统性能,但也不得不因维护这块缓存而造成一些开销,比如每次都要去查询缓
存中检索,查询请求处理完需要更新查询缓存,维护该查询缓存对应的内存区域。从MySQL 5.7.20开始,不
推荐使用查询缓存,并在MySQL 8.0中删除。
MySQL服务器把数据的存储和提取操作都封装到了一个叫存储引擎的模块里。我们知道表是由一行一行的记录组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是存储引擎负责的事情。为了实现不同的功能,MySQL提供了各式各样的存储引擎,不同存储引擎管理的表具体的存储结构可能不同,采用的存取算法也可能不同。
存储引擎以前叫做表处理器,它的功能就是接收上层传下来的指令,然后对表中的数据进行提取或写入操作。
为了管理方便,人们把连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存储的功能划分为MySQL server的功能,把真实存取数据的功能划分为存储引擎的功能。各种不同的存储引擎向上边的MySQLserver层提供统一的调用接口(也就是存储引擎API),包含了几十个底层函数,像"读取索引第一条内容"、“读取索引下一条内容”、"插入记录"等等。
所以在MySQL server完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数据后返回给客户端就好了。
MySQL支持非常多种存储引擎:
ARCHIVE用于数据存档(行被插入后不能再修改)
BLACKHOLE丢弃写操作,读操作会返回空内容
CSV在存储数据时,以逗号分隔各个数据项
FEDERATED用来访问远程表
InnoDB具备外键支持功能的事务存储引擎
MEMORY置于内存的表
MERGE用来管理多个MyISAM表构成的表集合
MyISAM主要的非事务处理存储引擎
NDBMySQL集群专用存储引擎
MyISAM不支持事务,而InnoDB支持。
事务:访问并更新数据库中数据的执行单元。事物操作中,要么都执行要么都不执行
MyISAM:每个MyISAM在磁盘上存储成三个文件。
InnoDB:主要分为两种文件进行存储
MyISAM**:只支持表级锁**,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB**:支持事务和行级锁,是innodb的最大特色**。
行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。
MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。
InnoDB的主键范围更大,最大是MyISAM的2倍。
MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。InnoDB:没有保存表的总行数
(只能遍历),如果使用select count() from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,
myisam和innodb处理的方式都一样。
MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。
MyISAM:不支持InnoDB:支持
MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
推荐考虑使用InnoDB来替代MyISAM引擎,原因是InnoDB自身很多良好的特点,比如事务支持、存储过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。
另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。现在默认使用InnoDB。
我们知道在计算机中只能存储二进制数据,那该怎么存储字符串呢?当然是建立字符与二进制数据的映射关系了,
建立这个关系最起码要搞清楚两件事儿:
1.你要把哪些字符映射成二进制数据?
也就是界定清楚字符范围。
2.怎么映射?
将一个字符映射成一个二进制数据的过程也叫做编码,将一个二进制数据映射到一个字符的过程叫做解码。人们抽象出一个字符集的概念来描述某个字符范围的编码规则
我们看一下一些常用字符集的情况:
ASCII字符集
共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码,我们看一些字符的编码方式:
ISO 8859-1字符集
共收录256个字符,是在ASCII字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。这个字符集也有一个别名latin1。
GB2312字符集
收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个。同时这种字符集又兼容ASCII字符集,所以在编码方式上显得有些奇怪:
这种表示一个字符需要的字节数可能不同的编码方式称为变长编码方式。比方说字符串’爱u’,其
中’爱’需要用2个字节进行编码,编码后的十六进制表示为0xCED2,'u’需要用1个字节进行编码,编码后的十六进制表示为0x75,所以拼合起来就是0xCED275。
小贴士:我们怎么区分某个字节代表一个单独的字符还是代表某个字符的一部分呢?别忘了ASCII字符集只收录128个字符,使用0~127就可以表示全部字符,所以如果某个字节是在0~127之内的,就意味着一个字节代表一个单独的字符,否则就是两个字节代表一个单独的字符。
GBK字符集
GBK字符集只是在收录字符范围上对GB2312字符集作了扩充,编码方式上兼容GB2312。
utf8字符集
收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容ASCII字符集,采用变长编码方式,编码一个字符需要使用1~4个字节,比方说这样:
小贴士:其实准确的说,utf8只是Unicode字符集的一种编码方案,Unicode字符集可以采用utf8、
utf16、utf32这几种编码方案,utf8使用1~4个字节编码一个字符,utf16使用2个或4个字节编码一个字符,utf32使用4个字节编码一个字符。更详细的Unicode和其编码方案的知识不是本书的重点,大家上网查查哈~MySQL中并不区分字符集和编码方案的概念,所以后边唠叨的时候把utf8、utf16、utf32 都当作一种字符集对待。
对于同一个字符,不同字符集也可能有不同的编码方式。比如对于汉字’我’来说,ASCII字符集中根本没有收录这个字符,utf8和gb2312字符集对汉字我的编码方式如下:
我们上边说utf8字符集表示一个字符需要使用1~4个字节,但是我们常用的一些字符使用1~3个字节就可以表示了。而在MySQL中字符集表示一个字符所用最大字节长度在某些方面会影响系统的存储和性能,所以设计MySQL的大叔偷偷的定义了两个概念:
有一点需要大家十分的注意,在MySQL中utf8是utf8mb3的别名,所以之后在MySQL中提到utf8就意味着使用1~3个字节来表示一个字符,如果大家有使用4字节编码一个字符的情况,比如存储一些emoji表情啥的,那请使用utf8mb4。
MySQL支持好多好多种字符集,查看当前MySQL中支持的字符集可以用下边这个语句:
showcharset;
数据的DML操作:添加数据,修改数据,删除数据
格式:insert into表名[(字段列表)] values(值列表…);
–标准添加(指定所有字段,给定所有的值)
mysql>insertintostu(id,name,age,sex,classid)values(1,‘zhangsan’,20,‘m’,‘lamp138’);
Query OK,1row affected (0.13sec)
–指定部分字段添加值
mysql>insertintostu(name,classid) value(‘lisi’,‘lamp138’);
Query OK,1row affected (0.11sec)
–不指定字段添加值
mysql>insertintostu value(null,‘wangwu’,21,‘w’,‘lamp138’);
Query OK,1row affected (0.22sec)
–批量添加值
mysql>insertintostuvalues
-> (null,‘zhaoliu’,25,‘w’,‘lamp94’),
-> (null,‘uu01’,26,‘m’,‘lamp94’),
-> (null,‘uu02’,28,‘w’,‘lamp92’),
-> (null,‘qq02’,24,‘m’,‘lamp92’),
-> (null,‘uu03’,32,‘m’,‘lamp138’),
-> (null,‘qq03’,23,‘w’,‘lamp94’),
-> (null,‘aa’,19,‘m’,‘lamp138’);
Query OK,7rows affected (0.27sec)
Records:7Duplicates:0Warnings:0
格式:update表名set字段1=值1,字段2=值2,字段n=值n… where条件
–将id为11的age改为35,sex改为m值
mysql>updatestusetage=35,sex='m’whereid=11;
Query OK,1row affected (0.16sec)
Rows matched:1Changed:1Warnings:0
–将id值为12和14的数据值sex改为m,classid改为lamp92
mysql>updatestusetsex=‘m’,classid='lamp92’whereid=12orid=14–等价于下面
mysql>updatestusetsex=‘m’,classid='lamp92’whereidin(12,14);
Query OK,2rows affected (0.09sec)
Rows matched:2Changed:2Warnings:0
格式:delete from表名[where条件]
–删除stu表中id值为100的数据
mysql> delete from stu where id=100;
Query OK, 0 rows affected (0.00 sec)
–删除stu表中id值为20到30的数据
mysql> delete from stu where id>=20 and id<=30;
Query OK, 0 rows affected (0.00 sec)
–删除stu表中id值为20到30的数据(等级于上面写法)
mysql> delete from stu where id between 20 and 30;
Query OK, 0 rows affected (0.00 sec)
–删除stu表中id值大于200的数据
mysql> delete from stu where id>200;
Query OK, 0 rows affected (0.00 sec)
语法格式:
select字段列表|*from表名
[where搜索条件]
[groupby分组字段[having分组条件]]
[orderby排序字段排序规则]
[limit分页参数]
#查询表中所有列所有数据
select*fromusers;
#指定字段列表进行查询
selectid,name,phonefromusers;
可以在where子句中指定任何条件
可以使用and或者or指定一个或多个条件
where条件也可以运用在update和delete语句的后面
where子句类似程序语言中if条件,根据mysql表中的字段值来进行数据的过滤
示例:
–查询users表中age > 22的数据
select*fromuserswhereage >22;
–查询users表中name=某个条件值的数据
select*fromuserswherename =‘王五’;
–查询users表中年龄在22到25之间的数据
select*fromuserswhereage >=22andage <=25;
select*fromuserswhereagebetween22and25;
–查询users表中年龄不在22到25之间的数据
select*fromuserswhereage <22orage >25;
select*fromuserswhereagenotbetween22and25;
–查询users表中年龄在22到25之间的女生信息
select*fromuserswhereage >=22andage <=25andsex =‘女’;
and和or使用时注意
假设要求查询users表中年龄为22或者25的女生信息
select * from users where age=22 or age = 25 and sex = ‘女’;
思考上面的语句能否返回符合条件的数据?
实际查询结果并不符合要求?
select*fromuserswhereage=22orage =25andsex =‘女’;
±-----±-------±-----±------±------±-----±-----+
| id | name | age | phone | email | sex | mm |
±-----±-------±-----±------±------±-----±-----+
|1|章三|22| |NULL|男|0|
|1002| cc |25|123|NULL|女|NULL|
±-----±-------±-----±------±------±-----±-----+
2rowsinset(0.00sec)
–上面的查询结果并不符合查询条件的要求。
–问题出在sql计算的顺序上,sql会优先处理and条件,所以上面的sql语句就变成了
–查询变成了为年龄22的不管性别,或者年龄为25的女生
–如何改造sql符合我们的查询条件呢?
–使用小括号来关联相同的条件
select*fromuserswhere(age=22orage =25)andsex =‘女’;
±-----±-----±-----±------±------±-----±-----+
| id | name | age | phone | email | sex | mm |
±-----±-----±-----±------±------±-----±-----+
|1002| cc |25|123|NULL|女|NULL|
±-----±-----±-----±------±------±-----±-----+
1rowinset(0.00sec)
我们可以在where条件中使用=,<,>等符合进行条件的过滤,但是当想查询某个字段是否包含时如何过滤?
可以使用like语句进行某个字段的模糊搜索,
例如:查询name字段中包含五的数据
– like语句like某个确定的值和。where name = '王五’是一样
select*fromuserswherenamelike’王五’;
±—±-------±-----±------±----------±-----±-----+
| id | name | age | phone | email | sex | mm |
±—±-------±-----±------±----------±-----±-----+
|5|王五|24|10011| ww@qq.com|男|0|
±—±-------±-----±------±----------±-----±-----+
1rowinset(0.00sec)
–使用%模糊搜索。%代表任意个任意字符
–查询name字段中包含五的
select*fromuserswherenamelike’%五%';
–查询name字段中最后一个字符为五的
select*fromuserswherenamelike’%五’;
–查询name字段中第一个字符为王的
select*fromuserswherenamelike’王%';
–使用_单个的下划线。表示一个任意字符,使用和%类似
–查询表中name字段为两个字符的数据
select*fromuserswherenamelike’__';
–查询name字段最后为五,的两个字符的数据
select*fromuserswherenamelike’_五’;
注意:where子句中的like在使用%或者_进行模糊搜索时,效率不高,使用时注意:
尽可能的不去使用%或者_
如果需要使用,也尽可能不要把通配符放在开头处
Mysql中的统计函数(聚合函数)
max(),min(),count(),sum(),avg()
#计算users表中最大年龄,最小年龄,年龄和及平均年龄
selectmax(age),min(age),sum(age),avg(age)fromusers;
±---------±---------±---------±---------+
|max(age) |min(age) |sum(age) |avg(age) |
±---------±---------±---------±---------+
|28|20|202|22.4444|
±---------±---------±---------±---------+
–上面数据中的列都是在查询时使用的函数名,不方便阅读和后期的调用,可以通过别名方式美化
selectmax(age)asmax_age,
min(age) min_age,sum(age)assum_age,
avg(age)asavg_age
fromusers;
±--------±--------±--------±--------+
| max_age | min_age | sum_age | avg_age |
±--------±--------±--------±--------+
|28|20|202|22.4444|
±--------±--------±--------±--------+
–统计users表中的数据量
selectcount(*)fromusers;
±---------+
|count(*) |
±---------+
|9|
±---------+
selectcount(id)fromusers;
±----------+
|count(id) |
±----------+
|9|
±----------+
–上面的两个统计,分别使用了count(*)和count(id),结果目前都一样,有什么区别?
– count(*)是按照users表中所有的列进行数据的统计,只要其中一列上有数据,就可以计算
– count(id)是按照指定的id字段进行统计,也可以使用别的字段进行统计,
–但是注意,如果指定的列上出现了NULL值,那么为NULL的这个数据不会被统计
–假设有下面这样的一张表需要统计
±-----±----------±-----±-------±----------±-----±-----+
| id | name | age | phone | email | sex | mm |
±-----±----------±-----±-------±----------±-----±-----+
|1|章三|22| |NULL|男|0|
|2|李四|20| |NULL|女|0|
|5|王五|24|10011| ww@qq.com|男|0|
|1000| aa |20|123|NULL|女|NULL|
|1001| bb |20|123456|NULL|女|NULL|
|1002| cc |25|123|NULL|女|NULL|
|1003| dd |20|456|NULL|女|NULL|
|1004| ff |28|789|NULL|男|NULL|
|1005|王五六|23|890|NULL|NULL|NULL|
±-----±----------±-----±-------±----------±-----±-----+
9rowsinset(0.00sec)
–如果按照sex这一列进行统计,结果就是8个而不是9个,因为sex这一列中有NULL值存在
mysql>selectcount(sex)fromusers;
±-----------+
|count(sex) |
±-----------+
|8|
±-----------+
聚合函数除了以上简单的使用意外,通常情况下都是配合着分组进行数据的统计和计算
group by语句根据一个或多个列对结果集进行分组
一般情况下,是用与数据的统计或计算,配合聚合函数使用
–统计users表中男女生人数
–很明显按照上面的需要,可以写出两个语句进行分别统计
selectcount(*)fromuserswheresex =‘女’;
selectcount(*)fromuserswheresex =‘男’;
–可以使用分组进行统计,更方便
selectsex,count(*)fromusersgroupbysex;
±-----±---------+
| sex |count(*) |
±-----±---------+
|男|4|
|女|5|
±-----±---------+
–统计1班和2班的人数
selectclassid,count(*)fromusersgroupbyclassid;
±--------±---------+
| classid |count(*) |
±--------±---------+
|1|5|
|2|4|
±--------±---------+
–分别统计每个班级的男女生人数
selectclassid,sex,count(*)asnumfromusersgroupbyclassid,sex;
±--------±-----±----+
| classid | sex | num |
±--------±-----±----+
|1|男|2|
|1|女|3|
|2|男|2|
|2|女|2|
±--------±-----±----+
#注意,在使用。group by分组时,一般除了聚合函数,其它在select后面出现的字段列都需要出现在grouop by后面
having时在分组聚合计算后,对结果再一次进行过滤,类似于where,
where过滤的是行数据,having过滤的是分组数据
–要统计班级人数
selectclassid,count(*)fromusersgroupbyclassid;
–统计班级人数,并且要人数达到5人及以上
selectclassid,count(*)asnumfromusersgroupbyclassidhavingnum >=5;
我们在mysql中使用select的语句查询的数据结果是根据数据在底层文件的结构来排序的,
首先不要依赖默认的排序,另外在需要排序时要使用orderby对返回的结果进行排序
Asc升序,默认
desc降序
–按照年龄对结果进行排序,从大到小
select*fromusersorderbyagedesc;
–从小到大排序asc默认就是。可以不写
select*fromusersorderbyage;
–也可以按照多个字段进行排序
select*fromusersorderbyage,id;#先按照age进行排序,age相同情况下,按照id进行排序
select*fromusersorderbyage,iddesc;
limit n提取n条数据,
limit m,n跳过m跳数据,提取n条数据
–查询users表中的数据,只要3条
select*fromuserslimit3;
–跳过前4条数据,再取3条数据
select*fromuserslimit4,3;
– limit一般应用在数据分页上面
–例如每页显示10条数据,第三页的limit应该怎么写?思考
第一页limit0,10
第二页limit10,10
第三页limit20,10
第四页limit30,10
–提取user表中年龄最大的三个用户数据怎么查询?
select*fromusersorderbyagedesclimit3;
#不要进入mysql,然后输入以下命令导出某个库中的数据
mysqldump-uroot-ptlxy > ~/Desktop/code/tlxy.sql
导出一个库中所有数据,会形成一个建表和添加语句组成的sql文件之后可以用这个sql文件到别的库,或着本机中创建或回复这些数据
#不要进入mysql,然后输入以下命令导出某个库中指定的表的数据
mysqldump-uroot-ptlxy tts > ~/Desktop/code/tlxy-tts.sql
#在新的数据库中导入备份的数据,导入导出的sql文件
mysql-uroot-pops < ./tlxy.sql
mysql-uroot-pops < ./tlxy-tts.sql
mysql中的root用户是数据库中权限最高的用户,千万不要用在项目中。
可以给不同的用户,或者项目,创建不同的mysql用户,并适当的授权,完成数据库的相关操作。这样就一定程度上保证了数据库的安全。
grant授权的操作on授权的库.授权的表to账户@登录地址identified by ‘密码’;
示例:
#在mysql中创建一个zhangsan用户,授权可以对tlxy这个库中的所有表进行添加和查询的权限
grantselect,insertontlxy.*tozhangsan@‘%’ identified by ‘123456’;
#用户lisi。密码123456可以对tlxy库中的所有表有所有操作权限
grantallontlxy.*tolisi@‘%’ identified by ‘123456’;
dropuser’lisi’@‘%’;
热门专栏推荐:
??大数据集锦专栏:大数据-硬核学习资料 & 面试真题集锦?
??数据仓库专栏:数仓发展史、建设方法论、实战经验、面试真题?
??Python专栏:Python相关黑科技:爬虫、算法、小工具?
(优质好文持续更新中……)
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。