数据库MySQL

一、数据库管理软件的由来

数据要想永久保存,都是保存于文件中,一个文件仅仅只能存在一台机器上。假设忽略文件存取效率问题,程序所有组件都运行在一台机器上那么文件存取没有问题,但是…

1、程序所有的组件就不可能运行在一台机器上

​ 因为机器一旦挂掉则意味着整个软件的崩溃,并且程序的执行效率依赖于承载它的硬件,而一台机器的机器性能是有限的,受限于硬件水平,就一台机器的性能垂直进行扩展时极限的,所以只能水平扩展来增强系统整体性能,这就需要将程序的各个组件分布于多台机器执行

2、数据安全问题

将程序的各个组件分布到各台机器,但需知各组件仍是一个整体,所有的组件的数据要共享,但每台机器上的组件都只能操作本机的文件,就导致数据不一致。然后数据与应用程序分离,文件存放一套机器然后将多台机器通过网络去访问这台机器上的文件(用socket实现)共享文件意味着数据不安全,需要加锁处理

3、并发

我们需要写一个socket服务端来管理这台数据库服务器的文件,然后写一个socket客户端完成功能

​ 1、远程连接,支持并发

​ 2、打开文件

​ 3、读写(加锁)

​ 4、关闭文件

总结:

我们在编写程序之前都需要事先写好基于网络操作一台主机上文件的程序(socket服务端客户端程序),于是就有了专门的处理软件mysql等数据库管理软件的由来,但mysql解决的不仅仅是数据共享的问题,还由查询效率安全性 等一系列问题。

二、数据库介绍

1、什么是数据

数据就是描述事物的符号

描述事物的符号可以是数字、文字、图片、声音等,数据有多种表现形式,他们都可以经过数字化后存入计算机

