mysql笔记
2015-08-14 21:44
561 查看
一、SQL语言
结构化查询语言
操作关系型数据库
非过程性语言
由ANSI 和 ISO 提出 各大数据厂商实现
不同厂商实现中增加了自己独有的语法,称为数据库的方言。
二、操作数据库
1.创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]
create_specification:[DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
~创建一个名称为mydb1的数据库。
CREATE DATABASE mydb1;
~创建一个使用gbk字符集的mydb2数据库。
CREATE DATABASE mydb2 CHARACTER SET GBK;
~创建一个使用utf8字符集,并带校对规则的mydb3数据库。
create database mydb3 character set utf8 collate utf8_bin;
2.查看数据库
显示所有数据库 SHOW DATABASES
显示数据库创建语句: SHOW CREATE DATABASE db_name
~查看当前数据库服务器中的所有数据库
SHOW DATABASES;
~查看前面创建的mydb2数据库的定义信息
SHOW CREATE DATABASE mydb2;
3.修改数据库
ALTER DATABASE [IF NOT EXISTS] db_name [alter_specification [, alter_specification] ...]
alter_specification: [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
~查看服务器中的数据库,并把mydb2库的字符集修改为utf8
alter database mydb2 character set utf8;
4.删除数据库
DROP DATABASE [IF EXISTS] db_name;
~删除前面创建的mydb1数据库
drop database mydb1;
5.选择数据库
选择数据库 use db_name;
查询当前所在数据库 select database();
三、操作数据库表
0.mysql中的数据类型
字符串类型:
定长字符串 -- char(5)
变长字符串 -- varchar(20) 255 -- 65535
数值类型
TINYINT:占用1个字节,相对于java中的byte
SMALLINT:占用2个字节,相对于java中的short
INT:占用4个字节,相对于java中的int
BIGINT:占用8个字节,相对于java中的long
FLOAT:4字节单精度浮点类型,相对于java中的float
DOUBLE:8字节双精度浮点类型,相对于java中的double
逻辑型
BIT
日期型
DATE:日期
TIME:时间
DATETIME:日期时间
TIMESTAMP:时间戳
大数据类型
大文本
text(clob) 4GB
大二进制
blob 4GB
1.字段的约束
主键约束: 值必须是唯一并且不能为空 primary key auto_increment
唯一约束: 值必须是唯一 unique
非空约束: 值不能为空 not null
2.创建数据库表
CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype,
....
)[character set 字符集] [collate 校对规则];
field:指定列名 datatype:指定列类型
~创建employee表
create table employee(
id int primary key auto_increment,
name varchar(20) unique,
gender bit not null,
birthday date,
entry_date date,
job varchar(100),
salary double,
resume text
);
2.查看表
查看当前所有表:
show tables
查看表结构:
desc tabName
查看当前数据库表建表语句
show create table tabName;
3.修改表
增加列:
ALTER TABLE table ADD (column datatype [DEFAULT expr][, column datatype]...);
修改列:
ALTER TABLE table MODIFY (column datatype [DEFAULT expr][, column datatype]...);
删除列:
ALTER TABLE table DROP (column);
修改列名称:
ALTER TABLE table CHANGE [column] old_col_name column_definition;
修改列的顺序:
ALTER TABLE tb_name MODIFY column_definition AFTER col_name;
修改表的字符集:
ALTER TABLE tab_name CHARACTER SET character_name;
修改表名:
RENAME TABLE old_tabname TO new_tabname:
~在上面员工表的基本上增加一个image列。
alter table employee add image blob;
~修改job列,使其长度为60。
alter table employee modify job varchar(60);
~删除gender列。
alter table employee drop gender;
~列名name修改为username
alter table employee change name username varchar(20);
~将image列放置到salary列的后面
alter table employee modify image blob after salary;
~表名改为user。
rename table employee to user;
~修改表的字符集为gbk
alter table user character set gbk;
4.删除表
DROP TABLE tabname;
~删除user表
drop table user;
四、操作数据库表记录 - Create Read Update Delete
1.INSERT
INSERT INTO table [(column [, column...])] VALUES (value [, value...]);
插入的数据应与字段的数据类型相同
数据的大小应在列的规定范围内
在values中列出的数据位置必须与被加入的列的排列位置相对应
字符和日期型数据应包含在单引号中
如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表
~向员工表中插入三条数据
insert into employee (id,name,gender,birthday,entry_date,job,salary,resume)
values (null,'张飞',1,'1990-09-09','1990-10-10','打手',998.0,'真的很能打。。');
insert into employee values (null,'关羽',0,'1980-08-08','1981-01-01','财神',9999999.0,'公司挣钱全指着他了。。。');
insert into employee values (null,'刘备',1,'1970-07-07','1971-02-02','CEO',3000.0,'公司的老大,全都听他的。。。')
,(null,'赵云',1,'1991-07-07','1991-12-02','贴身保镖',4000.0,'老大的贴身保镖,每天都在一起。。。');
**乱码问题:客户端通过gbk发送,服务器默认认为是UTF-8的数据,编解码码表不一致,造成乱码。
**解决方法1: 在客户端可以通过 set names xxx; 通知服务器端和当前客户duang进行交互时使用哪个指定码表。
**解决方法2: 方法1需要每次启动客户端都执行set names xxx; 很麻烦,可以修改默认的服务器认为客户端的编码。
**在使用时,通过方式2来设置为大部分使用数据库的客户端的编码,使大部分人直接就没有乱码,而少部分如何编码不一致仍然可以通过方式1通知服务器和该客户端进行交互时的编码,从而防止乱码。
2.UPDATE
UPDATE tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]
UPDATE语法可以用新值更新原有表行中的各列。
SET子句指示要修改哪些列和要给予哪些值。
WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。
~将所有员工薪水修改为5000元。
update employee set salary = 5000;
~将姓名为’张飞’的员工薪水修改为3000元。
update employee set salary = 3000 where name='张飞';
~将姓名为’关羽’的员工薪水修改为4000元,job改为ccc。
update employee set salary = 4000 ,job = 'ccc' where name = '关羽';
~将刘备的薪水在原有基础上增加1000元。
update employee set salary=salary+1000 where name='刘备';
3.DELETE
DELETE FROM tbl_name [WHERE where_definition]
如果不使用where子句,将删除表中所有数据。
Delete语句不能删除某一列的值(可使用update)
使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。
删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同。delete是一
条条删除记录,truncate是摧毁整表再重建相同结构的表,truncate效率更高。
~删除表中名称为’张飞’的记录。
delete from employee where name = '张飞';
~删除表中所有记录。
delete from employee;
~使用truncate删除表中记录。
truncate table employee;
4.SELECT
(1)基本查询:SELECT [DISTINCT] *|{column1, column2. column3..} FROM
table;
select 指定查询哪些列的数据。
column指定列名。
*号代表查询所有列。
from指定查询哪张表。
DISTINCT可选,指显示结果时,是否剔除重复数据
~查询表中所有学生的信息。
select * from exam;
~查询表中所有学生的姓名和对应的英语成绩。
select name,english from exam;
~过滤表中重复数据。
select distinct english from exam;
~在所有学生分数上加10分特长分显示。
select name ,math+10 ,english+10,chinese+10 from exam;
~统计每个学生的总分。
select name,math+english+chinese from exam;
~使用别名表示学生总分。
select name as 姓名,math+english+chinese as 总分 from exam;
select name 姓名,math+english+chinese 总分 from exam;
(2)带条件的查询:Select *|列名 from tablename [WHERE where_definition]
可以使用的条件:
> < >= <= <>
between...and...
in(10,11,12)
like xxx
is null
and
or
not
~查询姓名为赵云的学生成绩
select * from exam where name = '赵云';
~查询英语成绩大于90分的同学
select name,english from exam where english>90;
~查询总分大于230分的所有同学
select name 姓名 , math+english+chinese 总分 from exam where math+english+chinese>230;
~查询英语分数在 80-100之间的同学。
select name ,english from exam where english between 80 and 100;
~查询数学分数为75,76,77的同学。
select name,math from exam where math in (75,76,77);
~查询所有姓张的学生成绩。
select * from exam where name like '张%';
select * from exam where name like '张_';
select * from exam where name like '张__';
~查询数学分>70,语文分>80的同学。
select * from exam where math>70 and chinese>80;
(3)排序查询
SELECT column1, column2. column3.. FROM table order by column [asc|desc];
~对英语成绩排序后输出。
select name,english from exam order by english desc;
~对总分排序按从高到低的顺序输出
select name 姓名, ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0) 总分 from exam order by 总分 desc;
~对姓张的学生成绩排序输出
select name 姓名, ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0) 总分 from exam where name like '张%' order by 总分 desc;
(4)聚合函数
求符合条件的记录中指定列的记录数
select count(列名)… from tablename [WHERE where_definition]
求符合条件的记录中指定列的和值
Select sum(列名)… from tablename [WHERE where_definition]
求符合条件的记录中指定列的平均值
Select avg (列名)… from tablename [WHERE where_definition]
求符合条件的记录中指定列的最大值
Select max(列名)… from tablename [WHERE where_definition]
求符合条件的记录中指定列的最小值
Select min(列名)… from tablename [WHERE where_definition]
~统计一个班级共有多少学生?
select count(*) from exam;
~统计数学成绩大于70的学生有多少个?
select count(*) from exam where math>70;
~统计总分大于230的人数有多少?
select count(name)
from exam
where ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0)>230;
~统计一个班级数学总成绩?
select sum(math) from exam;
~统计一个班级语文、英语、数学各科的总成绩
select sum(math),sum(chinese),sum(english) from exam;
~统计一个班级语文、英语、数学的成绩总和
select sum(ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0)) from exam;
~统计一个班级语文成绩平均分
select avg(chinese) from exam;
~求一个班级数学平均分?
select avg(math) from exam;
~求一个班级总分平均分?
select avg(ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0)) from exam;
~求班级最高分和最低分
select max(ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0)) from exam;
select min(ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0)) from exam;
(5)分组查询
SELECT column1, column2. column3.. FROM
table group by column having ...
~对订单表中商品归类后,显示每一类商品的总价
select product,sum(price) from orders group by product;
~查询购买了几类商品,并且每类总价大于100的商品
select product,sum(price) from orders group by product having sum(price)>100 ;
~查询单价小于100而总价大于100的商品的名称.
select product from orders where price<100 group by product having sum(price)>100 ;
**where 和 having都可以用来进行过滤,但是应用场景不同。where语句用来在分组之前进行过滤,having语句用来在分组之后进行过滤。
并且where语句中不允许使用聚合函数的。having语句中可以使用聚合函数。
使用where语句的地方一般都可以使用having替代,但是使用having的地方一般不能用where替代。
SQL在书写的过程中,顺序要求: select from where group by having order by
SQL在执行的过程中,执行的顺序:from where select group by having order by
===========================================================================================================================
五、备份、恢复数据库
备份数据库:
在cmd窗口中:mysqldump -u root -p db_name > c:/xxx.sql
恢复数据库:
方法1:在cmd窗口:mysql -u root -p db_name < c:/xxx.sql
方法2:在mysql中,通过source命令执行一个sql文件,恢复数据。
===========================================================================================================================
六、外键约束
外键的概念
增加外键:
foreign key(ordersid) references orders(id)
案例:
create table dept(
id int primary key auto_increment,
name varchar(20)
);
insert into dept values (null,'财务部');
insert into dept values (null,'人事部');
insert into dept values (null,'销售部');
insert into dept values (null,'科技部');
create table emp(
id int primary key auto_increment,
name varchar(20),
dept_id int,
foreign key (dept_id) references dept(id)
);
insert into emp values (null,'奥巴马',1);
insert into emp values (null,'哈里波特',2);
insert into emp values (null,'葫芦娃',3);
insert into emp values (null,'萨达姆',4);
insert into emp values (null,'朴乾',4);
七、多表设计
1-*:多的一方保存一的一方的主键作为外键
1-1:任意一方保存另一方的主键作为外键
*-*:设计一张第三方关系表,保存两张表主键的对应关系,用两个一对多来保存一个多对多。
八、多表查询
create table dept(
id int primary key auto_increment,
name varchar(20)
);
insert into dept values (null,'财务部');
insert into dept values (null,'人事部');
insert into dept values (null,'销售部');
insert into dept values (null,'科技部');
create table emp(
id int primary key auto_increment,
name varchar(20),
dept_id int
);
insert into emp values (null,'奥巴马',1);
insert into emp values (null,'哈里波特',2);
insert into emp values (null,'葫芦娃',3);
insert into emp values (null,'萨达姆',3);
insert into emp values (null,'朴乾',5);
笛卡尔积查询:是两张表相乘出来的结果,如果左边表有m条记录,右边表有n条记录,则查询处m*n条记录,这些查询结果中往往包含着大量错误的数据,通常不会使用笛卡尔积查询。
select * from dept,emp;
内连接查询:查询出左边表有且右边表也有的记录
select * from dept,emp where dept.id = emp.dept_id;
select * from dept inner join emp on dept.id=emp.dept_id;
外连接查询:
左外连接查询:在内连接的基础上增加上左边有而右边没有的记录
select * from dept left join emp on dept.id=emp.dept_id;
右外连接查询:在内连接的基础上增加上右边表有而左边表没有的记录
select * from dept right join emp on dept.id=emp.dept_id;
全外连接查询:在内连接的基础上增加上左边表有而右边表没有的记录和右边表有而左边表没有的记录
select * from dept full join emp on dept.id=emp.dept_id; #mysql不支持全外连接
select * from dept left join emp on dept.id=emp.dept_id
union
select * from dept right join emp on dept.id=emp.dept_id; #可以通过union左外和右外模拟全外连接查询
结构化查询语言
操作关系型数据库
非过程性语言
由ANSI 和 ISO 提出 各大数据厂商实现
不同厂商实现中增加了自己独有的语法,称为数据库的方言。
二、操作数据库
1.创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]
create_specification:[DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
~创建一个名称为mydb1的数据库。
CREATE DATABASE mydb1;
~创建一个使用gbk字符集的mydb2数据库。
CREATE DATABASE mydb2 CHARACTER SET GBK;
~创建一个使用utf8字符集,并带校对规则的mydb3数据库。
create database mydb3 character set utf8 collate utf8_bin;
2.查看数据库
显示所有数据库 SHOW DATABASES
显示数据库创建语句: SHOW CREATE DATABASE db_name
~查看当前数据库服务器中的所有数据库
SHOW DATABASES;
~查看前面创建的mydb2数据库的定义信息
SHOW CREATE DATABASE mydb2;
3.修改数据库
ALTER DATABASE [IF NOT EXISTS] db_name [alter_specification [, alter_specification] ...]
alter_specification: [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
~查看服务器中的数据库,并把mydb2库的字符集修改为utf8
alter database mydb2 character set utf8;
4.删除数据库
DROP DATABASE [IF EXISTS] db_name;
~删除前面创建的mydb1数据库
drop database mydb1;
5.选择数据库
选择数据库 use db_name;
查询当前所在数据库 select database();
三、操作数据库表
0.mysql中的数据类型
字符串类型:
定长字符串 -- char(5)
变长字符串 -- varchar(20) 255 -- 65535
数值类型
TINYINT:占用1个字节,相对于java中的byte
SMALLINT:占用2个字节,相对于java中的short
INT:占用4个字节,相对于java中的int
BIGINT:占用8个字节,相对于java中的long
FLOAT:4字节单精度浮点类型,相对于java中的float
DOUBLE:8字节双精度浮点类型,相对于java中的double
逻辑型
BIT
日期型
DATE:日期
TIME:时间
DATETIME:日期时间
TIMESTAMP:时间戳
大数据类型
大文本
text(clob) 4GB
大二进制
blob 4GB
1.字段的约束
主键约束: 值必须是唯一并且不能为空 primary key auto_increment
唯一约束: 值必须是唯一 unique
非空约束: 值不能为空 not null
2.创建数据库表
CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype,
....
)[character set 字符集] [collate 校对规则];
field:指定列名 datatype:指定列类型
~创建employee表
create table employee(
id int primary key auto_increment,
name varchar(20) unique,
gender bit not null,
birthday date,
entry_date date,
job varchar(100),
salary double,
resume text
);
2.查看表
查看当前所有表:
show tables
查看表结构:
desc tabName
查看当前数据库表建表语句
show create table tabName;
3.修改表
增加列:
ALTER TABLE table ADD (column datatype [DEFAULT expr][, column datatype]...);
修改列:
ALTER TABLE table MODIFY (column datatype [DEFAULT expr][, column datatype]...);
删除列:
ALTER TABLE table DROP (column);
修改列名称:
ALTER TABLE table CHANGE [column] old_col_name column_definition;
修改列的顺序:
ALTER TABLE tb_name MODIFY column_definition AFTER col_name;
修改表的字符集:
ALTER TABLE tab_name CHARACTER SET character_name;
修改表名:
RENAME TABLE old_tabname TO new_tabname:
~在上面员工表的基本上增加一个image列。
alter table employee add image blob;
~修改job列,使其长度为60。
alter table employee modify job varchar(60);
~删除gender列。
alter table employee drop gender;
~列名name修改为username
alter table employee change name username varchar(20);
~将image列放置到salary列的后面
alter table employee modify image blob after salary;
~表名改为user。
rename table employee to user;
~修改表的字符集为gbk
alter table user character set gbk;
4.删除表
DROP TABLE tabname;
~删除user表
drop table user;
四、操作数据库表记录 - Create Read Update Delete
1.INSERT
INSERT INTO table [(column [, column...])] VALUES (value [, value...]);
插入的数据应与字段的数据类型相同
数据的大小应在列的规定范围内
在values中列出的数据位置必须与被加入的列的排列位置相对应
字符和日期型数据应包含在单引号中
如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表
~向员工表中插入三条数据
insert into employee (id,name,gender,birthday,entry_date,job,salary,resume)
values (null,'张飞',1,'1990-09-09','1990-10-10','打手',998.0,'真的很能打。。');
insert into employee values (null,'关羽',0,'1980-08-08','1981-01-01','财神',9999999.0,'公司挣钱全指着他了。。。');
insert into employee values (null,'刘备',1,'1970-07-07','1971-02-02','CEO',3000.0,'公司的老大,全都听他的。。。')
,(null,'赵云',1,'1991-07-07','1991-12-02','贴身保镖',4000.0,'老大的贴身保镖,每天都在一起。。。');
**乱码问题:客户端通过gbk发送,服务器默认认为是UTF-8的数据,编解码码表不一致,造成乱码。
**解决方法1: 在客户端可以通过 set names xxx; 通知服务器端和当前客户duang进行交互时使用哪个指定码表。
**解决方法2: 方法1需要每次启动客户端都执行set names xxx; 很麻烦,可以修改默认的服务器认为客户端的编码。
**在使用时,通过方式2来设置为大部分使用数据库的客户端的编码,使大部分人直接就没有乱码,而少部分如何编码不一致仍然可以通过方式1通知服务器和该客户端进行交互时的编码,从而防止乱码。
2.UPDATE
UPDATE tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]
UPDATE语法可以用新值更新原有表行中的各列。
SET子句指示要修改哪些列和要给予哪些值。
WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。
~将所有员工薪水修改为5000元。
update employee set salary = 5000;
~将姓名为’张飞’的员工薪水修改为3000元。
update employee set salary = 3000 where name='张飞';
~将姓名为’关羽’的员工薪水修改为4000元,job改为ccc。
update employee set salary = 4000 ,job = 'ccc' where name = '关羽';
~将刘备的薪水在原有基础上增加1000元。
update employee set salary=salary+1000 where name='刘备';
3.DELETE
DELETE FROM tbl_name [WHERE where_definition]
如果不使用where子句,将删除表中所有数据。
Delete语句不能删除某一列的值(可使用update)
使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。
删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同。delete是一
条条删除记录,truncate是摧毁整表再重建相同结构的表,truncate效率更高。
~删除表中名称为’张飞’的记录。
delete from employee where name = '张飞';
~删除表中所有记录。
delete from employee;
~使用truncate删除表中记录。
truncate table employee;
4.SELECT
(1)基本查询:SELECT [DISTINCT] *|{column1, column2. column3..} FROM
table;
select 指定查询哪些列的数据。
column指定列名。
*号代表查询所有列。
from指定查询哪张表。
DISTINCT可选,指显示结果时,是否剔除重复数据
~查询表中所有学生的信息。
select * from exam;
~查询表中所有学生的姓名和对应的英语成绩。
select name,english from exam;
~过滤表中重复数据。
select distinct english from exam;
~在所有学生分数上加10分特长分显示。
select name ,math+10 ,english+10,chinese+10 from exam;
~统计每个学生的总分。
select name,math+english+chinese from exam;
~使用别名表示学生总分。
select name as 姓名,math+english+chinese as 总分 from exam;
select name 姓名,math+english+chinese 总分 from exam;
(2)带条件的查询:Select *|列名 from tablename [WHERE where_definition]
可以使用的条件:
> < >= <= <>
between...and...
in(10,11,12)
like xxx
is null
and
or
not
~查询姓名为赵云的学生成绩
select * from exam where name = '赵云';
~查询英语成绩大于90分的同学
select name,english from exam where english>90;
~查询总分大于230分的所有同学
select name 姓名 , math+english+chinese 总分 from exam where math+english+chinese>230;
~查询英语分数在 80-100之间的同学。
select name ,english from exam where english between 80 and 100;
~查询数学分数为75,76,77的同学。
select name,math from exam where math in (75,76,77);
~查询所有姓张的学生成绩。
select * from exam where name like '张%';
select * from exam where name like '张_';
select * from exam where name like '张__';
~查询数学分>70,语文分>80的同学。
select * from exam where math>70 and chinese>80;
(3)排序查询
SELECT column1, column2. column3.. FROM table order by column [asc|desc];
~对英语成绩排序后输出。
select name,english from exam order by english desc;
~对总分排序按从高到低的顺序输出
select name 姓名, ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0) 总分 from exam order by 总分 desc;
~对姓张的学生成绩排序输出
select name 姓名, ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0) 总分 from exam where name like '张%' order by 总分 desc;
(4)聚合函数
求符合条件的记录中指定列的记录数
select count(列名)… from tablename [WHERE where_definition]
求符合条件的记录中指定列的和值
Select sum(列名)… from tablename [WHERE where_definition]
求符合条件的记录中指定列的平均值
Select avg (列名)… from tablename [WHERE where_definition]
求符合条件的记录中指定列的最大值
Select max(列名)… from tablename [WHERE where_definition]
求符合条件的记录中指定列的最小值
Select min(列名)… from tablename [WHERE where_definition]
~统计一个班级共有多少学生?
select count(*) from exam;
~统计数学成绩大于70的学生有多少个?
select count(*) from exam where math>70;
~统计总分大于230的人数有多少?
select count(name)
from exam
where ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0)>230;
~统计一个班级数学总成绩?
select sum(math) from exam;
~统计一个班级语文、英语、数学各科的总成绩
select sum(math),sum(chinese),sum(english) from exam;
~统计一个班级语文、英语、数学的成绩总和
select sum(ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0)) from exam;
~统计一个班级语文成绩平均分
select avg(chinese) from exam;
~求一个班级数学平均分?
select avg(math) from exam;
~求一个班级总分平均分?
select avg(ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0)) from exam;
~求班级最高分和最低分
select max(ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0)) from exam;
select min(ifnull(english,0)+ifnull(math,0)+ifnull(chinese,0)) from exam;
(5)分组查询
SELECT column1, column2. column3.. FROM
table group by column having ...
~对订单表中商品归类后,显示每一类商品的总价
select product,sum(price) from orders group by product;
~查询购买了几类商品,并且每类总价大于100的商品
select product,sum(price) from orders group by product having sum(price)>100 ;
~查询单价小于100而总价大于100的商品的名称.
select product from orders where price<100 group by product having sum(price)>100 ;
**where 和 having都可以用来进行过滤,但是应用场景不同。where语句用来在分组之前进行过滤,having语句用来在分组之后进行过滤。
并且where语句中不允许使用聚合函数的。having语句中可以使用聚合函数。
使用where语句的地方一般都可以使用having替代,但是使用having的地方一般不能用where替代。
SQL在书写的过程中,顺序要求: select from where group by having order by
SQL在执行的过程中,执行的顺序:from where select group by having order by
===========================================================================================================================
五、备份、恢复数据库
备份数据库:
在cmd窗口中:mysqldump -u root -p db_name > c:/xxx.sql
恢复数据库:
方法1:在cmd窗口:mysql -u root -p db_name < c:/xxx.sql
方法2:在mysql中,通过source命令执行一个sql文件,恢复数据。
===========================================================================================================================
六、外键约束
外键的概念
增加外键:
foreign key(ordersid) references orders(id)
案例:
create table dept(
id int primary key auto_increment,
name varchar(20)
);
insert into dept values (null,'财务部');
insert into dept values (null,'人事部');
insert into dept values (null,'销售部');
insert into dept values (null,'科技部');
create table emp(
id int primary key auto_increment,
name varchar(20),
dept_id int,
foreign key (dept_id) references dept(id)
);
insert into emp values (null,'奥巴马',1);
insert into emp values (null,'哈里波特',2);
insert into emp values (null,'葫芦娃',3);
insert into emp values (null,'萨达姆',4);
insert into emp values (null,'朴乾',4);
七、多表设计
1-*:多的一方保存一的一方的主键作为外键
1-1:任意一方保存另一方的主键作为外键
*-*:设计一张第三方关系表,保存两张表主键的对应关系,用两个一对多来保存一个多对多。
八、多表查询
create table dept(
id int primary key auto_increment,
name varchar(20)
);
insert into dept values (null,'财务部');
insert into dept values (null,'人事部');
insert into dept values (null,'销售部');
insert into dept values (null,'科技部');
create table emp(
id int primary key auto_increment,
name varchar(20),
dept_id int
);
insert into emp values (null,'奥巴马',1);
insert into emp values (null,'哈里波特',2);
insert into emp values (null,'葫芦娃',3);
insert into emp values (null,'萨达姆',3);
insert into emp values (null,'朴乾',5);
笛卡尔积查询:是两张表相乘出来的结果,如果左边表有m条记录,右边表有n条记录,则查询处m*n条记录,这些查询结果中往往包含着大量错误的数据,通常不会使用笛卡尔积查询。
select * from dept,emp;
内连接查询:查询出左边表有且右边表也有的记录
select * from dept,emp where dept.id = emp.dept_id;
select * from dept inner join emp on dept.id=emp.dept_id;
外连接查询:
左外连接查询:在内连接的基础上增加上左边有而右边没有的记录
select * from dept left join emp on dept.id=emp.dept_id;
右外连接查询:在内连接的基础上增加上右边表有而左边表没有的记录
select * from dept right join emp on dept.id=emp.dept_id;
全外连接查询:在内连接的基础上增加上左边表有而右边表没有的记录和右边表有而左边表没有的记录
select * from dept full join emp on dept.id=emp.dept_id; #mysql不支持全外连接
select * from dept left join emp on dept.id=emp.dept_id
union
select * from dept right join emp on dept.id=emp.dept_id; #可以通过union左外和右外模拟全外连接查询
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复