1.INSERT 向表中添加数据
INSERT[LOW_PRIORITY|DELAYED|HIGH_PRIORITY][IGNORE]
[INTO] tb1_name[(col_name,...)]
values({expr|DEFAULT},...),(...),...
[NO DUPLICATE KEY UPDATE col_name=ecpr,...]
或
INSERT [LOW_PRIORITY|DELAYED|HIGH_PRIORITY][IGNORE]
[INTO] tb1_name
SET col_name={ecpr| DEFAULT},...
[ON DUOLICATE KEY UPDATE col_name=expr,...]
或
insert[LOW_PRIORITY|HIGH_PRIORITY][IGNORE]
[INTO] tb1_anme[(col_naem,...)]
SELECT...
输入的数据要求与字段的定一的数据类型保持相同 数据的大小应该在列的规定范围之内 例如,不能够将320个长度的字符串存放在长度为32的name字段中 在values中列出的数据的位置必须要与加上的列的排序位置相对应 如果地段是日期类型 需要使用单引号,比如'2016-11-13' 插入空值在不给列赋值的情况下默认该列的值为空(null) 如果我们在往表中所有的字段插入数据,则可以省略哥哥字段名
eg:
create table students(
id int primary key auto_increment,
name varchar(32),
gender bit default 1,
);
向表中所有的字段添加数据:
insert into students(id,name,gender)values(1,'lily',0);
or:
insert into students values(2,'luck',0);
or:
insert into students values(null,'tom',1);
重点注意: 如果我们往自增长的主键中存入null值,则会同样按着自己的方式增长,而不会把null值存入
向表中指定的字段添加数据:
insert into students(name) value('siri');
********** mysql中的乱码问题 *********
查看所有的字符集
show variables like 'character%';
mysql中有六处使用了字符集,分别是:client,connection,database,results,server,system
client:是客户端使用的字符集
connection:是间接数据库的字符集设置类型,如果程序没有指明链接数据库的字符集类型,就按照默认的字符集设置
database:是数据库服务器中某个数据库实例使用的字符集设定,如果创建数据库实例的时候没有指明,则将使用服务器默认的字符集设定
results:是数据库给客户端返货结果时使用的字符集设定,如果没有指明,就按照默认的字符集设定
server:是服务器安装时指定的字符集设定
system:是数据库系统使用的字符集设定(utf8 不可修改)
设置当前端口指定的字符集(将会影响到) client, connection,results
set names gbk;
通过修改mysql安装目录下的my.ini文件中的支付及来进行修改
创建一张emp表 并且插入几条数据
create table emp(
id int primary key auto_increment,
name varchar(32),
gender char(2),
age int,
position varvahr(32),
salary double,
resume text
);
insert into emp values(1,'唐老三','男',18,'总经理',15000,'老子上面有人');
insert into emp values(2,'孙猴子','男',500,'市场总监',15000,'擅长各种人际关系');
insert into emp values(3,'猪刚鬣','男',1500,'公关部经理',15000,'喜欢各种娱乐场所');
insert into emp values(4,'沙悟净','男',800,'业务骨干',15000,'勤勤恳恳,老老实实');
insert into emp values(5,'小白龙','男',300,'渠道经理',15000,'跑得快');
select * from emp;
2,update语句
Single-table语法:
UPDATE [LOW_PRIORITY][IGNORE] tb1_name
SET col_name=expr1 [,col_name2=expr2...]
[WHERE where_definition]
[ORDER BY...]
[LIMIT row_count]
Multiple-table语法
UPDATE [LOW_PRIORITY][IGNORE] table_references
SET col_name1=expr1 [,col_name2=expr2...]
[WHERE where_definition]
update语法可以用新值更行原有表行中的各列,set字句指示要修改那些列和要给予 那些值,where子句指定应更新那些行,如果没有where子句 则更新所有的行 如果指定了order by子句 则按照被指定的顺序对行进行更新 limit自己用于给定一个限定,限制可以被更新的行的数目
update语句支持一下修饰符
·如果你使用low_priority关键字 则update的执行被延迟了,知道没有其他的客户端从表中读取为止
·如果你是用ignore关键之 则及时在更新过程中出现错误 更新语句也不会中断 如果出现了重复关键字冲突, 则这些行不会被更新 如果列被更新后 新值会导致数据转化错误 则这些行被更新为最接近的合法值
如果你在一个表达式中通过tb1_name访问一列,则update使用列中的当前值
将所有的员工工资改为8888
update emp set salary=8888;
重点:如果我们在更新的时候没有加上条件限定 则会修改整个列
将猪刚鬣的薪资改为9999
update emp set salary=9999 where name='猪刚鬣';
将孙猴子的职位提升为副总,并且薪资增长10000;
update emp set position='副总', salary=18888 where name='孙猴子';
将唐老三的薪资增加20000
update emp set salary=salary+20000 where name='唐老三';
3delete语句
单表达式
delete [low_priority] [quick] [ignore] from tb1_name
[where where_definition]
[order by...]
[limit row_count]
多表达式
delete [low_priority] [quick] [ignore]
from tb1_name[.*] [,tb1_name[.*]...]
using table_references
[where where_definition]
删除小白龙的记录
delete from emp where name='小白龙';
删除表中的所有数据
delete from emp;
使用truncate关键字删除表中的记录
truncate table emp;
删除表
drop table emp;
重点 区别 delete truncate drop
delete:在删除数据的时候如果没有加上条件限定,则会一条一条的删除表中的所有数据,但会保留整体的表结构,删除操作是,是删除的整行数据,而不能通过逐列删除数据 这种方式很耗时 但是删除的数据可以找回
truncate:删除的是表中所有的数据,保留表结构 其删除的本质是一次性摧毁一张表,然后按照原来的表结构在创建出来一张表
drop: 是删除一张表 删除后 表结构也不复存在
**** 建表 ****
创建一个学生考试成绩表:
create table exam(
id int primary key aoto_increment,
name varchar(32) not null,
chinese int,
math int,
english int
);
-- 因为name的字段约束条件为not null 所以不能够为null
-- field'name' doesn't have a default value
-- insert into exam(id) value(null);
insert into exam values(null,'lily',95,96,98);
insert into exam values(null,'luck',89,95,92);
insert into exam values(null,'jack',92,88,96);
insert into exam values(null,'rose',86,85,82);
insert into exam values(null,'tom',91,86,89);
insert into exam values(null,'erci',82,88,82);
把查询的结果插入到表中
insert into 插入的表名(插入的字段) select 查询的字段 from 表名 条件
4.select 数据(核心操作)
1.基本查询
查看所有学生的信息
select id,name,chinese,math,english from exam;
or:
select * from exam;
重点"*"表示通配符,匹配所有的列,当然也可以直接写出要查询的列
查询所有学生的数学成绩,并且去掉重复数据
第一步:
select id,name, math from exam;
第二步:
select distinct math from exam;
重点:关键字distinct是查询到的所有数据中去掉重复的数据
在所有学生的所有学科分数上分别加上10分的卷面分
select id,name,chinese+10,math+10,english+10 from exam;
重点:这一种凡是不会改变数据本身,这是一种表象
统计每个学生的总成绩
select id,name,chinese+math+english from exam;
or:
select id,name as 姓名,chinese+math+english 总成绩 from exam;
重点:关键字as是给字段取别名 可以省略不写而直接添加别名
2.使用where 子句 进行过滤子查询
查询姓名为lily的学生成绩
select * from exam where name='lily';
查询数学成绩大于90的学生信息
select * from exam where math>90;
查询总分大于270的学生信息:
-- Unknown column '总成绩' in 'where clause';
-- 这里是不能使用别名的,应为还没被查询出来
-- select name as 姓名,(chinese+math+english) 总成绩 from exam where 总成绩>=270;
select name as 姓名,(chinese+math+english) 总成绩 from exam where (chinese+math+english)>=270;
查询语文成绩在85--95之间的学生信息:
select name,chinese from exam where chinese>=85 and chinese<=94;
or:
select name,chinese from exam where chinese between 85 and 94;
重点:between...and...在两者之间的所有
查询所有语文成绩分别是91 92 93的学生信息:
select name,chinese from exam where chinese=91 or chinese=92 or chinese=93;
or:
select name,chinese from exam where chinese in(91,92,93);
重点:or关键字表示的或者关系
in(数据范围)在...之内的条件
查询所有语文,数学,外语成绩都在90分以上的学生信息
select name,chinese,math,english from exam where chinese>=90 and math>=90 and english>=90;
重点:and关键字表示并列的条件限定
查询所有成绩不为252的学胜信息
select name,(chinese+math+english) 总成绩 from exam where(chinese+math+english)!=252
or:
select name,(chinese+math+english) 总成绩 from exam where(chinese+math+english) <> 252
重点:<> 符号表示为不等于的含义
重点:区分符号 "!=" 和 "<>" 的区别(<>是官方的)(!=是非官方的)
**** 创建表 ****
create table employees(
id int(11) not null auto_increment,
name char(32) character set utf8 collate utf8_bin default null,
gender bit(1) default 1,
age int(11) default null,
birthday data default null,
entry_data data default null,
position varchar(32) default null,
salary double default null,
resume text character set utf8 collate utf8_bin,
bonus double default null,
primary key (id)
)engine=innodb auto_increment=31 default charset=utf8;
3.模糊子查询
在employees表中查询所有姓赵的员工信息
select * from employees where name like '赵%';
查询employees表中所有姓名中带有三的员工信息
select * from employees where name like '%三%';
查询employees表中所有姓周并且只有两个字的员工信息
select * from employees where name like '周_';
查询employees表中第二个字是三的员工信息
select * from employees where name like '_三%';
重点:
like 是模糊查询的关键字
%通配所有的字符
_统配单个字符
\也表示转义字符 表示匹配\后面的一个字符
4.使用order by关键字对查询的结果进行排序
asc:升序排序 这是默认的操作
desc:降序排序
employees表中对员工的年龄进行排序:
select name,age from employees order by age;
or:
select name,age from employees order by age asc;
在employees中对员工的年龄排序,并且去重
select distinct age from employees order by age;
按照employees表中的所有员工的年薪的降序排序查询所有的员工信息
--如果某一个数和null进行运算,则会导致整个结果为null
-- select name 姓名,(salary+bonus)*12 年薪 from employees order by 年薪 desc;
select name 姓名,(ifnull(salary,0)+ifnull(bonus,0))*12 年薪 from employees order by 年薪 desc;
重点:ifnull(字段名,代替值):在执行计算的时候,只要有null参与运算,就把null值替换掉
查询所有姓赵的员工的职位和年薪 并且按照年薪降序排序
select name 姓名,position 职位,(ifnull(salary,0)+ifnull(bonus,0))*12 年薪 from employees where name like'赵%' order by 年薪 desc;
5.函数
1.count 用来统计符合条件的所有行数
统计employees表*有多少条数据
select count(*) from employees;
select count(*) 员工总数 from employees;
统计工资在10000以上的员工有多少个
select count() from employees where salary>10000;
统计年薪高于100000 的员工有多少个
select count() from employees where(ifnull(salary,0)+ifnull(bonus,0))*12>1000000;
统计公司共有多少个姓赵的员工
select count(*) from employees where name like '赵%';
2.sum:用来将符合条件的记录的指定的列进行求和操作
统计公司一个月供要发放多少工资
select sun(ifnull(salary,0)+ifnull(bonus,0)) from employees;
求一年中公司要发放的薪资总数
select sun(ifnull(salary,0)+ifnull(bonus,0))*12 人力成本 from employees;
求公司员工平均年薪:
select sun(ifnull(salary,0)+ifnull(bonus,0))*12/count(*) 平均年薪 from employees;
3.avg:用来计算符合条件的记录的指定列的平均值
求共识员工的平均工资
select avg(salary+ifnull(bonus,0)) from employees;
求公司全体职员的平均年龄
select avg(age) from employees;
4.max:用来获取符合条件的记录的指定列的最大值
求公司中员工年龄最大的员工信息
select max(age) from employees;
or:
select * from employees where age=(select max(age) from employees);
求共识中年薪最高的员工信息
select * from employees where (salary+ifnull(bonus,0))*12=(select max(salaru+ifnull(bonus,0))*12 from employees);
5.min:用来获取符合条件的记录的指定列的最小值
求共识中工资最低的员工信息
select * from employees where (salary+ifnull(bonus,0))*12=(select min(salary+ifnull(bonus,0))*12 from employees);
6.group by 分组查询
对公司员工按照职位进行分类 并且求出每一类岗位工作人员的总人数和总工资
select position 职位, count(position) 人数,sum(salary+ifnull(bonus,0)) 总工资 from employees grope by position;
对公司员工按照职位进行分类 并且求出每一类岗位工作人员的总工资 并且降序排序
select position 职位 ,sum(salary+ifnull(bonus,0)) 总工资 from employees grope by position order by 总工资 desc;
对公司员工按照职位进行分类,并且求出总工资大于20000的每一类工作岗位的员工总工资 并且降序排序
select position 职位, sum(salarty+ifnull(bonus,0)) 总工资 from employees grope by position having 总工资>20000 order by 总工资 desc;
重点:having子句是对分组之后的结果进行条件过滤
查询每一种职位上年龄在25岁以上的员工个数
select position, count(position) from employees where age>25 group by position;
-- Unknown column 'age' in having clause
-- select position, count(position) from employees grope by position having age>25;
对公司员工按照职位进行分类,并且要求员工年龄在25岁以上, 并且总工资大于20000的每一类工作岗位上的员工工资 并且降序排序
select position 职位,sum(salary+ifnull(bonus,0)) 总工资 from employees where age>25 group by position having 总工资>20000 order by 总工资 desc;
重点: 区分 where 和 having 的区别
where 字句在分组之前进行过滤
having 字句在分组之后进行过滤
having 字句可以使用聚合函数 而 where 字句后面不能够使用聚合函数
很多时候在where字句的地方都能使用having进行代替
重点:
sql的书写顺序
select from where grope by having order by;
SQL的执行语句
from where select grope by having order by;
7.分页查询
分页查询格式:
limit 起始行 要查询几行
起始行从0行开始
分页:当前页 每页显示多少条数据
分压查询当前页的sql命令
select * from employees limit(当前页-1)*每页显示多少条数据, 每页显示多少条数据
查询第1.2.3条记录
select * from employees limit 0,3;
查询第11,12,13,14,15条记录
select * from employees limit 10,5;
查询第28,29,30,31.32条记录(没有数据不显示)
select * from employees limit 27,5;
**** 数据库的备份与恢复 ****
备份:
cmd 窗口下,mysqldump -u -p 数据库名称>备份路径
eg: mysqldump -u root -p mydb>c:/mydb.sql;
恢复:
在cmd窗口下,mysql -u root -p 数据库名称<文件路径
eg: mysql -u root -p mydb<c:/mydb.sql;
在mysql命令下: source 文件路径
eg: source c:/mydb.sql;
重点我们在进行数据库恢复的时候,只能够恢复数据本身,不能够恢复数据库实例,需要我们自己创建出数据库实例后才能进行数据库恢复