mysql测试要掌握的_mysql常用操作(测试必备)

现在互联网的主流关系型数据库是mysql,掌握其基本的增、删、改、查是每一个测试人员必备的技能。

sql语言分类

1、DDL语句(数据库定义语言): 数据库、表、视图、索引、存储过程,例如:CREATE、DROP、ALTER

2、DML语句(数据库操纵语言): 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT

3、DCL语句(数据库控制语言): 控制用户的访问权限GRANT、REVOKE

操作库

我们可以把库看做是文件夹。

mysql自带的库:

e75e5cac4cbdb17ee072c0b216deb92c.png

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

performance_schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象

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

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

连接数据库,查看已有的数据库,show databases;

c1da32dfaa8cc992d4cb3a28ddbf1c03.png

49be37a84f2a8e4e12d6bc69d3776a36.png

创建库,指定编码,create database qzcsbj charset utf8;

3c37ebc88ba873c71bde01bcdebcc791.png

库的存放位置

3f56d914bccba1e99b3a5bca479981cb.png

show create database qzcsbj;

d3a11300788033023e9aca03f829a414.png

show databases;

a03b08dca1ae55a1bee41960d3175336.png

查看当前所在的库

select database();

6a23bc682df67149883493bcd0eebbe0.png

修改编码,alter database qzcsbj charset gbk;

f88f20ef7761b314af123a4da5a93e95.png

drop database qzcsbj;

7fde188c65955418aaee9adda5eec3f2.png

操作表及列

我们可以把表看做是文件

切换数据库(文件夹):use qzcsbj ;

查看当前所在数据库(文件夹):select database();

90c564e6816317ac41dbac2cfd10d18b.png

create table 表名(

字段名1 类型[(宽度) 约束条件],

字段名2 类型[(宽度) 约束条件],

字段名3 类型[(宽度) 约束条件]

);

增加前,只有一个opt文件

533bad50f45fddef515c57b84feadcf6.png

create table test(id int, name varchar(255));

27ef969b82278e2a7e50d519ea43535c.png

增加后,多了一个frm文件,frm是表结构

6711264bec931cee7d032aa0a100af65.png

show create table test \G; # \G表示按行显示表的详细结构

153b25a04a8ac5c9adccd89d2c877ce8.png

show tables;

b24487a017a0b23c42bb60f8cec6d810.png

desc test; # 等价于describe test;

dc8a5f98a5aa9de9ba2c06188439afdd.png

复制

insert test(id,name) values(1,'qzcsbj1'),(2,'qzcsbj2'),(3,'qzcsbj3');

复制表结构+记录:

create table test2 select * from test;

75d37ba9e9a029a1ebc80319cac3c4ea.png

只复制表结构:

create table test3 select * from test where 1=2;

5cfa26ec8b5f191fcedb3d28e6476ab1.png

或者:

create table test4 like test;

1ecf15d6b06b6b23d7dd33c7f710a270.png

ALTER TABLE 表名

# 修改表名

RENAME 新表名;

# 增加字段

ADD 字段名 数据类型 [完整性约束条件…];

ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 添加到第一个字段

ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 添加到某个字段之后

# 删除字典

DROP 字段名;

# 修改字段

MODIFY 字段名 数据类型 [完整性约束条件…];

CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];

CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];

MODIFY,可以改字段属性

CHANGE,可以改字段名、字段属性

alter table test modify name varchar(256);

desc test;

3e9cc0734c909c464213e634b90ff0d3.png

alter table test change name NAME varchar(257);

desc test;

1d603bc413d3a066c0eaac6cd2002519.png

drop table test;

show tables;

d2a74298563d82b3992cea7390fc21af.png

操作记录

记录可以看做文件夹中文件的内容

全字段插入

INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); # into可以省略

多条数据逗号分隔

INSERT INTO 表名 VALUES

(值1,值2,值3…值n),

(值1,值2,值3…值n),

(值1,值2,值3…值n);

指定字段插入

INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);

插入查询结果

INSERT INTO 表名(字段1,字段2,字段3…字段n)

SELECT (字段1,字段2,字段3…字段n) FROM 表2 WHERE …;

create table test(id int, name varchar(255));

insert test(id,name) values(1,'qzcsbj1'),(2,'qzcsbj2'),(3,'qzcsbj3');

c6de9547dc96f7d81113b0775f056d99.png

