MySQL第一讲 一一一一 数据库入门
一. MySQL简介与安装
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。
MySQL下载与安装
MySQL下载
http://dev.mysql.com/downloads/mysql/
二. MySQL安装
Windows:
点击:Windows系统下安装MySQL详细教程(命令安装法)
https://www.cnblogs.com/mashangsir/p/11286322.html
Linux:
yum install mysql-server
Mac:
.......很少用Mac pc 所以这里不做介绍
三. 数据库操作前提(再终端例如:CMD):
3.1 启动MySQL数据库服务端:net start mysql
3.2 登录客户端:以root方式登录:mysql -u root -p
退出MySQL客户端:quit
关闭MySQL服务: net stop mysql
四. 数据库操作
4.1 显示当前MySQL中包含的所有数据库
展示数据库:show databases
安装MySQL之后有三个默认数据库:
mysql -- 用户权限相关数据
test -- 用于用户测试数据
information_schema -- MySQL本身架构相关数据
4.2 创建数据库
utf编码语法:
create database 数据库名 default charset=utf8 collate utf8_general_ci;
gbk编码语法:
create database 数据库名 default character set gbk collate gbk_chinese_ci;
“default charset=utf8”的意思是:谁数据库的默认编码为utf8,这个保证未来的数据库数据有统一的编码
collate utf8_general_ci:大小写不敏感。case insensitive的缩写,意思是大小写不敏感
utf8_bin:区分大小写;
utf8_general_cs:大小写敏感;case insensitive的缩写
4.3 用户管理
(创建用户、修改用户、修改密码、删除用户)
创建用户
create user '用户名'@‘IP地址' identified by '密码';
例如:
create user 'admin1'@'250.250.250.250' identified by 'sb123456';
create user 'admin2'@'250.250.1.1' identified by '123456'; // 创建用户admin2,密码为123456,只能在250.250.1.1主机上登录
create user 'admin2'@'250.250.1.%' identified by '123456'; // 创建用户admin2,密码为123456,可以在250.250.1.1~192.168.1.255主机上登录
create user 'admin2'@'%' identified by '123456'; // 创建用户admin2,密码为123456,可以在所有主机上登录
格式:create user用户名@哪个客户端可以用(ip表示,localhost[本地地址]) identified by 密码;
修改用户名
rename user '用户名'@'IP地址'to '新用户'@'IP地址';
有蛮多博客错误写成: rename user '用户名'@'ip地址';to '新用户名'@'ip地址';;这个是错误的啊!!!!!
修改密码
set password for '用户名'@'IP地址' = Password('新密码');
删除用户
drop user '用户名'@'IP地址';
4.4 数据库授权管理
4.4.1 显示某个用户的权限
show grants for '用户名'@'IP地址'; //查看权限
4.4.2 给某个用户授权
grant 权限1,权限2…… on 数据库.表 to '用户名'@'IP地址';
4.4.3 取消用户权限
revoke 权限1,权限2…… on 数据库.表 from '用户名'@'IP地址';
用户授权示例:
grant select,insert,update on db1.t1 to 'admin2'@'%'; //admin2用户只对db1数据库中的t1表有(select,insert,update)权限
grant all privileges on db1.t1 to 'admin2'@'%'; //admin2用户只对db1数据库中的t1表有所有(all privileges)权限,但不能超过root的几个管理权限
revoke all privileges on db1.t1 from 'admin2'@'%';
格式:grant 权限…… on 数据库对象(db1.*号表示db1下的所有表授权) to 使用该权限的用户;
all privileges 除grant外的所有权限 select 仅查权限 select,insert 查和插入权限 ... usage 无访问权限 alter 使用alter table alter routine 使用alter procedure和drop procedure create 使用create table create routine 使用create procedure create temporary tables 使用create temporary tables create user 使用create user、drop user、rename user和revoke all privileges create view 使用create view delete 使用delete drop 使用drop table execute 使用call和存储过程 file 使用select into outfile 和 load data infile grant option 使用grant 和 revoke index 使用index insert 使用insert lock tables 使用lock table process 使用show full processlist select 使用select show databases 使用show databases show view 使用show view update 使用update reload 使用flush shutdown 使用mysqladmin shutdown(关闭MySQL) super 使用change master、kill、logs、purge、master和set global。还允许mysqladmin调试登陆 replication client 服务器位置的访问 replication slave 由复制从属使用
4.5使用数据库
使用数据库(进入数据库):use 数据库名;
例如:
use db1; //进入db1数据库
下面即将学习SQL语句规则!!!
五. 操作数据表
show tables; //显示所有数据库
5.1 创建表(重要*****)
简单版本:
create table 表名(
id int not null auto_increment primary ky,
name char(8),
字段名 数据类型,
…………
)engine=innodb default charset=utf;
更全的版本到下面就有
注意:
not null:不为空的意思。 null:为空
auto_increment:自增的意思。 例如: create table t1( id int not null auto_increment primary key, name char(8) ) //这个例子的意思就是id列这里是自增的。当我们一行行的插入数据的时候,完全可以不用理会这一列,因为它会随着数据的增加而自动增加。 注意: 1.一个表中的自增列只能有一列。 2.对于自增列,它既是自增列又是必须索引列(也就是含主键)。 3.对于自增来说是可以设置步长和起始值的,例如下面(有两种方式): 3.1 再会话层设置自增步长。 show session variables like 'auto_inc%'; set session auto_increment_increment=2; set session auto_increment_offset=10; 3.1 再全局设置自增步长。最好不要用这个方式!!!! shwo global variables like 'auto_inc%'; set global auto_increment_increment=2; set global auto_increment_offset=10;
primary key 主键
primary key 主键:是一种特殊的唯一索引,它不允许为空,而且它的值必须唯一。
可以用一列来做主键主键,也可以用多列来主键。但是要注意的是,当用多列来表达主键的时候,一行中的几个主键列的组合必须也是唯一的。
一列表示主键:
create table t1(
id int not null auto_increment primary key,
xxid int
)engine=innodb default charset=utf8;
多列表示主键(这里用两列来演示):
create table t2(
id int not null,
xlid int not null,
primary key(id, xlid)
)engine=innodb default charset=utf8;
外键:
外键:MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,
但是作为外键的字段必须由用户进行明确链接的才能进行索引。用于外键关系的字段必须在所有的参照表中进行有明确地主键来链接(索引)。 外键可以是(这里属于外键的变种,下面又详细的内容介绍,请点击我去看看): 一对一(一个表的记录只能与另一个表的一条记录连接), 一对多(一个表的记录可以与另一个表的多条记录连接), 多对多(一个表的各条记录与另一个表的各条记录都可以连接) 外键的使用条件 ① 两个表必须是InnoDB表,MyISAM表暂时不支持外键 什么是InnoDB表?MyISAM表?下面会有 ② 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立; ③ 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以; 主表: create table department( id int not null auto_increment primary key, departname char(20) ………… )engine=innodb default charset=utf8; 带外键的表来了咯: create table user( id int not null auto_increment primary key, depart_id int not null, name char(10), age char(2), constraint fk_depart_user foreign key (depart_id) references department(id) )engine=innodb default charset=utf8; //constraint:约束。 //fk_depart_user:外键名。这里的外键名称,不能重复! //foreign key:外键。 //(depart_id):带外键的表的字段。 //department(id):主表中与(depart_id)字段的对应关系。
单列唯一索引:
create table 表名(
id int not null auto_increment primary key,
xxid int not null,
yyid int not null,
unique uq(唯一索引名称) (xxid), //这就是属于单例唯一索引
constraint ……………………
)engine= InnoDB default charset=utf8;
联合唯一索引:
create table 表名(
id int not null auto_increment primary key,
xxid int not null,
yyid int not null,
unique uq(唯一索引名称) (xxid, yyid), //这就属于联合唯一索引,也就是又多列一起组成联合唯一索引
constraint ………………
)engine=InnoDB default charset=utf8;
唯一索引的特点:
1.约束的内容不能重复,但可以为空,保证唯一。
2.唯一索引的查询速度快。
唯一索引和主键的差别:唯一索引和主键都必须是唯一的,但是唯一索引可以为空,但是主键不能为空。
1.数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。 2.通过表的关系,来帮助我们怎样建表,建几张表。 一对一: 一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然。 学生表:姓名,性别,年龄,身高,体重,籍贯,家庭住址,紧急联系人 其中姓名、性别、年龄、身高,体重属于常用数据,但是籍贯、住址和联系人为不常用数据 如果每次查询都是查询所有数据,不常用的数据就会影响效率,实际又不用 常用信息表:ID(P),姓名,性别,年龄,身高,体重 不常用信息表:ID(P),籍贯,家庭住址,紧急联系人,常用信息表(主键) 解决方案:将常用的和不常用的信息分享存储,分成两张表 不常用信息表和常用信息表,保证不常用信息表与常用信息表能够对应上:找一个具有唯一性的 字段来共同连接两张表。 一个常用表中的一条记录永远只能在一张不常用表中匹配一条记录,反之亦然。 实现的表结构如下: 常用信息表: create table student_opten_use( id int not null auto_increment primary key, sex char(4), age int, height char(10), weight char(10) )engine=innodb default charset=utf8; 不常用信息表: create table student_opten_not_use( id int not null auto_increment primary key, native_place char(20), addr char(40), urgent_num int, optenuse_id int not null, unique uq_opt_notopt(optenuse_id), //其实这里添加了一个唯一索引和外键就成了一对一关系的节点 constraint fk_opt_notopt foreign key (optenuse_id) references student_opten_use(id) )engine=innodb default charset=utf8; 一对多: 一张表中有一条记录可以对应另外一张表中的多条记录;但是反过来,另外一张表的一条记录 只能对应第一张表的一条记录,这种关系就是一对多或多对一 母亲与孩子的关系:母亲,孩子两个实体 母亲表:ID(P),名字,年龄,性别 孩子表:ID(P),名字,年龄,性别 以上关系:一个妈妈可以在孩子表中找到多条记录(也可能是一条),但是一个孩子只能找到一个妈妈 是一种典型的一对多的关系。 但是以上设计:解决了实体的设计表问题,但是没有解决关系问题,孩子找不到母亲,母亲也找不到孩子 解决方案:在某一张表中增加一个字段,能够找到另外一张表中的记录:在孩子表中增加一个字段 指向母亲表,因为孩子表的记录只能匹配到一条母亲表的记录。 母亲表:ID(P),名字,年龄,性别 孩子表:ID(P),名字,年龄,性别,母亲表ID(母亲表主键) 实现的表结构如下: 母亲表: create table mama( id int not null auto_increment primary key, ma_name char(10), ma_age int, sex char(4) )engine=innodb default charset=utf8; 孩子表: create table children( id int not null auto_increment primary key, ch_name char(10), ch_age int, ma_id int not null, //注意这里 constraint fk_ma_ch foreign key (ma_id) references mama(id) //注意这里,添加一个外键,就是变成一对多的节点 )engine=innodb default charset=utf8; 多对多: 一对表中(A)的一条记录能够对应另外一张表(B)中的多条记录;同时B表中的一条记录 也能对应A表中的多条记录 老师和学生 老师表 T_ID(P),姓名,性别 学生表 S_ID(P),姓名,性别 以上设计方案:实现了实体的设计,但是没有维护实体的关系 一个老师教过多个学生,一个学生也被多个老师教过 解决方案:增加一张中间关系表 老师与学生的关系表:ID(P),T_ID,S_ID 老师表与中间表形成一对多的关系,而中间表是多表;维护了能够唯一找到一表的关系; 同样的学生表与中间表也是一个一对多的关系; 学生找老师:找出学生ID--->中间表寻找匹配记录(多条)--->老师表匹配(一条) 老师找学生:找出老师ID--->中间表寻找匹配记录(多条)--->学生表匹配(一条) 老师表: create table teacher( t_id int not null auto_increment primary key, tname char(10), tsex char(4) )engine=innodb default charset=utf8; 学生表: create table student( s_id int not null auto_increment primary key, sname char(10), ssex char(4) )engine=innodb default charset=utf8; 关系表: create table relation( id int not null auto_increment primary key, r_t_id int not null, r_s_id int not null, unique up_te_st(r_t_id,r_s_id), //添加联合唯一所以,组成了多对多的关键节点 constraint fk_relation_te foreign key (r_t_id) references teacher(t_id), //分别添加外键 constraint fk_relation_st foreign key (r_s_id) references student(s_id), //分别添加外键 )engine=innodb default charset=utf8;
engine=innodb是什么?什么是InnoDB表?MyISAM表?
engine:叫做mysql建表引擎。
InnoDB的意思:它提供了事务控制能力功能,它确保一组命令全部执行成功,或者当任何一个命令出现错误时所有命令的结果都被回退,可以想像在电子银行中事务控制能力是非常重要的。
简单的说,比如:一个银行交易,本来A是要支付1万元给B的。但是再支付过程中由于各种原因导致系统断网,断网的同时,A已经支付了1万元,银行也减了余额一万元,但是B账号上在这个断网的时间点,并没有接收到1万的信息。所以就出现了A与B的交易出了问题。所以,当engine使用InnoDB建表引擎模式的时候,会有一个“原子操作”事务,它的意思就是,当一个完整事件没有完成的时候,所有操作会回到原点,再次操作。
MyISAM的意思:ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。
ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。
如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL能够支持这样的备份应用程序。
desc 表名; //看表中的每个字段的意思 show create table 表名; //看表的每个字段是如何创建的,这是横着看的。 show create table 表名\G; //加上\G之后就是竖着看,而且返回的内容跟自己的创建表的内容差不多一样
PS:InnoDB表MyISAM表的不同点。请点击这里进入详情页!
网址:https://www.cnblogs.com/mashangsir/p/11324559.html
default charset=utf8:默认表的编码为utf-8.
5.2 清除表
两个清空表里面数据的方法():
1. delete from 表名; //如果这里清空了表之后,如果要继续插入数据的话,自增列会在原来的基础上自增并添加(比如:原来数据又10行,说明id自增列最后一个为10,当用delete清空之后,下次再插入数据的时候,会从11开始),所以使用truncate来清除表就不会存在这个问题
2. truncate table 表名; //这个比delete效率要高很多
//删除表
drop table 表名; //这个是整个表都删除了
5.3修改表
添加列:alter table 表名 add 列名 类型
删除列:alter table 表名 drop column 列名
修改列:
alter table 表名 modify column 列名 类型; -- 类型
alter table 表名 change 原列名 新列名 类型; -- 列名,类型
添加主键:
alter table 表名 add primary key(列名); //注意:这里要添加的主键列名要先存在,如果不存在可以使用,例如:alter table 表名 add id int;添加一个即将成为主键的字段
删除主键:
alter table 表名 drop primary key;
alter table 表名 modify 列名 int, drop primary key;
添加外键:alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
删除外键:alter table 表名 drop foreign key 外键名称
修改默认值:ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
删除默认值:ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
总结:修改表的字段,前面都是 "alter table 表名" + 操作语句。
5.4 数据库表的基本数据类型
MySQL数据库中的表的数据类型大致分为:数值、时间和字符串
数值(6个):
整数(3个):
1. tinyint[(m)] [unsigned] [zerofill]
小整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-128 ~ 127.
无符号:
~ 255
特别的: MySQL中无布尔值,使用tinyint(1)构造。
2. int[(m)][unsigned][zerofill]
整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-2147483648 ~ 2147483647
无符号:
~ 4294967295
特别的:整数类型中的m仅用于显示,对存储范围无限制。例如: int(5),当插入数据2时,select 时数据显示为: 00002
3. bigint[(m)][unsigned][zerofill]
大整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-9223372036854775808 ~ 9223372036854775807
无符号:
~ 18446744073709551615
浮点数(3):
1. decimal[(m[,d])] [unsigned] [zerofill] //常用这个
准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
特别的:对于精确数值计算时需要用此类型
decaimal能够存储精确值的原因在于其内部按照字符串存储。
2. FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
无符号:
-3.402823466E+38 to -1.175494351E-38,
1.175494351E-38 to 3.402823466E+38
有符号:
1.175494351E-38 to 3.402823466E+38
**** 数值越大,越不准确 ****
3. DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
无符号:
-1.7976931348623157E+308 to -2.2250738585072014E-308
2.2250738585072014E-308 to 1.7976931348623157E+308
有符号:
2.2250738585072014E-308 to 1.7976931348623157E+308
**** 数值越大,越不准确 ****
字符串(5个):
1. char (m)
char数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中m代表字符串的长度。
PS: 即使数据小于m长度,也会占用m长度
2. varchar(m)
varchars数据类型用于变长的字符串,可以包含最多达255个字符。其中m代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。
注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡
3. text
text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。
4. mediumtext
A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
5. longtext
A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.
时间(5个):
1. DATE
YYYY-MM-DD(1000-01-01/9999-12-31)
2. TIME
HH:MM:SS('-838:59:59'/'838:59:59')
3. YEAR
YYYY(1901/2155)
4. DATETIME //常用这个
YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
5. TIMESTAMP
YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
其他:
1. bit[(M)]
二进制位(101001),m表示二进制位的长度(1-64),默认m=1
2. enum
枚举类型,
An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
示例:
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');
3. set
集合类型
A SET column can have a maximum of 64 distinct members.
示例:
CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
六. 操作表的内容
增
insert into 表名(字段名1,字段名2…………) values(值1,值2………………); //插入一条数据
insert into 表名(字段名1,字段名2) values(值1,值2),(值1,值2),(值1,值2)…………; //可以一次性插入多条数据
insert into tb12(name,age) select name,age from tb11; //这是复制别的表(tb11)的数据到自己表(tb12)里
删
delete from tb2; //删除表tb2的所有数据
delete from tb2 where id = 2; //删除表tb2中id的2的所有数据
delete from tb2 where id >2; //删除表tb2中id大于2的所有数据
delete from tb2 where id>2 and name="张三" ; //删除表tb2中id大于2,并且名字为张三的所有数据
//格式:delete from 表名 条件;
改
update tb2 set name=“二蛋” where id >2 and name="二狗"; //修改表tb2中id大于2,并且名字为“二狗”的所有数据中的名字为“二蛋”
update tb2 set name="二蛋" ,sex="男" where id>2 and name="二狗"; //修改表tb2中的id大于2,并且名字为“二狗”的所有数据中的名字和性别分别为,“二蛋”和“男”
//格式:update 表名 set 要改的东西 条件;
查
tb1表的字段为:id,姓名name,年龄age,性别sex,课程course,成绩num
select * from tb1; //查询tb1表的所有数据
select * from tb1 where age>30; //查询tb1表中年龄大于30岁的所有数据
select name,age,sex as 性别 from tb1; //查询tb1表中的所有数据,并给sex性别起了一个别名为中文“性别”
条件语句:
select * from tb1 where id>4 and name != "二蛋 and age=“女”; //这里是大于,等于,不等于的条件语句
select * from tb1 where id between 4 and 6; //查询tb1表中id等于4到6之间的所有数据,注意:id等于4到6的这个区间都拿到了,这是个闭区间,两头都要取值
select * from tb1 where id in(2,3,5,6); //查询tb1表中id等于2或3或5或6的数据
select * from tb1 where id not in(2,3,5,6); //查询tb1表中id不等于2或3或5或6的数据
select * from tb1 where id (select sid from tb2); //查询tb1表中id的所有,但id的取值来自与tb2表中select语句所返回的值,这里是动态的了
通配符条件:
select * from tb1 where name like "%蛋"; //查询tb1表中名字name的最后一个字为“蛋”的数据
select * from tb1 where name like "李%"; //查询tb1表中名字name为姓”李“的所有数据
select * from tb1 where name like "%二%"; //查询tb1表中名字带有”二“的所有数据
通配符有两个符号来表示,百分号“%” 和 下划线“_”。
但是这两个是有区别的:% 是表示多个字符,而 _ 是表示一个字符。
例如:select * from tb1 where name like "李%"; //这里可以查询tb1表中名字name为 李某,李某某,李某某某……的所有数据
select * from tb1 where name like "李_"; //这里得到数据就不一样了,这里只能取到 李某(李东,李二,李子)这里个两个字的名字
限制条件:
select * from tb1 limit 6; //取tb1表中前5行的数据
select * from tb1 limit 4,5; //取tb1表中,从第4行开始到第9行的数据 ,4(limit 后的第一位置)表示的起始位置,5(limit后的第二位置)表示的是从这个起始位置往后取5条数据
select * from tb2 limit 5 offset 4; //这个带有offset语句的功能和 select * from tb2 limit 4,5;是一样的,只是加了offset之后,4 和 5的位置反了,这里是从第4行开始读取,读取5行;
排序条件:
select * from tb1 order by desc; //从大到小排序列出
select * from tb1 order by asc; //从小到大排序列出
select * from tb1 order by age desc,id asc; //先通过age的方向(大到小)排序,当遇到同一个age值一样几个数据的时候,会继续按id进行(小到大)排序
//取tb1表最后10条数据的方法:先通过desc反向排序后,再用limit取值
select * from tb1 order by id desc limit 10;
分组:
select name,max(num) from tb1 group by course; //通过对课程列字段进行分组,查询tb1表中的各个课程是最高分和对应的名字
select count(name) from tb1; //这样可以计算tb1中一共有多少条数据
count这个位置有几个常用到的参数(这个参数,要结合分组 group by使用),这类参数也叫聚合函数:
count:计数。
max:取最大值
min:取最小值
avg:取平均值
sum:求和
//特别注意:
group
by
必须在
where
之后,
order
by
之前
--例如:select
num,nid
from
表名
where
nid > 10
group
by
num,nid
order
nid
desc;
注意:当用一个sql语句用到聚合函数的时候,并且用聚合函数做为筛选条件的时候,不能用where条件语句,而是用having来代替where语句,例如:
select course,avg(num) from tb1 group by course having avg(num)>60;
分解1:select course,avg(num) from tb1 group by course,这段的意思是查询每个课程名,和它的平均值,所以需要通过group by来分组算出平均值。
2:having avg(num)>60,这里的意思是,再已经算出每个课程的平均值之后,筛选出平均大于60 的课程
连表查询:
普通联表:
select * from tb1,tb2;
select * from tb1,tb2 where tb1.sid = tb2.id;
1.select * from tb1 left join tb2 on tb1.sid = tb2.id;
left join :左关连。# 这里用“left join”的话就是显示tb1表的所有数据(left joind的左边表全部显示)
2.select * from tb1 right join tb2 on tb1.sid = tb2.id;
right join:右关连。# 这里用“right join”的话就是 显示tb2 表的所有数据(right join的右边表全部显示)
3.select * from userinfo5 innder join department5 on userinfo5.part_id = department5.id
innder join挂历:将出现null时一行隐藏
终级版本的联表查询方法:直接连很多表!
select
score.sid,
student.sid
from
score
left join student on score.student_id = student.sid
left join course on score.course_id = course.cid
left join class on student.class_id = class.cid
left join teacher on course.teacher_id=teacher.tid
select count(id) from userinfo5;
(这里介绍三种joini连表方法)更多联表请到: MySQL 7种 JOIN连表方法