例:在计算机中描述一个事物,就需要抽取这一事物的典型特征组成一条记录就相当于文件的一行内容:(单纯的记录没有任何意义,用逗号分割相当于表的标题

egon,male,18,1999,山东,计算机系,2017,oldboy

2、什么时数据库(DataBase,简称DB)

数据库即存放数据的仓库,只不过这个仓库实在计算机存储设备上,而且数据是按一定的格式存放的。数据库时长期存放于计算机内,有组织可以共享的数据

数据库中的数据:按数据模型组织、描述存储,有较小的冗余、较高的数据独立性和易扩展性并可以用户共享

3、什么时数据库管理系统(DataBase Management System 简称DBMS)

数据库管理系统是一个系统软件,如:MySQL、Oracle、SQLite、Access、MS SQL Server

MySQL主要用于大型门户、例如搜狗、新浪等。它的优势就是开放源代码,因为开放源代码这个数据库是免费的。

Oracle主要用于银行、飞机等,数据库功能强大,软件费用高

SQL Server 是微软公司的产品,主要用于大中型企业,如联想、方正等

4、数据库服务器、数据管理系统、数据库、表与记录的关系(重点)

数据服务器:运行数据库管理的软件

数据库管理软件:管理–数据库

数据库:即文件夹,用来组织文件/表

表:即文件,用来存放多行内容/多条记录

三、MySQL介绍

mysql是一个关系型数据库管理软件,本质就是一个socket程序。由瑞典的mqsql ab公司开发,母线属于oracle旗下公司。在web应用方面mysql是最好的RDBMS应用软件之一

1、mysql是什么?

mysql就是一个基于socket编写的C/S架构的软件(客户端软件)

mysql自带:如mysql命令,mysqldump命令等

python模块:如pymysql

2、数据库管理软件分类:

关系型:sqllite、db2、oracle、access,sql server,Mysql(注意sql语句通用)

非关系型:,mongodb,redis,memcache

关系型数据库需要有表结构

非关系型数据库是key-value存储的,没有表结构

四、mysql下载安装

windows版本:

1、下载:MySQL Community Server
2、解压:解压到指定目录
3、添加环境变量:右键计算机-》属性-》高级系统设置-》高级-》环境变量-》path(第二个框)-》添加mysql的bin目录
4、初始化
mysqld --initialize-insecure
5、启动mysql服务
mysqld 
6、启动mysql客户端并连接mysql服务器
mysql -uroot -p


# 注意:--install前,必须用mysql启动命令的绝对路径
制作mysql的windows服务,在终端执行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --install
 
移除MySQL的Windows服务,在终端执行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --remove


注册成服务后,以后再启用和关闭mysql服务时,仅需执行如下命令:
# 启动:
net start mysql
# 关闭:
net stop mysql

五、mysql软件基本管理

1、设置密码

# 5.6版本设置密码方式:
update mysql.user set password=password("123") where user="root" and host="localhost";
flush privileges;  # 刷新MySQL的系统权限相关表­

# 5.7版本:
update mysql.user set authentication_string=password("123") where user="root" and host="localhost";

2、忘记密码

- 先关闭mysqld服务端

- 重新启动:mysql --skip-grant-tables
	命令行的方式启动(让mysql跳过用户名密码验证功能)
	mysqld --skip-grant-tables

- 启动客户端:
	# 直接以无密码的方式连接
	mysql -uroot -p 直接回车
  ​	update mysql.user set password=password(" ") where user="root" and host="localhost";
'''
真正存储用户表的密码字段 存储的肯定是密文
只有用户自己知道明文是什么 其他人都不知道 这样更加的安全
密码比对也只能比对密文
'''
	# 立刻将修改数据刷到硬盘
  ​	flush privileges;
- 关闭当前服务端 然后以正常校验授权表的形式启动,重新启动mysqld

六、sql语句基础

mysql服务端软件即mysqld帮我们管理好文件夹以及文件,前提是作为使用者的我们,需要下载mysql的客户端,或者其他模块来连接到mysqld,然后使用mysql软件规定的语法格式去提交自己命令,实现对文件夹或文件的管理。该语法即sql(Structured Query Language 即结构化查询语言)

SQL语言分为4个部分:DDL(定义),DML(操作),DQL(查询),DCL(控制)

1.DDL语句 数据库定义语言:数据库,表,视图,索引,存储过程,例如CREATE, DROP ,ALTER
2.DCL语句 数据库控制语言:例如控制用户的访问权限GRANT , REVOKE
3.DML语句 数据库操纵语言:插入数据INSERT,删除数据DELETE,更新数据UPDATE
4.DQL语句 数据库操纵语言:查询数据SELECT

SQL语句中的快捷键

>>> \G 格式化输出(文本式,竖立显示)
>>> \s 查看服务器端信息
>>> \c 结束命令输入操作
>>> \q 退出当前sql命令行模式
>>> \h 查看帮助

六、库相关操作

information_schema:虚拟库,不占用磁盘空间,存储的石数据库启动后的一些参数,如:用户表信息,权限信息等

performa_Schema:MySQL5.5开始i性能增的一个数据库:主要用于手机数据库服务器性能参数,记录处理查询请求时发生的各种事件

mysql:授权库,主要村塾系统用户的权限信息

test:MySQL数据库系统自动创建的测试数据库

创建数据库

1、语法
create database 数据库名 charset utf8;
2、数据库命名规则
- 可以由字母、数字、下划线组成
- 区分大小写
- 唯一性
- 不能使用关键字
- 不能单独使用数字
- 最长128位

数据库相关操作

1、查看数据库
# 查看所有数据库
show databases;
# 查看数据库的建表语句
show create database 数据库名;
2、增加数据库
# 创建数据库charset utf8mb4是默认的,可以不写
create database 数据库名 charset utfmb4;
3、删除数据库
​drop database 数据库名;
4、修改数据库
alter databases 数据库名;
# 更改数据库的字符集
​alter database 数据库名 charset gbk\tf8;

七、表相关操作

mysql中建立的库 ===》 文件夹

库中建立的表 ===》 文件

数据库管理系统中,可以有很多’库’,每个数据库中可以包括多张数据’表’
增加表操作
# 增加表操作:
create table 数据库名.表名(id int,name)
# 切换文件夹
use 数据库名;
​select database();
​create table 表名(id int,name char);
查看表操作
# 查看所有的表名
​show tables;
# 查看刚刚创建的命令
show create table 数据库名.表名;
show create table 数据库名.表名\G # 加上\G垂直显示,默认横向显示
# 查看创建成功的表结构
desc/describe 表名;
更改表操作
# 更改表名:rename
​show create table db1.t1;
# 只能改变数据类型:modify
alter table tt1 modify name char(10);
# 字段名+数据类型一起改变:change
alter table tt1 change name mingzi char(3);
删除表操作
drop table tt1;

记录操作

# 增
# 插入单条数据
insert t2 values(1,"egon");
# 插入多条数据
insert t2 values(2,"tom"),(3,"lxx"),(4,"hxx");
# into可写可不写
insert into t2(id) values(5),(6);

# 查
# *代表所有
select * from t2;
select name from t2 where id=3;

# 改
# update 表名 set 字段=值,id=值 where 条件
update t2 set name="lxx",id=444 where id=4;
# 如果不加条件,所有的数据都会改掉
update t2 set name="lxx"
# 删
delete from t2 where id=444;

# 清空整张表(推荐)
truncate t2
# primary key :主键
# auto_increment : 自增
create table t3(id int primary key auto_increment,name char(10));
insert t3(name) values("egon"),("tom"),("jack");

退出Mysql

exit;
quit;

卸载Mysql(windows)

# 关闭服务
cmd:mysqld remove
# 删除已经解压的文件夹
# 重启电脑

八、存储引擎

用来存储数据的文件由不同的类型,每种文件类型对应各自不同的处理机制:例如文本编辑器txt,处理表格用excel,处理图片用png

数据库中的表由不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎

九、表的相关操作

1、创建表的完整语法

# 语法
create table 表名(
		字段名1 类型(宽度) 约束条件,
		字段名2 类型(宽度) 约束条件.
		字段名3 类型(宽度) 约束条件
)
# 注意
1.在同一张表中字段名不能重复
2.宽度和约束条件是可选的(可写可不写),而字段名和字段类型是必须的,
  约束条件写的话,也支持写多个
  字段名1 类型(宽度) 约束条件1 约束条件2...,
  create table t5(id); 报错
 3.最后一行不能有逗号
 		create table t6(
 		id int,
 		name char,
 		);  报错
 '''补充'''
 # 宽度
 一般情况下指的是对存储数据的限制
 	create table t7(name char); 默认宽度是1
 	insert into t7 values('jason');
 	insert into t7 values(null); 关键字 NULL
 针对不同的版本会出现不同的效果:
 5.6版本默认没有开启严格模式,规定只能存一个字符你给了多个字符,那么我会自动帮你截取
 5.7版本及以上或者开启了严格模式,那么规定只能存几个就不能超,一旦超出范围立刻报错 Data too long for ...
'''严格模式到底要不要开'''
MySql5.7之后的版本默认都是开启严格模式的
使用数据库的准则:
	能尽量少的让数据库干活就尽量少,不要给数据库增加额外的压力

# 约束条件 null  not null 不能插入null
create table t8(id int,name char not null);
'''宽度和约束条件到底是什么关系'''
	宽度是用来限制数据的存储
	约束条件是在宽度的基础之上增加的额外的约束

表的操作案例

# 创建表t1
create table t1(id int,name char);
# 修改表名
alter table t1 rename tt1;

# 修改字段
# 修改字段的数据类型
alter table t1 modify id tinyint;
# 修改单个字段的字段名和数据类型
alter table t1 change id ID tinyint;
# 修改多个字段的字段名和数据类型
alter table t1 change id ID tinyint,change name NAME char(4);

# 增加字段
# add:默认增加至末尾
alter table t1 add gender char(4);
# add...first:增加至开头
alter table t1 add gender char(4) first;
# add...after...:增加至after后的字段名后面
alter table t1 add level int after ID;

# 删除字段
alter table t1 drop gender;

# 复制表
# 5.6版本
create table t2 select user,host,password from mysql.user;
# 5.7版本
create table t2 select user,host,authentication_string from mysql.user;
# 只复制表结构
# 5.6版本
create table t3 select user,host,password from mysql.user where 1!=1;
# 5.7版本
create table t3 select user,host,authentication_string from mysql.user where 1!=1;

十、基本数据类型

1、整形

# 分类
TINYINT SMALLINT MEDUIMINT INT BIGINT
# 作用:
 存储年龄、等级、id、号码等等

TINYINT
	是否有符号
		默认情况下是带符号的
	超出会如何
		超出限制只存最大可接受值
create table t9(id tinyint);
insert into t9 values(-129),(256);

# 约束条件之unsigned 无符号
create table t10(id tinyint unsigned);

create table t11(id int);
# int 默认也是带符号的
# 整型默认情况下都是带符号的

# 针对整型 括号内的宽度到底是干嘛带的
create table t12(id int(8));
insert into t12 values(123456789);

"""
特例:只有整型括号里面的数字不是表示限制位数
id int(8)
	如果数字没有超出8位,那么默认用空格填充至8位
	如果数字超出了8位,那么有几位就存几位(但是还是要遵守最大范围)
"""
create table t13(id int(8) unsigned zerofill);
# 用0填充至8位
# 总结:
针对整型字段,括号内无需指定宽度,存储宽度是固定死的

案例演示

mysql> create table t5(id tinyint)

mysql> desc t4;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | tinyint(4) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.01 sec)