select * from test;

cb8d6da0c61801b3cfce4f7cd209ea97.png

如果在其它库查test,表前必须加库作为前缀。

select * from qzcsbj.test;

bf667e286b65674ca4da1df82f1a3ae8.png

UPDATE 表名 SET

字段1=值1

WHERE 约束条件;

update test set name='qzcsbj' where id=2;

c51e99428dec0fb3ecb868e1c1ac7ae7.png

delete from test where id=3;

366a4576b4ad35b22fbc468b133f564e.png

delete,用于删除数据,自增长字段的值未重置

truncate,用于清空表,自增长字段的值也被重置

注意:delete不能给表取别名

eee59a964f971d3fb9734472c8bfb7e8.png

数据类型

数字

dc6d9e38d90118220e2e5cb3696f36a9.png

日期类型

年:year

年月日:date

时分秒:time

年月日时分秒:datetime

create table student(

id int,

name char(6), # 最大存储6个字符

born_year year, # 年

birth_date date, # 年月日

class_time time, # 时分秒

reg_time datetime # 年月日时分秒

);

插入数据

insert into student values(1,'jack',now(),now(),now(),now());

insert into student values(2,'tom',"2017","2017-12-12","12:12:12","2017-12-12 12:12:12");

now()是mysql提供的函数

c39fc411481d724fe87edc30fc2fed4e.png

字符类型

# 宽度指的是字符的个数

create table test(name char(5));

create table test(name varchar(5));

char:按指定长度存,存取速度快,但是当存的数据的长度小于字段定义的长度时浪费空间

varchar:存数据更精简,更加节省空间(是在存的数据的长度小于字段定义的长度时;否则必char浪费空间,因为多少了头,要花1个byte),缺点,存取速度慢,要先存头,再存数据;先取头,再取数据;

现如今,存储空间已经不是限制了,要追求存取速度,大部分用char,与查询无关的用varchar

建表的时候,定长的数据往前放,变长的往后放,而且,一张表中,不要char和varchar混用

枚举及集合类型

enum 单选,只能在给定的范围内选一个值,如性别

sex enum('male','female','other'),

set 多选,在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)

hobbies set('play','music','read','run')

drop table test;

create table test(

id int,

name char(16),

sex enum('male','female','other'),

hobbies set('play','music','read','run')

);

插入

insert into test values(1,'jack','male','music,read');  # 集合多个值用逗号分隔

存储引擎

分类

1、InnoDB 存储引擎

2、MyISAM 存储引擎

3、NDB 存储引擎

4、Memory 存储引擎

5、Infobright 存储引擎

6、NTSE 存储引擎

7、BLACKHOLE

详见mysql性能调优篇。

约束

作用:保证数据的完整性和一致性

分类

PRIMARY KEY (PK),标识该字段为该表的主键,可以唯一的标识记录

FOREIGN KEY (FK),标识该字段为该表的外键

NOT NULL,标识该字段不能为空

UNIQUE KEY (UK),标识该字段的值是唯一的

AUTO_INCREMENT, 标识该字段的值自动增长(整数类型,而且为主键)

DEFAULT, 为该字段设置默认值

primary key

#方法一:在某一个字段后用primary key

drop table test;

create table test(

id int primary key,

name char(255)

);

#方法二:not null+unique

创建表时未指定主键,会找不为空且唯一的字段作为主键

drop table test;

create table test(

id int not null unique,

name char(255)

);

#方法三:在所有字段后单独定义primary key

drop table test;

create table test(

id int,

name varchar(255),

constraint pk_name primary key(id)

);

foreign key

建立表之间的关系

create table student(

id int primary key,

name char(255),

age int

);

# 关联的表

create table class(

id int primary key,

name char(255),

stu_id int,

foreign key(stu_id) references student(id)

on delete cascade # 删除同步

on update cascade # 修改同步

);

not null与default

drop table test;

create table test(

id int,

name char(255),

sex enum('male','female') not null default 'male'

);

unique key

单列唯一:方式一

drop table test;

create table test(

id int unique,

name char(255) unique

);

单列唯一:方式二

drop table test;

create table test(

id int,

name char(255),

unique(id),

unique(name)

);

联合唯一

drop table test;

create table test(

id int,

name char(255),

unique(id,name)

);

复合主键

drop table test;

