使用如下命令进行查询所有的数据库
mysql> show databases;
查询结果如下:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema | |
+--------------------+
5 rows in set (0.00 sec)
MySQL5.7默认有这几个数据库:information_schema、mysql、performance_schema、sys。
information_schema
提供了访问MySQL服务器的数据库元数据、信息(诸如数据库名或表名、字段的数据类型或访问权限)的方式。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。
mysql
配置数据库,记录用户权限、帮助、日志等信息。
performance_schema
主要用于收集数据库服务器性能参数 ,性能数据。
sys
一组对象来帮助DBAs和开发人员翻译从 Performance Schema收集的数据。sys schema对象可以用于典型的调优和诊断用例。
1.2 创建数据库
通过如下命令创建数据库
create database db_name ;
创建时还可以指定默认字符集
create database db_name default character set utf8 ;
default character set= utf8 指定默认字符集utf-8创建数据库,等号可以省略。
1.3 查看数据库信息与修改数据库的默认字符集
通过如下命令查看数据库的信息
show create database db_name;
或
show create schema db_name;
通过如下命令修改数据库默认的字符集
alter database db_name character set=charset;
如设置数据库db的字符集为utf-8
alter database db character set= utf8;
1.4 删除数据
通过如下命令删除数据库,此操作不可撤销
drop database db_name;
2.1 表的操作
在我们操作一个表之前,我们要先打开它所在的数据库,通过如下命令打开:
use db_name;
2.2 创建表
通过如下命令创建表
create table table_name(字段1 类型,字段2 类型 , … ) ;
如下示例创建一个学生表:
mysql> create table student(
-> sid int,
-> sname varchar(20),
-> sage int
-> );
在创建表的时候还可以为字段添加约束(非空、主键、外键、唯一、自增长、默认等),设置默认引擎,默认字符集,如下示例:
CREATE TABLE `db` (
`id` int primary key,
`db` double DEFAULT NULL,
`dm` decimal(10,0) DEFAULT NULL,
`gender` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
通过desc 查看创建的表如下
mysql> desc db_table;
+--------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| db | double | YES | | NULL | |
| dm | decimal(10,0) | YES | | NULL | |
| gender | int(11) | YES | | NULL | |
+--------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
2.3 查看表结构与查看所有表
查看表结构
在上面我们通过desc table_name查看了表的结构,我们还可以通过如下命令来查看:
DESCRIBE table_name; 或SHOW CREATE TABLE table_name;
诸如我们通过SHOW CREATE TABLE table_name; 来查看 db_table表的结构
mysql> show create table db_table;
+----------+------------------------------------------------------------------------+
| Table | Create Table |
+----------+--------------------------------------------------------------------------
| db_table | CREATE TABLE `db_table` (
`id` int(11) NOT NULL,
`db` double DEFAULT NULL,
`dm` decimal(10,0) DEFAULT NULL,
`gender` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+------------------------------------------------------------------------
1 row in set (0.00 sec)
查看所有表
使用命令 show tables; 来查看所有表。如下所示:
mysql> show tables;
+--------------+
| Tables_in_yu |
+--------------+
| db_table |
| human |
| jdbc |
| number |
| person |
+--------------+
5 rows in set (0.00 sec)
2.4 删除表
使用如下命令来删除一个表
drop table table_name ;
2.5 修改表
2.5.1 修改表名
修改表名的命令如下, to可省略:
alter table old_table_name rename to new_table_name ;
2.5.2 添加字段
1 新添加的字段默认添加到末尾,命令示例如下,COLUMN可省略:
ALTER TABLE db_name ADD COLUMN field_name VARCHAR(50);
2 添加字段到表的第一个位置,使用 first
ALTER TABLE db_name ADD COLUMN address VARCHAR(50) first;
执行上面命令后再查看表,发现address被添加到第一个位置
mysql> desc db_table;
+---------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| address | varchar(50) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| db | double | YES | | NULL | |
| dm | decimal(10,0) | YES | | NULL | |
| gender | int(11) | YES | | NULL | |
+---------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
3 添加字段到指定字段后的位置,使用after
alter table db_table add column name varchar(20) after id
执行上面命令后再查看表:
mysql> desc db_table;
+---------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| address | varchar(50) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| db | double | YES | | NULL | |
| dm | decimal(10,0) | YES | | NULL | |
| gender | int(11) | YES | | NULL | |
+---------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
2.5.3 修改字段类型
诸如想将db_table表的name字段的类型修改为text,可执行如下命令:
alter table db_table modify column name text ;
2.5.4 修改字段名称
通过change命令来修改一个字段的名字,诸如想将db_table表的db字段更名为dl,可执行如下sql语句:
alter table db_table change column db dl double ;
2.5.5 删除字段
通过drop命令来删除字段,如下删除db_table表的dm字段:
alter table db_table drop dm;
执行上sql语句后查看表,如下看出name字段的类型被更改为text、db字段被更名为dl,dm字段被删除了。
mysql> desc db_table;
+---------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| address | varchar(50) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | text | YES | | NULL | |
| dl | double | YES | | NULL | |
| gender | int(11) | YES | | NULL | |
+---------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
2.6.0 创建一张表
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(20) DEFAULT NULL,
`age` int(4) DEFAULT NULL,
`gender` char(6) DEFAULT NULL,
`salary` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
2.6.1 插入数据
1 插入所有字段。
依次按顺序插入
insert into person values(1,’niko’,20,’male’,20000);
注意插入不能少或多字段值 , 如下错误
INSERT INTO person VALUES(2,’halo’,’female’); // 错误,字段少了,插入不完整
2 插入部分字段
指定插入的数据字段,依次插入
insert into person(name,age,gender) values(‘helen’,20,’female’);
2.6.2 更新数据
1 修改所有字段数据
不推荐使用此方式,一修改全被修改。除非有特殊需求
update person set gender=’male’;
2 带条件的修改,
推荐使用此方式,可以有选择的修改。诸如修改id为2的学生性别为female
update person set gender=’female’ where id=2;
3 修改多个字段,分号隔开。语法: SET 字段名=值,字段名=值 , ….
update person set age=25,name=’kity’ where id=2;
2.6.3 删除数据
1 delete删除所有数据
建议少用,除非特殊需求
delete from person;
2 delete带条件的删除
推荐使用,较为灵活
delete from person WHERE id=2 ;
3 使用TRUNCATE删除
TRUNCATE TABLE person;
TRUNCATE 不可带条件删除,如下错误
truncate table human where id=4; (错误)
4 delete与TRUNCATE的比较
delete TRUNCATE
可以全表删除 可以全表删除
可以带条件删除 不能带条件删除
只能删除表的数据,不能删除表的约束 既可以删除表的数据,也可以删除表的约束
删除的数据可以回滚 删除的数据不可以回滚
2.6.4 查询数据
通过select … from 查询数据
2.6.4.1 查询所有字段
语法: select * from table_name;
还可以在选择时列出所有字段名来替代*,这种方式灵活但要做更多的处理。两种方式的使用视情况而定。
2.6.4.2 查询指定字段
语法: select field_x,field_y,field_z, … from table_name;
要想控制显示的结果,只需调整sql语句中字段的位置即可。选择gender,name 两列 ,示例如下:
mysql> select gender,name from person;
+--------+-------+
| gender | name |
+--------+-------+
| male | niko |
| female | kity |
| male | peter |
| male | kity |
+--------+-------+
4 rows in set (0.00 sec)
2.6.4.3 查询并添加常量字段
添加常量列,字段名为国籍,值为天朝
select name,age,’天朝’ as ‘国籍’ from person;
如下:
mysql> select name,age,'天朝' as '国籍' from person;
+-------+------+------+
| name | age | 国籍 |
+-------+------+------+
| niko | 20 | 天朝 |
| kity | 25 | 天朝 |
| peter | 22 | 天朝 |
| kiy | 25 | 天朝 |
+-------+------+------+
4 rows in set (0.03 sec)
2.6.4.4 查询去重(DISTINCT)
查询非重复的gender
mysql> select distinct gender from person;
+--------+
| gender |
+--------+
| male |
| female |
+--------+
2.6.4.5 查询时的数学四则运算
在执行查询的同时,我们可能会对查询的字段执行一些简单的数学运算,如下列出了所支持的运算:
运算符 描述
+ 加法
- 减法
* 乘法
/ 除法
% (mod) 求余
以加法为例。将列对应的内容求和, 如合并age与salary列
select age,salary, (age+salary) as ‘和’ from person;
查询结果如下所示:
mysql> select age,salary, (age+salary) as '和' from person;
+------+--------+-------+
| age | salary | 和 |
+------+--------+-------+
| 20 | 30000 | 30020 |
| 25 | 30000 | 30025 |
+------+--------+-------+
注意:只能对数值类型的字段进行运算。
2.6.4.6 条件查询
有如下查询条件:
1. where条件查询
2. 逻辑条件:
运算符 说明
and 与
or 或
not 非
xor 逻辑异或
3. 比较条件:
运算符 说明
> 大于
< 小于
>= 大于等于
<= 小于等于
= 等于
<>(不等于) 不等于
between and (等价于>= 且 <=) 在… 之间
4. 判空条件 : 包括 null和 空字符串:
条件 说明
is null 为null
is not null 不为null
=” 为空字符串
<>” 不为空字符串
注意: null与空字符串的区别:null表示没有值,空字符串是有值的
5. 模糊条件: like
常见占位符:
% : 匹配任意个字符 , _ : 匹配一个字符
使用示例如下:
where条件查询、逻辑条件
-- 查询id为4,且姓名为peter的性别
mysql> select gender from person where id=4 and name='peter' ; 交集
-- 查询id为5,或姓名为niko的名字
mysql> select name from person where id=5 or name='niko'; 并集
比较条件
-- Salary大于30000的人
mysql> select name from person where salary>30000 ;
-- salary大于20000并且小于40000的人
mysql>select name from person where salary>20000 and salary<40000;
-- 选出id不为4的人
mysql>select name from person where id<>4;
between and (等价于>= 且 <= , 包前包后 )
salary大于等于20000并且小于等于40000的人
mysql> select name from person where salary between 20000 and 40000;
判空条件(null 空字符串): is null / is not null / =” / <>”
-- 判断null
SELECT * FROM person WHERE salary IS NULL ;
-- 判断空字符串
SELECT * FROM person WHERE salary ='';
-- 查询salary为空的人 包括null和空字符串
SELECT * FROM person WHERE salary IS NULL OR salary ='';
-- 查询有地址的人(不包括null和空字符串)
SELECT * FROM person WHERE salary IS NOT NULL AND salary <>'';
模糊条件: like
通常使用以下替换标记:
% : 表示任意个字符
_ : 表示一个字符
-- 查询名字中有o的人
select name from person where name like '%o%';
-- 查询名字以k开头且只有三个字母的人
mysql> select name from person where name like 'k_ _';
2.6.4.7 排序查询
使用order by来进行字段数据的排序,有升序与降序之分。默认情况下,按照插入时记录顺序排序。既可以使用单字段来排序,也可以使用多个字段来排序(多个字段条件用分号隔开)。
语法: select …. from table_name order by 字段 asc / desc ;
asc: 顺序,正序。数值:递增 ; 字母:自然顺序(a-z)
desc: 降序,反序。数值:递减 ; 字母:自然反序(z-a)
--按照id顺序排序
select *from person order by id asc;
-- 默认正序
SELECT * FROM student ORDER BY id;
-- 反序
select *from person order by id desc;
-- 多个字段排序条件 , 按照id正序,按照salary倒序
select *from person order by id asc,salary desc;
2.6.4.8 聚合查询
使用聚合函数的查询
语法:select function(field) from table_name where condition;
常用的聚合函数:
函数 功能 说明
sum(field) 求和 忽略null值
avg(field) 平均值 忽略null值
max(field) 最大值 忽略null值
min(field) 最小值 忽略null值
count(field) 统计字段有效数量 忽略null值
count(*) 通过所有行 不忽略null值
使用示例:
-- 查询salary 的总和(sum() :求和函数)
select sum(salary) from person;
-- 查询平均salary
select avg(salary) from person;
-- 查询当前最高salary
select max(salary) from person;
-- 查询最salary
select min(salary) from person;
-- 统计当前有多少个salary值 (count(字段))
select count(salary) from person;
注意:
1)使用count(field)函数统计的数量不包含为null的数据,若使用count统计表的记录数,要使用不包含null值的字段,而使用count(*)时将不会忽略null,统计所有。
2)使用聚合函数查询时,不能和having一起使用。
3)当所操作的表为空表时,count()返回0,其他函数则返回null
2.6.4.9 limit限制查询
使用limit查询指定范围的数据
1 不指定初始查询位置
语法1: select … from table_name limit count;
从第第一条记录开始查询,count表示查询的行数。
mysql> select *from person limit 2;
+----+------+------+--------+--------+
| id | NAME | age | gender | salary |
+----+------+------+--------+--------+
| 1 | niko | 20 | male | 30000 |
| 2 | kity | 25 | female | 30000 |
+----+------+------+--------+--------+
2 rows in set (0.00 sec)
2 指定初始查询位置(分页查询)
语法2: select … from table_name limit 起始行,查询行数
注意: 起始行从0开始
分页:当前页+ 每页显示多少条 , 分页查询当前页数据的sql语句:
select * from table_name limit (当前页-1)*每页显示多少条,每页显示多少条;
-- 查询第1,2条记录(第1页的数据)
select *from person limit 0,2;
-- 查询第3,4条记录(第2页的数据)
select *from person limit 2,2;
-- 查询第5,6条记录(第3页的数据)
select *from person limit 4,2;
-- 查询第7,8条记录 (没有记录不显示)
SELECT * FROM student LIMIT 6,2;
Empty set (0.00 sec)
2.6.4.10 分组查询
1 单字段group by对查询结果进行分组
语法: select … from table_name group by 字段 ;
-- 把人按照性别分组(GROUP BY gender), 并统计每组的人数(COUNT(*))
select gender, count(*) from person group by gender;
2 使用group_concat()函数显示分组字段值
语法: select group_contact(field) from table_name group by field
比如当我们以gender分组后,我们还希望查看每个分组有哪些人
mysql> select gender,group_concat(name), count(*) from person group by gender;
+--------+--------------------+----------+
| gender | group_concat(name) | count(*) |
+--------+--------------------+----------+
| female | kity,ll,helen | 3 |
| male | niko,peter,kiy | 3 |
+--------+--------------------+----------+
2 rows in set (0.00 sec)
3 多字段group by对查询结果进行分组
语法: select … from table_name group by 字段1,字段2 ;
在上面的搜索结果中,我们还希望查看每个分组的salary详情,如下:
mysql> select gender,group_concat(name),salary, count(*) from person group by gender,salary;
+--------+--------------------+--------+----------+
| gender | group_concat(name) | salary | count(*) |
+--------+--------------------+--------+----------+
| female | kity,ll,helen | 30000 | 3 |
| male | niko | 30000 | 1 |
| male | peter,kiy | 40000 | 2 |
+--------+--------------------+--------+----------+
3 rows in set (0.00 sec)
4 having字句限定分组查询
分组查询后可以对结果进行一次筛选,使用having关键字
语法: select … from table_name group by 字段 having 条件;
例:查询性别总人数大于3的一组
-- 查询男女的人数筛选出人数大于2的记录(having)
select gender, count(gender) from person group by gender having count(*)>=3;
注意: 分组之前条件使用where关键字,分组之前条件使用having关键字
2.6.4.11查询并指定格式输出
查询时,有时我们希望以一种自己定义的格式输出,以便于查看。MySQL提供了concat() 函数来连接字符串,以便我们能够设置输出的格式
比如我们想将person表的数据连成一句输出,就可以执行如下sql语句:
select concat(‘这个人的id:’,id,’ , 姓名:’,name,’ , 年龄:’,age,’ , 性别:’,gender, ’ , 工资:’,salary) from person;
如下输出:
+---------------------------------------------------------------------------------------------------+
| concat('这个人的id:',id,' , 姓名:',name,' , 年龄:',age,' , 性别:',gender, ' , 工资:',salary) |
+---------------------------------------------------------------------------------------------------+
| 这个人的id:1 , 姓名:niko , 年龄:20 , 性别:male , 工资:30000 |
| 这个人的id:2 , 姓名:kity , 年龄:25 , 性别:female , 工资:30000 |
| 这个人的id:4 , 姓名:peter , 年龄:22 , 性别:male , 工资:40000 |
| 这个人的id:5 , 姓名:kiy , 年龄:25 , 性别:male , 工资:40000 |
| NULL |
+---------------------------------------------------------------------------------------------------+-------------------+
2.6.4.12 带in关键字的集合查询
关键字in用来查询某个字段的值是否在指定的一个集合之中。使用in关键字来实现条件查询,语法如下:
select field1 , field2 , field3 , … , fieldn from table_name where fieldx in (value1,value2,…);
如下示例:
mysql> select id, name,age,salary from person where id in (1,2,4);
+----+-------+------+--------+
| id | name | age | salary |
+----+-------+------+--------+
| 1 | niko | 20 | 30000 |
| 2 | kity | 25 | 30000 |
| 4 | peter | 22 | 40000 |
+----+-------+------+--------+
3 rows in set (0.02 sec)
同样的,我们可以使用not in来表示某字段不再一个集合之中。具体使用与in类似,就不贴示例了
注意事项:如果使用的是in关键字,当查询的集合有null值时,不会对查询的结果造成影响。如果是使用 not in 关键字,当集合中存在null值时,则查询结果总为空。
如下示例:
-- 使用 not in ,当有null值时,对查询结果造成影响
mysql> select id, name,age,salary from person where id not in (1,2,null);
Empty set (0.00 sec)
-- 使用in ,当有null值时,对查询结果无影响
mysql> select id, name,age,salary from person where id in (1,2,null);
+----+------+------+--------+
| id | name | age | salary |
+----+------+------+--------+
| 1 | niko | 20 | 30000 |
| 2 | kity | 25 | 30000 |
+----+------+------+--------+
2 rows in set (0.00 sec)
2.7.1多表查询:
内连接查询:
select * from emp inner join dep on emp.dep_id=dep.id;
2.7.2左外连接查询:
select * from emp left join dep on emp.dep_id=dep.id;
2.7.3完整性约束:
主键约束:
primary key : 非空(not null )且 唯一 (unique)
外键约束(关联字段):
2.7.4表关系:
表与表的关系(两张表)
一对多
将关联字段设置在多的表中
CREATE TABLE emp(
id INT PRIMARY KEY ,
name VARCHAR (20),
dep_id INT ,
FOREIGN KEY (dep_id) REFERENCES dep(id)
)
多对多
借助第三张表实现的
CREATE TABLE STUDENT2TEACHER(
id INT PRIMARY KEY auto_increment,
studnet_id INT ,
teacher_id INT ,
FOREIGN KEY (studnet_id) REFERENCES student(id),
FOREIGN KEY (teacher_id) REFERENCES teacher(id),
)
一对一
将关联字段设为Unique
CREATE TABLE author(
id INT PRIMARY KEY ,
name VARCHAR (20),
authorDetial_id INT unique,
FOREIGN KEY (dep_id) REFERENCES dep(id)
)