mysql> insert t4 values(128);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql>
mysql>
mysql> insert t4 values(127);
Query OK, 1 row affected (0.05 sec)

mysql> select * from t4;
+------+
| id   |
+------+
|  127 |
+------+
1 row in set (0.00 sec)

mysql>

浮点型

# 分类:
FLOAT、DOUBLE、DECIMAL
# 作用:
身高,体重,薪资

# 存储限制
float (255,30)  # 总共255位 小数部分占30位
double(255,30)  # 总共255位 小数部分占30位
decimal(65,30)  # 总共65位 小数部分占30位

# 精确度验证
create table t15(id float(255,30));
create table t16(id double(255,30));
create table t17(id decimal(65,30));

insert into t15 values(1.111111111111111111111111111111);
insert into t16 values(1.111111111111111111111111111111);
insert into t17 values(1.111111111111111111111111111111);

float < double < decimal
# 要结合实际应用场景  三者都能使用

案例演示:

create table t7(x float(255,30),y double(255,30),z decimal(65,30));

insert t7 values
(1.111111111111111111111111111111,1.111111111111111111111111111111,1.111111111111111111111111111111);

日期类型

# 分类

year(1901/2155)

time 时:分:秒 (’-838:59:59’/‘838:59:59’)

date 年:月:日 (1000-01-01/9999-12-31)