create table test(

id int,

name char(255),

primary key(id, name)

);

auto_increment

约束字段为自动增长,增长字段必须设置为key,primary key,unique key

drop table test;

create table test(

id int primary key auto_increment,

name char(255)

);

表与表之间的关系

一对一:身份证号与姓名

一对多:一个班级有多个学生

多对多:一个老师给多个班级授课,一个班级有多位授课老师

固定套路格式

一个单表复杂且完整的sql格式是如下的样子,如果是多表,加个join及连接条件就可以了,很简单。

select distinct 字段1,字段2,字段3 # 要查询的字段或者分组字段聚合函数

from 库.表 # 从哪个表查,如果当前所在的库不是这个表所在的库,表的前面需要加上库名

where # 约束条件

group by # 分组

having # 过滤

order by # 排序

limit # 限制条数

select

select distinct 字段1,字段2,字段3 # 要查询的字段或者分组字段聚合函数

distinct

去重

from

from 库.表 # 从哪个表查,如果当前所在的库不是这个表所在的库,表的前面需要加上库名

where

where是分组之前过滤,后面是普通条件

1.比较运算符:><>= <= <> !=

2.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

3.between 10 and 100 值在10到100之间

4.in(80,90) 值是80或90

5.like 'qzcsbj%',除了%还可以_,%表示任意多字符,_表示一个字符

group by

一般来说,“每”这个字后面的字段,就是我们分组的字段

having

having是分组之后过滤,后面是聚合条件

聚合函数(以组为单位进行统计)

max,最大

min,最小

avg,平均

sum,和

count,数量

order by

默认升序,asc

降序,desc

也可以先按某个字段升序,再按某个字段降序,例如:select * from test order by id asc, name desc;

limit

limit n,默认初始位置为0,从1开始取,取n条,如果不足n条记录,那么有多少条就取多少条

limit m,n,表示位置m,从m+1开始取,取n条记录,如果不足n条记录,那么有多少条就取多少条

执行顺序

5 select

6 distinct

1 from 库.表

2 where

3 group by

4 having

7 order by

8 limit

多表查询

我们不可能把数据都存在一个表中,而是存多个表中,这就涉及到多表查询了

交叉连接

生成笛卡尔积,不适用任何匹配条件。

内连接

只取两张表的共同部分,join on

左外连接

显示左表全部记录,在内连接的基础上增加左边有右边没有的结果,left join on

右外连接

显示右表全部记录,在内连接的基础上增加右边有左边没有的结果,right join on

全外连接

显示左右两个表全部记录,在内连接的基础上增加左边有右边没有的和右边有左边没有的结果,

union,其与union all的区别是,union会去掉相同的纪录,另外,mysql不支持full join on

账号权限管理

创建新用户:CREATE USER 'test'@'localhost' IDENTIFIED BY '123456';

新用户授权:GRANT ALL PRIVILEGES ON *.* TO 'test'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;

授权(只能root操作)

*.* # 所有库下的所有表(以及表下的所有字段)都有权限

qzcsbj.* # test库下的所有表(qzcsbj数据库下所有表,以及表下的所有字段)

qzcsbj.test # qzcsbj库下test表(某一张表,以及该表下的所有字段)

columns_priv字段:id,name # 字段(某一个或几个字段),grant select(id,name),update(name) on qzcsbj.test to 'test'@'localhost';

收回权限

revoke select on qzcsbj.test from 'test'@'localhost';

刷新授权:flush privileges;

内置函数

(待补充)

数值函数

字符串函数

日期时间函数

流程控制函数

系统信息函数

索引

见性能优化篇

python操作mysql

综合练习

设计表

表关系: 下面每个表的第一个字段是主键,未建立外键,使用逻辑外键

94beaaeec337293a2cc1a2334ca68ed2.png

创建表

班级表

DROP TABLE IF EXISTS `class`;

CREATE TABLE `class` (

`cid` int(11) NOT NULL AUTO_INCREMENT,

`caption` varchar(255) NOT NULL,

`grade_id` int(11) NOT NULL,

PRIMARY KEY (`cid`)

) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

年级表

DROP TABLE IF EXISTS `class_grade`;

