Mysql基础(四):库、表、记录的详细操作、单表查询
数据库03 /库、表、记录的详细操作、单表查询
1. 库的详细操作
2.1 创建数据库
1.1 语法
create database 数据库名 charset utf8;
1.2 数据库命名规则
可以由字母、数字、下划线、@、#、$
区分大小写 -- 表名不区分
唯一性
不能使用关键字如 create select
不能单独使用数字
最长128位
基本上跟python或者js的命名规则一样
2.2 数据库的相关操作
1 查看数据库
show databases;
show create database db1;
select database(); -- 查询当前所使用的数据库
2 选择数据库
USE 数据库名
3 删除数据库
DROP DATABASE 数据库名;
4 修改数据库
alter database db1 charset utf8;
3. 表的详细操作
3.1 创建表 create
-- 语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
-- 注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选、非必须,宽度指的就是字段长度约束(指的是在内存中开辟空间的大小),
例如:char(10)里面的10
3. 字段名和类型是必须的
3.2 查看表 show
mysql> describe t1; -- 查看表结构,可简写为:desc 表名
mysql> show create table t1\G; -- 查看表详细结构,可加\G(分行去显示)
3.3 修改表 alter
1. 修改表名
alter table 表名 rename 新表名;
2. 增加字段
alter table 表名 add 字段名 数据类型 [完整性约束条件…];
-- 注意这里可以通过逗号来分割,一下添加多个约束条件
alter table 表名 add 字段名 数据类型 [完整性约束条件…];
alter table 表名 add 字段名 数据类型 [完整性约束条件…] first;
-- 添加这个字段的时候,把它放到第一个字段位置去。
alter table 表名 add 字段名 数据类型 [完整性约束条件…] after 字段名;
-- after是放到后的这个字段的后面去了,-通过一个first和一个after就可以将新添加的字段放到表的任意字段位置了。
3. 删除字段
alter table 表名 drop 字段名;
4. 修改字段
alter table 表名 modify 字段名 数据类型 [完整性约束条件…];
alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
-- change比modify还多了个改名字的功能,这一句是只改了一个字段名
alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件…];
-- 这一句除了改了字段名,还改了数据类型、完整性约束等等的内容
alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件…] after id;
5.建完表之后给字段添加外键属性
-- 给一个字段添加外键属性的语句:alter table 表2名 add foreign key(表2的一个字段) references 表1名(表1的一个字段);
注意一点:在mysql里面表名是不区分大小写的,如果你将一个名为t1的(小写的t1)改名为一个T1(大写的T1),是完全没用的,因为在数据库里面表名都是小写的。
4. 行(记录)的详细操作
4.1 介绍
1.MySQL数据操作: DML
2.在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括
- 使用INSERT实现数据的插入
- UPDATE实现数据的更新
- 使用DELETE实现数据的删除
- 使用SELECT查询数据
4.2 记录的增加(插入)insert
1. 插入完整数据(顺序插入)
语法一:
INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);
-- 指定字段来插入数据,插入的值要和你前面的字段相匹配
语法二:
INSERT INTO 表名 VALUES (值1,值2,值3…值n);
-- 不指定字段的话,就按照默认的几个字段来插入数据
2. 指定字段插入数据
语法:
INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);
3. 插入多条记录
语法: -- 插入多条记录用逗号来分隔
INSERT INTO 表名 VALUES
(值1,值2,值3…值n),
(值1,值2,值3…值n),
(值1,值2,值3…值n);
4. 插入查询结果
语法:
INSERT INTO 表名(字段1,字段2,字段3…字段n)
SELECT (字段1,字段2,字段3…字段n) FROM 表2
WHERE …;
-- 将从表2里面查询出来的结果来插入到我们的表中,但是注意查询出来的数据要和我们前面指定的字段要对应好
5.插入一条数据
INSERT INTO 表名 VALUE (值1,值2,值3…值n);
-- 只能插入一条数据
4.3 记录的修改(更新)update
语法:
UPDATE 表名 SET
字段1=值1, -- 注意语法,可以同时来修改多个值,用逗号分隔
字段2=值2,
WHERE CONDITION; -- 更改哪些数据,通过where条件来定位到符合条件的数据
4.4 记录的删除 delete
语法:
DELETE FROM 表名
WHERE CONITION; -- 删除符合条件的一些记录
delete from t3; 删除所有的数据,但是不会重置自增字段的数据号
delete from t3 where id = 1;删除指定的数据,删除id字段数据为1的那一行记录
清空表
truncate 表名; 自增字段会重置
4.5 记录的查询 select
之前写的查询语句是这样的:select id,name from employee;
实际上在select每个字段的时候,省略了一个表名,有的人可能会这样写
select employee.id,employee.name from employee;
5. 单表查询
5.1 关键字执行的优先级
执行顺序:
- 1.from
- 2.where
- 3.group by
- 4.having
- 5.select
- 6.distinct
- 7.order by
- 8.limit
具体释义:
- 1.找到表:from
- 2.拿着where指定的约束条件,去文件/表中取出一条条记录
- 3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
- 4.将分组的结果进行having过滤
- 5.执行select
- 6.去重distinct
- 7.将结果按条件排序:order by
- 8.限制结果的显示条数
四则运算:
- SELECT salary*12 FROM employee;
自定义显示格式 concat用法
- SELECT CONCAT('姓名: ',name,' 年薪: ', salary*12) AS Annual_salary FROM employee;
5.2 where约束
1. 比较运算符:> < >= <= <> != (<>相当于!=)
SELECT name FROM employee WHERE post='sale';
2. between 10 and 15 值在10到15之间
mysql> select * from employee where id between 10 and 15
3. in(80,90,100) 值是80或90或100
select * from employee where id in(1,3,6) 等价于id=1 or id=3 or id=6;
4. like 'egon%'
pattern可以是%或_, %表示任意多字符_表示一个字符
select * from employee where name like "wu%";
select * from employee where name like "al_";
select * from employee where name like "al__";
mysql> select * from employee where name like "al___";
-- 三个下划线的无法匹配到alex,结果为空
5. 逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not
select * from employee where id>10 and name like "al%";
select * from employee where not id>10; -- id小于等于10的,not取反
5.3 分组查询 group by/分组,分组的原因
分组:
- 将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等
1.select * from employee group by post;
* 分组后默认拿的是每组的第一个的数据记录
2.ONLY_FULL_GROUP_BY(严格模式)
ONLY_FULL_GROUP_BY:限制必须是分组依据,或集合函数得到的统计结果
-- 非分组依据,非统计结果对于分组就没有意义
3.分组时可以跟多个条件,那么这个多个条件同时重复才算是一组,group by 后面多条件用逗号分隔
select post,max(salary) from employee group by post,id;
4.如果我们用设置了unique约束的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义
多条记录之间的某个字段值相同,该字段通常用来作为分组的依据
5.GROUP BY关键字和GROUP_CONCAT()函数一起使用
比如说我想按部门分组,每个组有哪些员工,都显示出来,怎么搞
- SELECT post,GROUP_CONCAT(name) FROM employee GROUP BY post;
按照岗位分组,并查看组内所有成员名,通过逗号拼接在一起
- SELECT post,GROUP_CONCAT(name,':',salary) as emp_members FROM employee GROUP BY post;
5.4 聚合函数
1.聚合函数聚合的是组的内容,若是没有分组,则默认一组
注意:where后面不能写聚合函数
2.SELECT COUNT(*) FROM employee;
-- count是统计个数用的
SELECT COUNT(*) FROM employee WHERE depart_id=1;
-- 后面跟where条件的意思是统计一下满足depart_id=1这个的所有记录的个数
3.SELECT MAX(salary) FROM employee;
-- max()统计分组后每组的最大值,这里没有写group by,那么就是统计整个表中所有记录中薪资最大的,薪资的值
4.SELECT MIN(salary) FROM employee;
5.SELECT AVG(salary) FROM employee;
6.SELECT SUM(salary) FROM employee;
SELECT SUM(salary) FROM employee WHERE depart_id=3;
7.group_concat:分组后select查询的字段只能是分组依据,想要获取组内的其他相关信息,需要借助此函数
5.5 having 分组再过滤
1.having过滤后面的条件可以使用聚合函数
- select post ,max(salary) from employee group by post having max(salary)>20000;
2.having的语法格式和where是一模一样的,只不过having是在分组之后进行的进一步的过滤,where不能使用聚合函数,having是可以使用聚合函数的
- !!!执行优先级从高到低:where > group by > having
- 1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
- 2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,having是可以使用聚合函数
3.having只能在group by后面运行
5.6 distinct去重
1.select distinct post from employee;
- 注意:select的字段必须写在distinct后面
2.select distinct post,id from employee;
- 这句话,意思就是post和id两个组合在一起同时重复的才算是重复数据
3.select count(distinct post) from employee;
- distinct查询出某个字段不重复的记录的条数
5.7 order by 排序
1.升序
select * from employee order by age;
select * from employee order by age asc;
2.降序 desc
select * from employee order by age desc;
3.多条件排序
按照age字段升序,age相同的数据,按照salary降序排列
select * from employee order by age asc,salary desc;
5.8 limit 限制查询的记录数
1.取出工资最高的前三位
SELECT * FROM employee ORDER BY salary DESC LIMIT 3;
-- 默认初始位置为0,从第一条开始顺序取出三条
2.SELECT * FROM employee ORDER BY salary DESC LIMIT 0,5;
-- 从第0开始,即先查询出第一条,然后包含这一条在内往后查5条
3.SELECT * FROM employee ORDER BY salary DESC LIMIT 5,5;
-- 从第5开始,即先查询出第6条,然后包含这一条在内往后查5条
4.分页显示,每页显示5条(注意:第二数字5指的是每次显示5条记录)
mysql> select * from employee limit 0,5;
mysql> select * from employee limit 5,5;
mysql> select * from employee limit 10,5;
5.9 模糊匹配(使用正则表达式查询)
前面我们用like做模糊匹配,只有%和_,局限性比较强,所以我们说一个正则,之前我们是不是学过正则匹配,你之前学的正则表达式都可以用,正则是通用的
SELECT * FROM employee WHERE name REGEXP '^ale';
SELECT * FROM employee WHERE name REGEXP 'on$';
SELECT * FROM employee WHERE name REGEXP 'm{2}';
Mysql基础(四):库、表、记录的详细操作、单表查询的更多相关文章
- MySQL行(记录)的详细操作一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理
MySQL行(记录)的详细操作 阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: ...
- [MySQL数据库之记录的详细操作:增、改、删、单表查询、多表查询]
[MySQL数据库之记录的详细操作:增.改.删.单表查询.多表查询] 记录详细操作 增.删.改 增: insert t1(字段1,字段2,字段3) values (值1,值2,值3), (值1,值2, ...
- day 37 MySQL行(记录)的详细操作
MySQL行(记录)的详细操作 阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操 ...
- MySQL从删库到跑路(五)——SQL查询
作者:天山老妖S 链接:http://blog.51cto.com/9291927 1.查询所有字段 在SELECT语句中使用星号“”通配符查询所有字段在SELECT语句中指定所有字段select f ...
- mysql 数据操作 单表查询 目录
mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...
- mysql 数据操作 单表查询 where 约束 目录
mysql 数据操作 单表查询 where约束 between and or mysql 数据操作 单表查询 where约束 is null in mysql 数据操作 单表查询 where约束 li ...
- mysql 数据操作 单表查询 group by 分组 目录
mysql 数据操作 单表查询 group by 介绍 mysql 数据操作 单表查询 group by 聚合函数 mysql 数据操作 单表查询 group by 聚合函数 没有group by情况 ...
- MySql之行记录的详细操作,创建用户以及库表的授权
一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...
- Mysql数据库(四)表记录的更新操作
一.插入表记录 1.使用INSERT...VALUES语句插入新纪录 (1)插入完整数据 mysql> desc tb_manager; +-------+------------------+ ...
随机推荐
- 实现简易版react中createElement和render方法
function createElement(type, config, children) { // 1. 创建一个对象 // 2.根据参数config修改这个对象 // 3.把children参数 ...
- c# 不同单例的不同意义
前言 在c#,可能有很多五花八门的单例给你选择,分什么懒汉模式等等什么模式,其实不同的写法对程序是有一定影响的. 正文 为什么需要单例呢?其实我们自己是可以控制单例的,只是单例模式给了我们一个好的设计 ...
- Swift 界面跳转
iOS开发中界面跳转有两种方式,上下跳转和左右跳转. 上下跳转_TO: let secondViewController = SecondViewController() self.presentVi ...
- Oracle调用Java方法(上)如何使用LoadJava命令和如何将简单的Jar包封装成Oracle方法
最近在工作中遇到了遇到了一个需求需要将TIPTOP中的数据导出成XML并上传到FTP主机中,但是4GL这方面的文档比较少最终决定使用Oracle调用Java的方法,在使用的过程中发现有很多的坑,大部分 ...
- CentOS7 开机进入emergency mode
今天突然操作了一下磁盘挂载,然后系统启动之后,就直接进入emergency模式了,然后只能输入密码进行救援,截图如下: 突然想了一下最近的一次操作,是因为要挂在镜像,然后每次开机都要挂载一次,觉得比较 ...
- Merge,Rebase,Cherry-Pick 一文解惑
代码合并在日常开发中是较为常见的场景,采用合适的合并方式,可以起到事半功倍的效果.对应在 Git 中合并的方式主要有三个,Merge,Rebase,Cherry-Pick. 开始部分会首先介绍一下这三 ...
- synchronized与锁升级
1 为什么需要synchronized? 当一个共享资源有可能被多个线程同时访问并修改的时候,需要用锁来保证数据的正确性.请看下图: 线程A和线程B分别往同一个银行账户里面添加货币,A线程从内存中读取 ...
- SpringBoot 2.0 编程方式配置,不使用默认配置方式
SpringBoot的一般配置是直接使用application.properties或者application.yml,因为SpringBoot会读取.perperties和yml文件来覆盖默认配置: ...
- 入门大数据---Hbase 过滤器详解
一.HBase过滤器简介 Hbase 提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predic ...
- MongoDB快速入门教程 (4.4)
4.5.Mongoose索引和方法 4.5.1.设置索引 let UserSchema = mongoose.Schema({ sn: { type: Number, // 设置唯一索引 unique ...