datetime 年:月:日 时:分:秒 1000-01-01 00:00:00/9999-12-31 23:59:59

timestamp 年:月:日 时:分:秒 1970-01-01 00:00:00/2037
--------------------------------------------------------------
create table t8(y year,t time,d date,dt datetime,ts timestamp);
insert t8 values(now(),now(),now(),now(),now());


create table student(
    id int,
    name char(10),
    born_year year,
    bitrh date,
    reg_time datetime
);


insert student values
(1,"wangjing","1911","1911-11-11","1911-11-11 11:11:11"),
(2,"lxx","1988","1988-11-11","1988-11-11 11:11:11");


insert student values
(3,"wangjing","1911","19111111","19111111111111");



# 注意:timestamp应该勇于记录更新时间
create table t9(
    id int,
    name varchar(16),
    -- update_time datetime not null default now() on update now(),
    update_time timestamp,
    reg_time datetime not null default now()
);


insert into t9(id,name) values(1,"egon");


# 测试效果
mysql> select * from t9;
+------+------+---------------------+---------------------+
| id   | name | update_time         | reg_time            |
+------+------+---------------------+---------------------+
|    1 | egon | 2020-09-01 16:45:51 | 2020-09-01 16:45:51 |
+------+------+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> update t9 set name="EGON" where id=1;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t9;
+------+------+---------------------+---------------------+
| id   | name | update_time         | reg_time            |
+------+------+---------------------+---------------------+
|    1 | EGON | 2020-09-01 16:46:50 | 2020-09-01 16:45:51 |
+------+------+---------------------+---------------------+
1 row in set (0.00 sec)

