目录
3. delete delete from tbl_name [WHERE where_definition]
1. 基本查询 select [distinct ] *|{column1, column2. column3..} FROM table;
4.聚合函数—Count ,Sum,Avg ,max/min
- 数据库的增删改查选择:create ,drop ,alter ,select ,show
- 表的增删改查:create ,drop,alter, desc
- 表中的数据CRUD:insert,delete from,update,select -where子查询
a. 操作数据库
1. 创建数据库
- 创建一个名称为mydb1的数据库。 create database mydb1;
- 创建一个使用gbk字符集的mydb2数据库。 create database mydb2 character set gbk;
- 创建一个使用utf8字符集,并带校对规则的mydb3数据库。 create database mydb3 character set utf-8 collate utf8_bin;
2. 查看数据库
- 显示数据库创建语句:SHOW CREATE DATABASE db_name
- 查看当前数据库服务器中的所有数据库 show databases;
- 查看前面创建的mydb2数据库的定义信息: show create database mydb3;
3. 修改数据库
- 查看服务器中的数据库,并把其中mydb2字符集修改为utf8:alter database mydb2 character set utf8;
4. 删除数据库
- 删除前面创建的mydb1数据库 drop database mydb1;
5. 选择数据库
- 进入数据库:use db_name;
- 查看当前所选的数据库: select database();
b. 操作表
1. 创建表
- 创建一个员工表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(40),
salary double,
resume text
);
2. 查看表
- 查看表结构:desc tabName
- 查看当前数据库中所有表:show tables
- 查看当前数据库表建表语句 show create table tabName;
3. 修改表
- alter table tablename add/modify /drop/character set /change 列名 列类型
- *修改表的名称:rename table 表名 to 新表名;
- 在上面员工表的基本上增加一个image列:alter table employee add image blob;
- 修改job列,使其长度为60。alter table employee modify job varchar(60);
- 删除gender列。alter table employee drop gender;
- 表名改为user。rename table employee to user;
- 修改表的字符集为gbk。 alter table user character set gbk;
- 列名name修改为username。 alter table user change name username varchar(20);
4. 删除表
- 删除user表。drop table user;
c. 操作表记录CRUD
1. insert
insert into tablename [(列名,列名)] values (值 ,值);
- 插入的数据应与字段的数据类型相同。
- 数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
- 在values中列出的数据位置必须与被加入的列的排列位置相对应。
- 字符和日期型数据应包含在单引号中。
- 插入空值:不指定或insert into table value(null)
- 如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表
使用insert语句向表中插入三个员工的信息
- insert into employee (id,name,gender)values (null,'张飞',1,);
- insert into employee values (null,'关羽',1,'1998-08-08','1998-10-01','财神爷','老大的二弟');
- insert into employee values (null,'刘备',0,'1990-01-01','公司的老大'),(null,'赵云',1,'2000-01-01','老大贴身人');
2. update
update tbl_name set 列名=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语句。
- 同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题, 外键约束
- 删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同,参看mysql文档。
- TRUNCATE删除快,删除整表,不记录日志 ,不可以回滚
- Delete 删除部分数据,记录日志,可以回滚
例题:
- 删除表中名称为’张飞’的记录。 delete from employee where name='张飞';
- 删除表中所有记录。 delete from employee;
- 使用truncate删除表中记录。 truncate table employee;
d. select
1. 基本查询 select [distinct ] *|{column1, column2. column3..} FROM table;
- 查询表中所有学生的信息。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 ,english+math+chinese from exam;
- 使用别名表示学生总分。select name as 姓名 ,english+math+chinese as 总成绩 from exam;
2.使用where子句进行过滤查询
- 查询姓名为张飞的学生成绩: select * from exam where name='张飞';
- 查询英语成绩大于90分的同学: select * from exam where english > 90;
- 查询总分大于230分的所有同学:select name 姓名,math+english+chinese 总分 from exam where math+english+chinese>230;
- 查询英语分数在 80-100之间的同学。:select * from exam where english between 80 and 100;
- 查询数学分数为75,76,77的同学: select * from exam where math in(75,76,77);
- 查询所有姓张的学生成绩:select * from exam where name like '张%';( '张__')
- 查询数学分>70,语文分>80的同学: select * from exam where math>70 and chinese>80;
3.使用order by关键字对查询结果进行排序操作
select column1, column2 from table where... order by column asc|desc; asc 升序 -- 默认就是升序, desc 降序
- 对语文成绩排序后输出: select name,chinese from exam order by chinese desc;
- 对总分排序按从高到低的顺序输出: select name 姓名,chinese+math+english 总成绩 from exam order by 总成绩 desc;
- 对姓张的学生成绩排序输出: select name 姓名,c+e 总成绩 from exam where name like '张%' order by 总成绩 desc;
4.聚合函数—Count ,Sum,Avg ,max/min
(1)Count -- 用来统计符合条件的行的个数
- 统计一个班级共有多少学生:select count(*) from exam;
- 统计数学成绩大于90的学生有多少个: select count(*) from exam where math>70;
- 统计总分大于230的人数有多少:select count(*)from exam where math+english+chinese > 230;
(2)Sum -- 用来将符合条件的记录的指定列进行求和操作
- 统计一个班级数学总成绩:select sum(math) from exam;
- 统计一个班级语文、英语、数学各科的总成绩:select sum(math),sum(english),sum(chinese) from exam;
- 统计一个班级语文、英语、数学的成绩总和:select sum(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam; // 在执行计算时,只要有null参与计算,整个计算的结构都是null,此时可以用ifnull函数进行处理
- 统计一个班级语文成绩平均分: select sum(chinese)/count(*) 语文平均分 from exam;
(3)Avg -- 用来计算符合条件的记录的指定列的值的平均值
- 求一个班级数学平均分:select avg(math) from exam;
- 求一个班级总分平均分:select avg(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
(4)max/min -- 用来获取符合条件的所有记录指定列的最大值和最小值
- 求班级最高分:select max(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
- 求班级最低分:select min(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
5.group by分组查询
- 对订单表中商品归类后,显示每一类商品的总价: select product,sum(price) from orders group by product;
- 询购买了几类商品,并且每类总价大于100的商品: select product 商品名,sum(price)商品总价 from orders group by product having sum(price)>100;
- 查询单价小于100而总价大于150的商品的名称:select product from orders where price<100 group by product having sum(price)>150;
where子句和having子句的区别:
- where子句在分组之前进行过滤having子句在分组之后进行过滤
- having子句中可以使用聚合函数,where子句中不能使用
- 很多情况下使用where子句的地方可以使用having子句进行替代
e. 查询语句的书写顺序和执行顺序
书写顺序: select--from--where--group by--having--order by , 其中select和from是必须的,其他关键词是可选的,
执行顺序按照下列子句次序:
1.from 子句:执行顺序为从后往前,从右到左。数据量较少的表尽量放在后面
2.where子句:执行顺序为自下而上,从右到左。将能过滤掉最大数量的记录条件写在where子句的最右
3.group by子句:执行顺序从左往右分组。 最好在group不用前使用where将不需要的的记录在group by之前过滤掉
4.having子句:消耗资源,尽量避免使用,having会在检索出所有的记录之后才对结果进行过滤,需要排序等操作
5.select 子句:少用*号,尽量取字段名称,oracle在解析的过程中,通过查询数据字典将*号,依次转换成所有的列名,消耗时间
6.order by子句:执行顺序从左往右排序,消耗资源
select子句顺序
子句 | 说明 | 是否必须使用 |
select | 要返回的列或表示式 | 是 |
from | 从中检索数据的表 | 仅在从表选择数据时使用 |
where | 行级过滤 | 否 |
group by | 分组说明 | 仅在按组计算聚集时使用 |
having | 组级过滤 | 否 |
order by | 输出排序顺序 | 否 |
limit | 要检索的行数 | 否 |
f. 表连接
leftjoin
rightjoin
表连接图片