CREATE TABLE `class_grade` (

`gid` int(11) NOT NULL AUTO_INCREMENT,

`gname` varchar(255) NOT NULL,

PRIMARY KEY (`gid`)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

课程表

DROP TABLE IF EXISTS `course`;

CREATE TABLE `course` (

`cid` int(11) NOT NULL,

`cname` varchar(255) NOT NULL,

`teacher_id` int(11) NOT NULL,

PRIMARY KEY (`cid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

成绩表

DROP TABLE IF EXISTS `score`;

CREATE TABLE `score` (

`sid` int(11) NOT NULL AUTO_INCREMENT,

`student_id` int(11) NOT NULL,

`course_id` int(11) NOT NULL,

`score` varchar(255) DEFAULT NULL,

PRIMARY KEY (`sid`)

) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

学生表

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (

`sid` int(11) NOT NULL AUTO_INCREMENT,

`sname` varchar(255) NOT NULL,

`gender` enum('女','男') NOT NULL DEFAULT '男',

`class_id` int(11) NOT NULL,

PRIMARY KEY (`sid`)

) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

老师表

DROP TABLE IF EXISTS `teacher`;

CREATE TABLE `teacher` (

`tid` int(11) NOT NULL,

`tname` varchar(255) DEFAULT NULL,

PRIMARY KEY (`tid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

班级任职表

DROP TABLE IF EXISTS `teacher2cls`;

CREATE TABLE `teacher2cls` (

`tcid` int(11) NOT NULL AUTO_INCREMENT,

`tid` int(11) NOT NULL,

`cid` int(11) NOT NULL,

PRIMARY KEY (`tcid`)

) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

初始化数据

大家自己完成,这样可以熟悉表关系。

练习题

1.查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;

2.查询每个年级的班级数,取出班级数最多的前三个年级;

3.查询每位学生的学号,姓名,选课数,平均成绩;

4.查询每个年级的学生人数;

(文末加群获取参考答案)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mysql常用查询测试及答案: 参考链接: http://blog.sina.com.cn/s/blog_767d65530101861c.html -------------------创建如下表---------------------- 1.创建表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4), birth YEAR, department VARCHAR(20), address VARCHAR(50) ); CREATE TABLE score ( id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT, stu_id INT(10) NOT NULL, c_name VARCHAR(20), grade INT(10) ); 2.为student表和score表增加记录向student表插入记录的INSERT 语句如下: INSERT INTO student VALUES( 901,'张老大', '男',1985,'计算机系', '北京市海淀区'); INSERT INTO student VALUES( 902,'张老二', '男',1986,'中文系', '北京市昌平区'); INSERT INTO student VALUES( 903,'张三', '女',1990,'中文系', '湖南省永州市'); INSERT INTO student VALUES( 904,'李四', '男',1990,'英语系', '辽宁省阜新市'); INSERT INTO student VALUES( 905,'王五', '女',1991,'英语系', '福建省厦门市'); INSERT INTO student VALUES( 906,'王六', '男',1988,'计算机系', '湖南省衡阳市'); 向score表插入记录的INSERT语句如下: INSERT INTO score VALUES(NULL,901, '计算机',98); INSERT INTO score VALUES(NULL,901, '英语', 80); INSERT INTO score VALUES(NULL,902, '计算机',65); INSERT INTO score VALUES(NULL,902, '中文',88); INSERT INTO score VALUES(NULL,903, '中文',95); INSERT INTO score VALUES(NULL,904, '计算机',70); INSERT INTO score VALUES(NULL,904, '英语',92); INSERT INTO score VALUES(NULL,905, '英语',94); INSERT INTO score VALUES(NULL,906, '计算机',90); INSERT INTO score VALUES(NULL,906, '英语',85); --------练习及答案---------- -- 3.查询student表的所有记录 -- SELECT * FROM student -- 4.查询student表的第2条到4条记录 -- SELECT * from student LIMIT 1,4 -- 5.从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息 -- SELECT s.id,s.name,s.department FROM student s -- 6.从student表中查询计算机系和英语系的学生的信息 -- SELECT * FROM student s WHERE s.department in ('英语系','计算机系') -- 7.从student表中查询年龄18~22岁的学生信息 -- SELECT *,2015-s.birth AS age FROM student s WHERE 2015-s.birth BETWEEN 20 and 25; -- SELECT *,2015-birth AS age FROM student s WHERE 2015-birth>=18 AND 2015-birth<=2 -- 8.从student表中查询每个院系有多少人 -- SELECT department, COUNT(1) FROM student s GR

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值