mysql>

字符类型

'''
char: 定长 , 不够则补全空格
看起来特点:
浪费空间
读取速度快
varchar:变长,预留1-2bytes来储存真实数据的长度
看起来特点:
节省空间
读取速度慢
ps:在存储的数据量刚好达到存储宽度限制时,其实varchar更费空间

总结:
大多数情况下存储的数据量都达不到宽度限制,所以大多数情况下varchar更省空间,但省空间不是关键,关键是省空间,会带来io效率的提升,进而提升了查询效率
'''
ab   |abc  |abcd |
1bytes+ab|1bytes+abc|1bytes+abcd|

验证

create table t11(x char(5));
create table t12(x varchar(5));

insert t11 values("我擦嘞 ");  -- "我擦嘞  "
insert t12 values("我擦嘞 ");  -- "我擦嘞 "

t11=>字符个数 5  字节个数 11
t12=>字符个数 4  字节个数 10

set sql_mode="pad_char_to_full_length";
select char_length(x) from t11;
select char_length(x) from t12;


select length(x) from t11;
select length(x) from t12;

表字段类型之枚举类型与集合

枚举类型enum("a","b","c","d") 多选1
集合类型set("a","b","c","d") 多选


CREATE TABLE shirts (
    name VARCHAR(40),
    size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);

INSERT INTO shirts(name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');

CREATE TABLE user (
    name VARCHAR(16),
    hobbies set("read","chou","drink","tang")
);
insert user values("lxx","tang,chou");
insert user values("hxx","tangchou");

三、完整性约束

	约束条件与数据类型的宽度一样,都是可选参数

	作用:用于保证数据的完整性和一致性
	
	主要分为:
	PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录
	FOREIGN KEY (FK)    标识该字段为该表的外键
	NOT NULL    标识该字段不能为空
	UNIQUE KEY (UK)    标识该字段的值是唯一的
	AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)
	DEFAULT    为该字段设置默认值

	UNSIGNED 无符号
	ZEROFILL 使用0填充

说明:
1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum('male','female') not null default 'male'
age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20
3. 是否是key
主键 primary key
外键 foreign key
索引 (index,unique...)

not null 与 default

是否可空,null表示空,非字符串
not null ----- 不可空
null -----可空
默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
create table db1(
nid int not null defalut 2,
num int not null)

not null

# 可以插入空
mysql>create database db1;
mysql>use db1;
mysql>create table t1(id int); # iid字段默认可以插入空
mysql>desc t1;
mysql>inster into t1 values(); # 可以插入空

# 不可以插入空
mysql>create database db2;
mysql>use db2;
mysql>create table t2(id int not null);  # 设置id字段不为空
mysql>desc t2;
mysql>inster into t1 values();  # 不能插入空

ERROR 1364 (HY000): Field 'id' doesn't have a default value

default

#设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值

mysql> create table t3(id int default 1);
mysql> alter table t3 modify id int not null default 1;

unique

# unique:设置唯一约束
create table department1(
id int,
name varchar(20) unique,
comment varchar(100)
);

# 方法二:
create table department2(
id int,
name varchar(20),
comment varchar(100),
constraint uk_name unique(name)
);

mysql> insert into department1 values(1,'IT','技术');
Query OK, 1 row affected (0.00 sec)
mysql> insert into department1 values(1,'IT','技术');
ERROR 1062 (23000): Duplicate entry 'IT' for key 'name'

联合唯一

