MySQL个人学习笔记-仅供参考
简介
数据库的作用:数据存储
数据库本质上就是个文件系统,而且存储的数据可以实现持久化存储
DBS:—>数据库系统:由数据库、数据库管理员、数据库管理系统构成
DBMS:—>数据库管理系统:是一种用于操纵和管理数据的软件,用于建立、使用、维护数据库。因此数据库的安全性、健壮性、可扩展性都得到了提升
DBA:—>数据库管理员:DBA使用DBMS来管理DB
DB:—>数据库:本质上是一个个的文件
当前数据库分为两大类:关系型数据库和非关系型数据
关系型数据库(relational database):存放数据的结构是表,首先要有数据库,再在数据库中创建表,然后在表中存放数据。关系型数据库内部,表与表之间是可以建立关联的。
- 优点:数据结构鲜明、容易管理
- 缺点:如果数据量过于庞大,那么在操作数据时,效率相对来说过于底下
- 典型软件:oracle,DB2,sqlServer,mysql…
非关系型数据库:(NoSql)结构简单,数据与数据之间没有关系。通常用做数据缓存(比如:redis缓存框架)
- 优点:在架构层面做到了易扩展、数据库庞大时,性能也会很高
- 典型软件:Redis、MongoDB
SQL
SQL就是结构化的查询语言(structured query language)
特点:
是一种具有特殊目的的编程语言,是用来完成数据库查询和设计的语言,用于对数据进行更新和查询,创建数据库、创建表等…
想要操作数据库,想要操作数据库,想要完成对数据库的任何改动,必须使用SQL,因为数据库能够识别的语言只有SQL
DDL(data definition language)数据定义语言 :
针对数据库或者表结构的创建、修改、删除,通俗来说就是定义数据存储结构的sql语句,关键字:
create
,alter
,drop
,show
…DML(data manipulation language)数据操作语言:
主要操作数据表中数据的增删改(添加,删除,修改),关键字:
insert
,delete
,update
DQL(data query language)数据查询语言:
主要针对数据的查询操作,关键字
select
DCL(data control language)数据控制语言:主要用来创建用户,设置权限,回收权限等,关键字:
grant
(授权),revoke
(回收权限)- 重要数据的操作,是会签订保密、安全协议的,这个是具有法律效应的
- 通常其他人没有删除的操作权限
- 数据库都是有备份的
TCL(transaction control language)数据事务语言:主要用来数据库操作的事务,关键字:
commit
,rollback
等CCL(cursor control language)指针控制语言:
SQL语句的书写规范:
- sql语句不区分大小写,也就是对大小写不敏感。但是要注意,不区分大小写的是sql语句的关键字,但是自定义的内容严格区分大小写
- sql语句关键字与内容之间使用空格隔开,目的在确保sql语句正确的前提下,提高代码的可读性
- 每一条sql语句中
DDL
数据库操作
打开命令提示窗:
win+r-->cmd
登录数据库:
mysql -uroot -p密码
查看所有的数据库:
show databases;
创建数据库
#创建数据库 create database 数据库名称; #判断数据是否存在之后再创建 create database if not exists 数据库名; #如果还要考虑数据库中的编码格式的话(编码用""引起来,例:"utf8") create database if not exists 数据库名 character set "编码格式"(gbk|utf8);
使用和切换数据库
use 数据库名称;
修改数据库的编码格式
alter database 数据库名称 character set "编码格式";
查看当前数据库的创建信息
show create database 数据库名称;
删除数据库
drop database 数据库名称;
常用数据类型
数字
- 整数:
tinyint
,int
- 浮点:
float
,double
- 整数:
字符–>字符串–>值加引号(‘’)
- 可变字符
varchar
- 不可变字符
char
- 可变字符
日期
date
:年月日datetime
:年月日时分秒 最大取值 9999年12月31日 23时59分59秒timestamp
:年月日时分秒 最大取值 2037年12月31日 23时59分59秒,当转换时区的时候,时间随着时区转换而转换
表结构操作
创建表格
create table 表名(列名1 数据类型(长度),列名2 数据类型(长度)......); #当列的数据类型为整数和日期的时候,长度是可以省略的
查看表结构
desc 表名;
修改表名
alter table 旧表名 rename 新表名;
查看创建表的相关信息
show create table 表名;
查看当前数据库所有的表
show tables;
在表格的末尾添加一个新的列
alter table 表名 add 列名 数据类型(长度);
在表的最前面添加一个新的列
alter table 表名 add 列名 数据类型(长度) first;
在表中指定列后面添加一个新的列
alter table 表名 add 列名 数据类型(长度) after 指定的列名;
修改表中列的数据类型
alter table 表名 modify 列名 数据类型;
修改表中列的名称
alter table 表名 change 旧列名 新列名 数据类型(长度);
修改表中列的类型和长度
alter table 表名 modify 列名 新类型 新约束;
删除列
alter table 表名 drop 列名;
删除表
drop table 表名;
案例:
#创建一个表 stu,包含学号sno,姓名sname,年龄age,生日bir CREATE TABLE stu(sno INT,sname VARCHAR(100),age INT,bir DATE ); #将stu表改名为stu1 ALTER TABLE stu RENAME stu1; #向stu1中添加一个sex列 ALTER TABLE stu1 ADD sex VARCHAR(10); #将sex列的类型改变为tinyint类型 ALTER TABLE stu1 MODIFY sex TINYINT; #将sex列改变为gender ALTER TABLE stu1 CHANGE sex gender TINYINT; #将gender列删除掉 ALTER TABLE stu1 DROP gender;
DML
数据库操作语言—>增删改
添加insert
添加一行数据
注意事项:
- 如果只添加一条数据,使用
values
,如果想要一次性添加多条数据,使用value
- 字段的个数与类型要与值的个数与类型一致
字段=列
- 如果想要为字段赋值为空:不写此字段或直接为此字段赋值为
null
- 现在要为表中所有字段完成赋值:将字段挨个写出来或忽略字段的书写,直接写
value
,但在写值时要注意个数、顺序与类型要与表中字段完全一致 - 在一次性添加多行数据时,那么数据与数据之间用逗号分隔
- 如果只添加一条数据,使用
insert into 表名(列名1,列名2,...)values(值1,值2,...);
添加多行数据
insert into 表名(列名1,列名2,...)values(值11,值12,...),(值21,值22,...),...;
单行注释
#这是一个单行注释 -- 这也是一个单行注释(注意:这里--后有空格)
多行注释
/*这是一个多行注释 */
案例
#添加一行数据 INSERT INTO demo01(sno,sname,age,sex,bir)VALUES('001','张三',23,'男','1998-6-16'); #向demo01表中添加一行数据(sno,sname) INSERT INTO demo01(sno,sname)VALUES('002','李四'); /*当向一行中所有的列添加数据的时候,可以简写成insert into 表名 values(值1,值2,...);值1,值2,...等一些值必须按照表的顺序进行添加,不可改变位置 */ INSERT INTO demo01 VALUES ('003',22,'王五','男','1999-3-18'); #添加多行数据 INSERT INTO demo01 VALUES ('004',23,'赵六','女','1998-5-22'),('005',23,'小明','男','1998-10-19'),('006',21,'小红','女','2000-1-18');
修改update
注意事项:
- 修改时没有条件,那么表中所有的记录修改字段的值都会成为一致状态
- 修改时有条件,先通过条件筛选出满足的记录,修改这些满足条件的记录中字段的值
- 一次性改变多个字段的值时,多个字段之间使用逗号分隔
- 修改后的值,
update 表名 set 列名1=新值,列名2=新值,... where 条件(列名=值);
案例:
#将名字为小明的生日修改为1998-11-28 UPDATE demo01 SET bir='1998-11-28' WHERE sname='小明'; #将编号为002的年龄修改为18,生日修改为2003-3-23 UPDATE demo01 SET age='18',bir='2003-3-23' WHERE sno='002'; #将编号为004的学生姓名改为赵小六 UPDATE demo01 SET sname='赵小六' WHERE sno='004';
删除delete
注意事项:
删除时没有条件,将表中所有记录删除
删除时携带条件,将满足条件的记录删除
delete from 表名 where 条件(列名=值);
截断truncate
truncate table 表名;
案例:
#删除编号为005的学生信息 DELETE FROM demo01 WHERE sno='005'; #删除男同学信息 DELETE FROM demo01 WHERE sex='男'; #截断表(清空表) TRUNCATE TABLE demo01; #删除表(清空表) DELETE FROM demo01;
DQL
查询select
基本查询
select 列名1,列名2,... from 表名;
去重查询
select distinct 列名 from 表名;
设置别名
别名的设置方法:
as 别名
或者 省略as
直接写别名
#设置列的别名 select 列名1 as 别名1, 列名2 别名2 from 表名; #设置表的别名 select 别名.字段1 , 别名.字段2 from 表名 别名;
查询整个表
select * from 表名;
条件查询
select 列名 from 表名 where 条件(列名=值);
条件中可以使用的关系符号:大于> 大于等于>= 小于< 小于等于<= 不等于!=或<> 等于=或<=>
=
和<>
只能判断查询该字段值不为null
;<=>
和!=
可以判断查询该字段值为null
;判断为空时可以使用is null
;判断不为空时可以使用is not null
或者not(字段名 <=> null)
案例:
#查询表中所有数据 SELECT sno,sname,age,sex,bir FROM demo01; #查询sno和sname信息 SELECT sno,sname FROM demo01; #给列名取别名(关键字as->但是往往省略不写)select 列名 as 别名 from 表名; #别名类似于绰号,不改变数据库的原名称 SELECT sno AS 学生编号,sname AS 学生姓名 FROM demo01; SELECT age 年龄,bir 生日,sex 性别 FROM demo01;#查询学生编号为004的学生信息 SELECT * FROM demo01 WHERE sno = '004'; #查询学生年龄大于22的学生信息 SELECT * FROM demo01 WHERE age > 22; #查询学生姓名张三之外的其他学生信息 SELECT * FROM demo01 WHERE sname <> '张三';#相当于查询学生姓名不等于张三的学生信息 SELECT * FROM demo01 WHERE sname != '张三'; #查询学生姓名为null的学生信息 SELECT * FROM demo01 WHERE sname <=> NULL; SELECT * FROM demo01 WHERE sname IS NULL; #查询学生姓名不为null的学生信息 SELECT * FROM demo01 WHERE sname != NULL; SELECT * FROM demo01 WHERE sname IS NOT NULL; SELECT * FROM demo01 WHERE sname NOT(sname <=> NULL);
and|or|not|in|between…and…关键字的用法
and
同时满足两个条件or
满足两个中的一个条件或两个都个满足not
不满足该条件in
在给定的数值中选择满足的值–>or的简化写法(同一个列取多个值的时候)between A and B
在[A,B]的范围区间内取值,AB的数据类型:数字|日期
案例:
#查询学生性别为男,并且年龄大于20的学生信息 SELECT * FROM demo01 WHERE sex='男' AND age>20; #查新学生编号为002,005,008的学生信息 SELECT * FROM demo01 WHERE sno='002' OR sno='005' OR sno='008'; SELECT * FROM demo01 WHERE sno IN ('002','005','008'); #查询年龄在21到22之间的学生信息 #不用bewteen...and... SELECT * FROM demo01 WHERE age>=21 AND age<=22; #使用bewteen...and... SELECT * FROM demo01 WHERE age BETWEEN 21 AND 22; #查询生日为1998年5月份的学生信息 SELECT * FROM demo01 WHERE bir BETWEEN '1998-05-01' AND '1998-05-31';
null | is null| is not null 关键字用法
null
为空:具体值is null
为空:逻辑判断条件is not null
不为空:逻辑判断条件
案例:
#将学生编号为002的学生年龄信息改为空null UPDATE demo01 SET age=NULL WHERE sno='002'; #查询年龄为空的学生信息 SELECT * FROM demo01 WHERE age IS NULL; #查询年龄不为空的学生信息 SELECT * FROM demo01 WHERE age IS NOT NULL;
列当中值的去重复:distinct或者distinct()–>分组在一定程度上也是有去重功能的
案例:
SELECT DISTINCT(age) FROM demo01;
约束
主要作用:规范表中列的值,让数据更加合理
主键约束、非空约束、默认约束、唯一约束、外键约束
主键约束primary key:
- 作用:字段的值非空且唯一,主键的作用就是用来唯一标识一条记录的。主键这个字段与表中正常数据的字段是无关系的,主键是不具备含义的字段。主键的字段名通常都是以
id
结尾,而且主键的字段类型通常都是int
类型 - 意义:检索的时候速度快
- 注意:一个表中只有一个主键,一个主键可以是多个列
- 在创建表的时候添加约束即可,在列的后边直接添加
primary key
CREATE TABLE demo02(id INT PRIMARY KEY, NAME VARCHAR(100) ); INSERT INTO demo02 VALUES (1,'张三'); #insert into demo03 values (1,'李四');#会报错,主键不能重复
- 一般情况下,当一个列作为一个主键列的时候,因为主键是非空且唯一的,那么我们自己手动维护,难免会出现重复值的情况,所以针对主键,提供了一种自增长的机制,可以帮助我们去维护主键的值
- 作用:字段的值非空且唯一,主键的作用就是用来唯一标识一条记录的。主键这个字段与表中正常数据的字段是无关系的,主键是不具备含义的字段。主键的字段名通常都是以
自增auto_increment
特点:
- 只有整型主键才可以用自增长修饰
- 只有主键字段才能使用自增长修饰
- 自增长的主键在赋值时,可以给
null
,会做值的自动累加 - 初始值为1,每次累加1
- 自增的值一旦出现,不能重复,而且累加默认从最大值往后累加
CREATE TABLE demo03(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(100) ); INSERT INTO demo03 (NAME) VALUE ('张三'); #运行多少次也不会报错 #运行时id值每次在该列中找到最大值(所有该列中出现过的id中的最大值)加一
非空约束not null
字段的值不能为空,添加位置与主键约束的添加位置相同;可以创建表的时候添加,也可以创建之后再添加(
null
值不等于空字符串)CREATE TABLE demo04(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(100) NOT NULL ); INSERT INTO demo04 (NAME) VALUE ('');#空字符串与字符为空是不同的两个概念,二者不相等 #INSERT INTO demo04 (NAME) VALUE (null);#报错,违反非空约束
如果触犯了非空约束:
column '列名' cannot be null
默认约束default
如果想要选取默认值:
- 忽略此字段的赋值
- 为该字段赋值为default
如果想要改变默认约束字段的值,那么就需要我们手动赋值
CREATE TABLE demo05(id INT PRIMARY KEY AUTO_INCREMENT,#编号为主键NAME VARCHAR(100) NOT NULL,#姓名值不为空age INT DEFAULT 18#年龄默认18岁 ); INSERT INTO demo05 (NAME) VALUE ('珊珊'); SELECT * FROM demo05; INSERT INTO demo05 (NAME,age) VALUES ('珊珊',20); SELECT * FROM demo05; INSERT INTO demo05 VALUES ('珊珊',default); SELECT * FROM demo05;
唯一约束unique
字段的值不能重复
CREATE TABLE demo06(id INT PRIMARY KEY AUTO_INCREMENT,#主键NAME VARCHAR(100) NOT NULL,#值不为空age INT DEFAULT 18,#默认18岁tel VARCHAR(50) UNIQUE#电话号码唯一 ); INSERT INTO demo06 (NAME,tel) VALUES ('凉凉',''); #INSERT INTO demo06 (NAME,tel) VALUES ('亮亮','');#报错,违反唯一约束 INSERT INTO demo06 (NAME,tel) VALUES ('亮亮','13813331122'); #INSERT INTO demo06 (NAME,tel) VALUES ('珊珊','13813331122');#报错,违反唯一约束 SELECT * FROM demo06;
如果触犯了唯一约束:
duplicate entry '值' for key '列名'
外键约束:标记约束(列级约束)
作用:
外键是实现表与表关系设计的前提,也就是说,表之间想要产生关联,那就需要用到外键,使得表关系设计更加合理
特点:
外键必须为外表的主键;外键的值必须有对应值;外键的值可以为空;一个表中可以有多个外键;一般外键的名称与关联主键的名称一致
外键约束的设置:
格式:
foreign key(外键) references 外表 (外表的主键)
foreign key(key)
:当前表中的字段作为了外键
references
:关联、参照
外表 (外表的主键)
:当前表中外键关联的是外表的主键
表关系
一对一
设计方式:两张表A、B,分别添加主键,选取任意一张表,设置外键关联另一张表的主键,而且作为外键的是当前这张表的主键!通俗来说:主键连主键
特点:在一对一的关系下,两个表中主键值相同的记录就是对应关系
CREATE TABLE hus(#创建丈夫表hid INT PRIMARY KEY,hname VARCHAR(100) NOT NULL ); CREATE TABLE wife(#创建妻子表wid INT PRIMARY KEY,wname VARCHAR(100) NOT NULL,FOREIGN KEY(wid) REFERENCES hus(hid)#设置外键的一种方式#丈夫表的主键作为妻子表的主键,实现一对一关系 ); #一个表中的列作为主键的同时又是外键,如上表中的wife表 INSERT INTO hus VALUES(1,'唐伯虎'); INSERT INTO hus VALUES(2,'张无忌'); INSERT INTO hus VALUES(3,'杨过'); INSERT INTO hus VALUES(4,'景天');INSERT INTO wife VALUES(1,'秋香'); INSERT INTO wife VALUES(2,'周芷若'); INSERT INTO wife VALUES(3,'小龙女'); INSERT INTO wife VALUES(5,'赵灵儿');#报错,因为主表中没有id为5的值,所以从表是不可以使用的,违反外键约束 #如果两个表中有主从关系,那么删除的时候应该先删除从表数据,然后再删除主表数据
一对多
设计方式:一方的表称为主表,多方的表称为从表!在从表中设置一个外键,去关联主表的主键
CREATE TABLE dept(#部门表dno INT PRIMARY KEY,dname VARCHAR(100) NOT NULL ); CREATE TABLE emp(#员工表eno INT PRIMARY KEY,ename VARCHAR(100) NOT NULL,dno INT,FOREIGN KEY(dno) REFERENCES dept(dno)#设置外键的一种方式 );
多对多
设计方式:两张表A、B,分别添加主键,此时创建一张中间表C,在C中设置两个外键,分别关联A、B表的主键。那么借助中间表C,就可以实现A、B的多对多关系
CREATE TABLE stu(#学生表sid INT PRIMARY KEY,sname VARCHAR(100) NOT NULL ); CREATE TABLE course(#课程表cid INT PRIMARY KEY,cname VARCHAR(100) NOT NULL ); CREATE TABLE s_c(#中间表:选课表id INT PRIMARY KEY,sid INT,cid INT,FOREIGN KEY(sid) REFERENCES stu(sid),FOREIGN KEY(cid) REFERENCES course(cid) ); #此时,学生表与课程表之间就是多对多关系 #添加一些数据 INSERT INTO stu VALUES(1,'zs'); INSERT INTO stu VALUES(2,'ls'); INSERT INTO stu VALUES(3,'ww'); INSERT INTO stu VALUES(4,'zl'); INSERT INTO course VALUES(1,'java'); INSERT INTO course VALUES(2,'python'); INSERT INTO s_c VALUES(1,1,1); INSERT INTO s_c VALUES(2,1,2); INSERT INTO s_c VALUES(3,2,1); INSERT INTO s_c VALUES(4,3,2); INSERT INTO s_c VALUES(5,4,1); INSERT INTO s_c VALUES(6,4,2);
连接查询
连接查询可以一次性差询多张表,同时得到多张表中的数据,当你要获取的结果集中的数据来自于不同的表时,就需要使用连接查询来获取
在使用连接查询时,既然需要多表同时进行查询,那么就需要书写多表的连接条件,此时才能建立起查询的关联关系,所以连接条件是必须要写的;书写连接条件是为了正确获取具有对应的关系的多表数据,防止产生冗余错乱的数据
内连接查询
先通过连接查询得到数据,在通过
where
除连接条件之外的条件对结果集进行筛选隐式内连接
select 列名 from 表1,表2 where 关联关系 [and 筛选条件];
显式内连接join…on…
select 列名 from 表1 inner join 表2 on 关联关系 [where 筛选条件];
关联关系:其实就是让两个表实现关联的表达式;关联关系的一般写法:
表1.列名 = 表2.列名-->列名:关联列(外键列)
案例:
#查询学生信息以及对应的学生班级信息(隐式内连接) SELECT * FROM stu s,course c,s_c sc WHERE s.sid=sc.sid AND c.cid=sc.cid;#取别名,方便使用,别名的范围只在当前语句中使用,并且取别名就一定要用别名,用原名直接报错 SELECT id,s.sid,sname,c.cid,cname FROM stu s,course c,s_c sc WHERE s.sid=sc.sid AND c.cid=sc.cid AND cname='java'; #查询学生信息以及对应的学生班级信息(显式内连接) SELECT * FROM stu s JOIN s_c sc ON s.sid=sc.sid WHERE cid=1;
内连接总结:
内连接前后表书写的顺序不会影响结果集中的数据,先写哪个表都可以
以后推荐使用显示内连接
1.
inner join
单词的意思就是内连接,所以sql语义更强,可读性更强 2.
on
后面书写连接条件、where
后面书写筛选条件,条件的分类更加明确 3. 显示出现的时间要晚于隐式,所以选用先进的、较新的语法
内连接只能获取到多表去除错误数据(连接条件的作用)后的公共数据,也就是取交集
外连接查询
AB两个有关联的表,以一个表A为基准实现查询(A表中的数据,必须全部显示出来),另外一个表B显示与A表对应的所有数据,如果B表没有对应数据,则以null补齐数据
左外连接(左连接)left join…on…
特点:以一个左表为基准实现查询(必须全部显示出来),右表显示与左表对应的所有数据,如果右表没有对应数据,则以
null
补齐数据select 列名 from 左表 left join 右表 on 关联条件[where 条件...];
案例:
# SELECT * FROM stu s LEFT JOIN s_c sc ON s.sid=sc.sid WHERE cid=1;
右外连接(右连接)right join…on…
特点:以一个右表为基准实现查询(必须全部显示出来),左表显示与右表对应的所有数据,如果左表没有对应数据,则以
null
补齐数据select 列名 from 左表 right join 右表 on 关联条件[where 条件...];
案例:
# SELECT * FROM stu s RIGHT JOIN s_c sc ON s.sid=sc.sid WHERE cid=1;
外连接总结
外连接可以依附于某一张表进行查询,该表中的数据都可以获取,如果不满足连接条件,另一张表中的数据全部补
null
外连接因为表的位置不一样,会影响sql语句的执行语义,会改变依附的查询表,所以前后的顺序不能发生改变,与内连接完全不一样
左外连接与右外连接其实本质上是一致的,把关键字
left join
换成right join
,再将表的位置一调换,结果没有区别
高级查询
模糊查询 like
_:任意的一个字符
%:任意个字符
案例:
#查询学生姓名中包含李的学生信息 SELECT * FROM demo01 WHERE sname LIKE '%李%'; #查询学生姓名中第二个字是三的学生信息 SELECT * FROM demo01 WHERE sname LIKE '_三'; #查询学生姓名只有两个字的学生信息 SELECT * FROM demo01 WHERE sname LIKE '__';
排序查询:order by 列名 desc(倒序)|asc(正序)(默认值)
注:如果存在多个排序条件,那么使用逗号分隔开;如果有其他逻辑判断,通常
where
在order by
的前面
案例:
#按照学生年龄升序查询 SELECT * FROM demo01 ORDER BY age ASC; SELECT * FROM demo01 ORDER BY age; #按照学生年龄降序查询 SELECT * FROM demo01 ORDER BY age DESC; #按照学生年龄降序查询,查找性别为男的学生信息 SELECT * FROM demo01 WHERE sex='男' ORDER BY age DESC;
limit m,n :截取查询(分页查询)[仅在mysql中使用此关键字]
m:表示开始行的下标(下标从零开始),当开始的下标为0时,该值可以省略
n:表示截取的长度,即截取的行数
案例:
#查询前3个学生信息 SELECT * FROM demo01 LIMIT 0,3; SELECT * FROM demo01 LIMIT 3; #查询第2到5行的学生信息 SELECT * FROM demo01 LIMIT 1,4; #查询学生性别为男中年龄最大的学生信息 SELECT * FROM demo01 WHERE sex='男' ORDER BY age DESC LIMIT 1;
分页解决了服务器查询数据的压力,解决了页面显示数据的压力
聚合函数
数据库有这么一些有特定功能的函数|方法,其中有一些函数返回的结果是一行或一列当中的一个值,这样的函数,我们称为聚合函数
sum(字段)
:求和,列的类型为数字max(字段)
:最大值,列的类型为数字或日期min(字段)
:最小值,列的类型为数字或日期avg(字段)
:平均值,列的类型为数字count(字段)
:计数,统计,列的类型为任何类型或者任意列count
函数如果传入了具体的某个字段,一旦该字段的值为null
,则不计数,哪怕其余字段有值,所以为了避免这种情况,通常直接用count(*)
来计数,当所有字段都为null
时不计数,只要有一个不为null
就计数
#查询学生总人数 SELECT COUNT(*) 总人数 FROM stu; #查询demo01中最大的年龄 SELECT MAX(age) FROM demo01; #查询demo01性别为男的中最大的年龄 SELECT MAX(age) FROM demo01 WHERE sex='男';
group by … having… 分组查询
group by 列名 having 条件
什么时候用到分组:
当你的需求中出现诸如:每个、每组的关键字时,此时就需要按照每个、每组后面的字段进行分组,获取数据
分组查询的原理:
注意:
如果sql语句中有分组操作,那么
select
与from
之间只能出现分组的列名;若还存在聚合函数,那么也可以出现在select
与from
之间
查询语句的关键字书写顺序:
书写顺序
select 字段列表、聚合函数 from 表名 where 分组前的条件 group by 分组字段 having 分组后的条件 order by 排序 limit 分页
执行顺序(执行优先级)
where > group by > 聚合函数 > having > order by > limit
案例:
#查询每个学生的选课数量 SELECT sid,COUNT(*) FROM s_c GROUP BY sid; #查询每个学生的选课数量,并且sid降序排列 SELECT sid,COUNT(*) FROM s_c GROUP BY sid ORDER BY sid DESC; #查询每个学生的选课数>1,并且sid降序排列 SELECT sid,COUNT(*) FROM s_c GROUP BY sid HAVING COUNT(*)>1 ORDER BY sid DESC; SELECT sid,COUNT(*) a FROM s_c GROUP BY sid HAVING a>1 ORDER BY sid DESC;
子查询
查询语句中又有另外一个查询语句,将优先执行的查询用小括号括起来的查询,那么此查询就是子查询,往往子查询是将查询的结果作为父查询的条件来使用的
select 列名 from 表名 where 列名 符号 (select 列名 from 表名 where [条件]);
案例:
#查询学生zs SELECT sid FROM stu WHERE sname='zs'; #查询学生zs的选课信息 SELECT * FROM s_c sc WHERE sid IN (SELECT sid FROM stu WHERE sname='zs');#最好用in来取代=
备份和恢复
通过dos命令行进行备份
在没有登录数据库的情况下备份:
mysqldump -uroot -p密码 要备份的数据库名 >备份文件的路径/文件名.sql
注:备份的文件中不包含创建数据库的sql语句,所以在恢复数据时,需先创建数据库来接收
通过dos命令行进行恢复
在没有登录数据库的情况下还原:
mysql -uroot -p密码 要还原到的数据库名 <已备份文件的路径/文件名.sql
在登录数据库的情况下还原:首先登陆
mysql -uroot -p密码
,进入数据库use 数据库名
,还原source 已备份文件的路径/文件名.sql
通过可视化工具SQLYog进行备份
鼠标右键点击数据库,选择备份/导出,选择备份数据库、转储到sql,在弹出页面选中结构和数据,包括"CREATE database"语句,选择导出到的路径与名字,最后点击导出,此时接收数据库备份的文件可以不用提前创建,会自动创建
通过可视化工具SQLYog进行恢复
MySQL个人学习笔记-仅供参考相关推荐
- RewriteCond指令格式(个人学习笔记仅供参考)
RewriteBase指令显式地设置了目录级重写的基准URL. RewriteCond指令格式 [说明]定义重写发生的条件 [语法]RewriteCond TestString CondPattern ...
- opengl光照效果的三棱锥+键盘上下左右控制旋转(学习笔记-仅供参考)
#include <windows.h> #include <gl/gl.h> #include <gl/glut.h> #include<stdio.h&g ...
- opengl 观察变换与投影变化 水壶 (学习笔记-仅供参考)
#include <GL/glut.h> #include <stdlib.h>void display(void) {glClearColor(0.0, 0.0, 0.0, ...
- 教你如何使用android studio 4.0发布release 版本 学习记录 仅供参考
教你如何使用android studio 4.0发布release 版本 学习记录 仅供参考 这是老师给我们布置的任务,我在这里做一个简单的总结,话不多说,直接上图上步骤吧 首先,在菜单栏中,点击 B ...
- 自己整理的面试笔记(仅供参考 , 有错误请大家多多指教 , 谢谢)
javaScript,jQuery,vue的区别: 1.javaScript是运行在浏览器端的脚步语言,JavaScript主要解决的是前端与用户交互的问题,包括使用交互与数据交互,JavaScrip ...
- hive学习(仅供参考)
hive搭建 Hive 什么是hive Hive的优势和特点 hive搭建 解压.改名 修改环境变量 添加hive-site.xml 将maven架包拷贝到hive 替换一下gua包 使环境变量生效 ...
- SSRF 攻击PHP-FPM(FastCGI 攻击):学习总结仅供参考
利用条件: Libcurl版本:高于7.45.0 PHP-FPM:监听端口,版本高于5.3.3 知道目标机器上任意一个php文件绝对路径 一.FastCGI fastcgi其实是一个通信协议,和HTT ...
- 单链表操作2-单链表A拆分成奇数和偶数值单链表B和C(个人学习笔记,仅供参考)
单链表A拆分成奇数和偶数值单链表B和C 题目要求 单链表结点定义 函数接口定义 测试程序样例 输入样例 输出样例 答案 题目要求 在一个带头结点的单链表A中,头指针为a,设计算法SplitList ( ...
- 单链表操作10-带头结点的单链表逆置(个人学习笔记,仅供参考)
带头结点的单链表逆置 题目要求 单链表结点定义 函数接口定义 测试程序样例 输入样例 输出样例 答案 题目要求 设计算法Reverse( ),将带头结点的单链表A逆置,要求利用原有链表的链点,最后输出 ...
最新文章
- CellRanger单细胞基因表达分析基础流程
- python【数据结构与算法】二分模板
- FreeRTOS 查询任务 剩余的栈空间的 方法
- HTML字符实体(常用特殊字符)
- C语言 neutralize函数,关于因子数据处理函数中的中性化函数的几个问题
- 机器学习基石笔记2——在何时可以使用机器学习(2)
- Atitit.js javascript异常处理机制与java异常的转换.js exception process Voae
- win7IE10和win7IE11浏览器更新所需补丁全套【附安装流程】
- ASP.Net中控件的EnableViewState属性 (转)
- 计算机一级B考试总结500字,期中考试总结与反思500
- 机器学习——优化算法:牛顿法-伪代码描述算法
- 硕士阶段学习情况汇总
- linux 版本号 笔记本_2019 年最佳 Linux 笔记本电脑发行版 top10
- WPF 计算DataGrid每一列的合计数
- 男人婚后为何会对婚姻心生倦意?
- facebook-pop 概述
- 北航linux内核编译及烧录实验报告,北航操作系统实验Lab1笔记
- 解决CUDA error: no kernel image is available for execution on the device
- markdown符号使用
- 2013年5月11日 13:44:13
热门文章
- 艾妮记账本Web开发(开发版)
- Git 连接远程仓库
- 小黄鸟(HttpCanary)证书配置续集-vmospro虚拟机导入证书
- 法律网推荐(二) 用Pig进行数据预处理
- 如何快速找出单词的变位词
- python实现简单小游戏_用python开发一个有趣的猜数字小游戏(实现简单的GUI界面学习)...
- Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springfr
- 关于计算机硬件的小技巧,电脑硬件的日常维护技巧
- 如何判断手机是否处于漫游状态
- EPSON彩喷机和HP激光机计数器的清零