create table server(
    id int,
    name varchar(10),
    ip varchar(15),
    port int,
    unique(ip,port),
    unique(name)
);

insert into server values (1,"web1","10.10.0.11",8080);
insert into server values (2,"web2","10.10.0.11",8081);
mysql> insert into server values(4,"web4","10.10.0.11",8081);
ERROR 1062 (23000): Duplicate entry '10.10.0.11-8081' for key 'ip'
mysql>

# not null 和unique的化学反应=>会被识别成表的主键
create table t4(id int,name varchar(10) not null unique);
create table t5(id int,name varchar(10) unique);

主键primary key

# 特点
#    1、主键的约束效果是not null+unique
#    2、innodb表有且只有一个主键,但是该主键可以是联合主键

create table t6(
    id int primary key auto_increment,
    name varchar(5)
);

insert into t6(name) values
("egon"),
("tom"),
("to1"),
("to2");


# 联合主键(了解)
create table t7(
    id int,
    name varchar(5),
    primary key(id,name)
);

表之间的三种关系

# 引入
# 先创建被关联表
create table dep(
    id int primary key auto_increment,
    name varchar(6),
    comment varchar(30)
);

# 再创建关联表
create table emp(
    id int primary key auto_increment,
    name varchar(10),
    gender varchar(5),
    dep_id int,
    foreign key(dep_id) references dep(id) on delete cascade on update cascade
);

# 先往被关联表插入数据
insert into dep(id,name) values
(1,'技术部'),
(2,'人力资源部'),
(3,'销售部');

# 先往关联表插入数据
insert into emp(name,gender,dep_id) values
('egon',"male",1),
('alex1',"male",2),
('alex2',"male",2),
('alex3',"male",2),
('李坦克',"male",3),
('刘飞机',"male",3),
('张火箭',"male",3),
('林子弹',"male",3),
('加特林',"male",3)
;

# 多对一
# 多对多
create table author(
    id int primary key auto_increment,
    name varchar(10)
);
create table book(
    id int primary key auto_increment,
    name varchar(16)
);
create table author2book(
    id int primary key auto_increment,
    author_id int,
    book_id int,
    foreign key(author_id) references author(id) on delete cascade on update cascade,
    foreign key(book_id) references book(id) on delete cascade on update cascade
);

# 一对一
create table customer(
    id int primary key auto_increment,
    name varchar(16),
    phone char(11)
);

create table student(
    id int primary key auto_increment,
    class varchar(10),
    course varchar(16),
    c_id int unique,
    foreign key(c_id) references customer(id) on delete cascade on update cascade
);

记录相关操作


# 插入
mysql> create table user(name varchar(16),password varchar(10));
Query OK, 0 rows affected (0.29 sec)
mysql>
mysql> insert into user select user,password from mysql.user;

# 删除
delete from 表 where 条件;

# 更新
update 表 set 字段=值 where 条件;

# 单表查询语法
select distinct 字段1,字段2,字段3,... from 表名
                            where 过滤条件
                            group by 分组的条件
                            having 筛选条件
                            order by 排序字段
                            limit n;


# 简单查询
select name,sex from emp;
select name as 名字,sex 性别 from emp;

select * from emp;

# 避免重复(针对的是记录)
select distinct post from emp;

# 进行四则运算
select name as 名字,salary*12 as 年薪 from emp;

# concat()拼接记录的内容
select name ,concat(salary*12,"$") from emp;
select name ,concat("annual_salary",':',salary*12) as 年薪 from emp;
select name ,concat("annual_salary",':',salary*12,':','$') as 年薪 from emp;
select name ,concat_ws(":","annual_salary",salary*12,'$') as 年薪 from emp;



select (
    case
    when name="egon" then
        name
    when name="alex" then
        concat(name,"_dsb")
    else
        concat(name,"_sb")
    end
) as 名字 from emp;


===========================================where
select * from emp where id >= 3 and id <= 5;
select * from emp where id between 3 and 5;
select * from emp where id not between 3 and 5;

select * from emp where id=3 or id=5 or id=7;
select * from emp where id in (3,5,7);
select * from emp where id not in (3,5,7);

select * from emp where id=3 or id=5 or id=7;


select * from emp where name like 'jin%';
select * from emp where name like 'jin___';

select * from emp where name regexp 'n$';


mysql> select * from emp where post_comment is not null;
Empty set (0.00 sec)

mysql> update emp set post_comment='' where id=3;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from emp where post_comment is not null;
+----+---------+------+-----+------------+---------+--------------+---------+--------+-----------+
| id | name    | sex  | age | hire_date  | post    | post_comment | salary  | office | depart_id |
+----+---------+------+-----+------------+---------+--------------+---------+--------+-----------+
|  3 | wupeiqi | male |  81 | 2013-03-05 | teacher |              | 8300.00 |    401 |         1 |
+----+---------+------+-----+------------+---------+--------------+---------+--------+-----------+
1 row in set (0.00 sec)

mysql>



select * from emp where name="丫丫";
select * from emp where name regexp "丫$";
select * from emp where name like "丫_";
select * from emp where name regexp "^程";
select hex(name) from t4  where hex(name) regexp 'e[4-9][0-9a-f]{4}';



===========================================group by
分完组之后只能看到分组的字段以及聚合的结果

max()
min()
avg()
sum()
count()

select depart_id,count(id),avg(salary),max(age),min(salary),sum(salary) from emp group by depart_id;

# 每个部门都有多少个人
select depart_id,count(id) from emp group by depart_id;

# 每个职位男生的平均薪资
select post,avg(salary) from emp where sex="male" group by post;


select post, group_concat(name) from emp group by post;
select post, group_concat(name) from emp where sex="male" group by post;

===========================================having
# having与where本质区别就是在于having是在分组之后发生过滤,可以使用聚合函数

mysql> select max(salary) from emp where max(salary) > 100000;
ERROR 1111 (HY000): Invalid use of group function
mysql> select max(salary) from emp having max(salary) > 100000;
+-------------+
| max(salary) |
+-------------+
|  1000000.31 |
+-------------+
1 row in set (0.00 sec)

mysql>



# 找出来男生平均薪资大于3000的职位

select post,avg(salary) from emp where sex="male" group by post having avg(salary) > 8000;



===========================================order by排序
select * from emp order by salary;
 select * from emp order by salary desc;
 select * from emp order by age,id desc;

 select post,avg(salary) from emp where sex="male" group by post having avg(salary) > 3000;
 mysql> select post,avg(salary) from emp where sex="male" group by post having avg(salary) > 3000;
+-----------------------------------------+---------------+
| post                                    | avg(salary)   |
+-----------------------------------------+---------------+
| operation                               |  16000.043333 |
| teacher                                 | 175650.051667 |
| 老男孩驻沙河办事处外交大使              |   7300.330000 |
+-----------------------------------------+---------------+
3 rows in set (0.00 sec)

mysql> select post,avg(salary) from emp where sex="male" group by post having avg(salary) > 3000 order by avg(salary);
+-----------------------------------------+---------------+
| post                                    | avg(salary)   |
+-----------------------------------------+---------------+
| 老男孩驻沙河办事处外交大使              |   7300.330000 |
| operation                               |  16000.043333 |
| teacher                                 | 175650.051667 |
+-----------------------------------------+---------------+
3 rows in set (0.00 sec)

mysql> select post,avg(salary) as v from emp where sex="male" group by post having avg(salary) > 3000 order by v;
+-----------------------------------------+---------------+
| post                                    | v             |
+-----------------------------------------+---------------+
| 老男孩驻沙河办事处外交大使              |   7300.330000 |
| operation                               |  16000.043333 |
| teacher                                 | 175650.051667 |
+-----------------------------------------+---------------+
3 rows in set (0.00 sec)

mysql>



select * from emp limit 0,5;
select * from emp limit 5,5;
select * from emp limit 10,5;
select * from emp limit 15,5;
select * from emp limit 20,5;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值