基本使用
连接服务器: mysql -h 127.0.0.1 -P 2206 -u root -p
创建数据库: create database helloworld;
使用数据库: use helloworld;
创建数据库表:
create table student(id int,name varchar(32),gender varchar(32));
表中插入数据: insert into student (id, name, gender) values (1, '张三', '男');
查看表中的数据: select * from student;
查看引擎: show engines;
查看表结构: desc student;
库的操作
创建一个使用 utf8 字符集的数据库:create databases helloworld charset = utf8;
创建一个使用 utf 字符集,并带校对规则的数据库: create database helloworld charset = utf8 collate utf8_general_ci;
查看系统默认字符集以及校验规则: show variables like 'character_set_database';
show variables like 'collation_database';
查看数据库支持的字符集: show charset;
查看数据库所支持的字符校验规则: show collation;
字符校验规则对数据库的影响:
操纵数据库:
查看数据库: show databases;
显示创建语句: show create database;
数据库删除: drop database if exists helloworld;
数据库备份: mysqldump -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径;
mysqldump -u root -p mytest > ./mytest.sql
数据库的还原: source /root/Desktop/mytest.sql;
数据库备份不是整个数据库: mysqldump -u root -p密码 数据库名 表名1 表名2 > ./mytest.sql
备份多个数据库: mysqldump -u root -p密码 -B 数据库名1 数据库名2 ... > 数据库存放路径
查看连接情况: show processlist
表的操作
创建表:
create table users (id int,name varchar(20) comment '用户名',password char(32) comment '密码是32位的md5值',birthday date comment '生日' ) character set utf8 engine MyISAM;
查看表结构: desc student;
修改表:
在users表添加一个字段,用于保存图片路径:
alter table users add assets varchar(100) comment '图片路径' after birthday;
修改name,将其长度改成60:
alter table users modify name varchar(60);
删除password列:
alter table users drop password;
修改表名为employee:
alter table users rename to employee;
将name列修改为xingming:
alter table employee change name xingming varchar(60); --新字段需要完整定义
表的增删改查:
增加;
create table goods(id int unsigned primary key,goods_name varchar(50) not null default '', price float not null default 0.0 );
插入两条记录: insert into goods values(100, '牛排', 78.5);
insert into goods values(101, '披萨', 27.5);
注意细节:
1、插入的数据应与字段的数据类型相同
2、数据的大小应在规定的范围内
3、在values中列出的数据位置必须与被加入的列位置相对应。
4、字符和日期类型应包含在单引号中
5、插入空值,不指定或指定为 null:insert into table values(null)
6、批量插入:insert into goods values(1,'aa',3.3),(2,'bb',4.4),(3,'cc',5.5);
7、隐含列插入,给表中的所有字段添加数据,可以不写前面的字段名称:
insert into goods values(4,'phone',2.5);--如果没有给出字段名称,values中必须给出 所有的字段值
增加进阶:
在数据插入的时候,假设主键对应的值已经存在:插入失败!
insert into goods values(101, 'ccc', 20.5) on duplicate key update
replace into goods values(100, 'huawei', 999); //主键不冲突直接插入
更新:
1、将所有产品的价格修改为300块:update goods set price=300;
2、将id为100的产品价格修改为1000:update goods set price=1000 where id=100;
3、将id为101的产品价格增加200块:update goods set price=price+200 where id=101;
4、goods表中有5条ccc产品。我们希望将前3条改成ddd:
update goods set goods_name='ddd' where goods_name='ccc' limit 3;
update使用细节:
1、update 语法可以用新值更新原有表中的各列值
2、set子句指示要修改哪些列和要给予哪些值
3、where子句指定应更新哪些行。如果没有where子句,则更新所有行
4、where子句后面指定limit,更新限制数量的符合条件的行
删除:
1、删除表中id为101的数据:delete from goods where id=101;
2、复制表结构: create table goods2 like goods;
3、把goods表的数据复制到goods2:insert into goods2 select * from goods;
4、删除表中的所有记录:delete from goods; --删除整个表的数据,但是表的结构还存在
5、使用truncate清空表中数据:truncate table goods; --这个指令也把整个表记录删除
delete和truncate两种删除整表的区别:
1、效果一样,truncate速度快
2、delete返回被删除的记录数,而truncate返回0
3、清空表数据,建议使用truncate
delete使用细节:
1、配合where子句,可以灵活的删除满足条件的记录
2、delete语句不能删除某一列的值(可以用update置null)
3、使用delete语句仅删除记录,不删除表本身(drop table)
查询:
--创建一张学生表
create table student (id int not null default 1,name varchar(20) not null default '',chinese float not null default 0.0 comment '语文成绩', english float not null default 0.0 comment '英语成绩', math float not null default 0.0 comment '数学成绩');
--插入数据
insert into student values(1, '李涛', 89,78, 90);
insert into student values(2, '唐僧', 67,98, 56);
insert into student values(3, '孙悟空', 87,78, 77);
insert into student values(4, '老妖婆', 88,98, 90);
insert into student values(5, '红孩儿', 82,84, 67);
insert into student values(6, '如来佛祖', 55,85, 45);
insert into student values(7, '菩萨', 75,65, 30);
--查询
select --子句
--1.可以指定查询哪些列,比如:查询id,姓名,数学成绩
select id, name, math from student;
--2.distinct 如果结果中有完全相同的行,就去除重复行
select distinct math from student;
--3.select语句中可以使用as起别名
select column as 别名 from 表;
--4.在所有学生分数上加上10分(查询所有学生的总分再加10分)
select name, chinese+math+english+10 as total from student;
--5.将所有姓唐的学生成绩增加60%(查询总分再增加60%)
select name, (chinese+math+english)*1.6 as total from student where name like '唐%';
where --子句
--1.查询姓李的学生的成绩
select * from student where name like '李';
--2.查询英语成绩大于90分的同学
select * from student where english > 90;
--3.查询总分大于200分的所有同学
select id, name, math+english+chinese as 'total' from student where math+english+chinese >200; -- where后的条件不能使用total别名
--4.查询姓李并且成id大于10的学生
select * from student where name like '李%' and id > 10;
--5.查询英语成绩大于语文成绩的同学
select * from student where english > chinese;
--6.查询总分大于200分并且数学成绩小于语文成绩的姓唐的学生
select * from student where (math+english+chinese) > 200 and math < chinese and name like '唐%';
--7.查询英语分数在80 - 90 之间的同学
select * from student where english>=80 and english<=90;
select * from student where english between 80 and 90;
--8.查询数学成绩为89,90,91的同学
select * from student where math=89 or math=90 or math=91; --推荐
select * from student where math in(89,90,91);
--删除表中的的重复复记录,重复的数据只能有一份
--创建一张表:
create table tt(id int, name varchar(20));
--创建一张空表tmp_tt,空表的结构和tt一样
create table tmp_tt like tt;
--将tt表进行distinct,把数据导入空表tmp_tt
insert into tmp_tt select distinct * from tt;
--删除tt表
drop table tt;
--将tmp_tt改名成tt
alter table tmp_tt rename tt;
order by --子句
`order by 指定排序的列,排序的列可以使表中的列名,也可以是select语句后指定的别名
asc升序(默认),desc降序
order by 子句应该位于select语句的结尾`
--1.对数学成绩进行排序
select * from student order by math;
--2.对总分进行排序后,按从高到低输出
select id, name, math+english+chinese as total from student order by total desc;
--3.对姓李的学生按成绩进行从低到高排序,(因为表中只有一个姓李的学生,所以我插入一条记录)
insert into student values(8,'李雅',79,31,56);
select id, name, math+english+chinese as total from student where name like '李%' order by total;
limit --分页
--按学生的id号升序取数,每页显示3条记录。请分别显示第一页,第二页,第三页
-- 第一页
select * from student limit 0,3;
-- 第二页
select * from student limit 3,3;
-- 第三页
select * from student limit 6,3;
聚合函数
--count
--count(列名)返回某一列,行的总数
select count(*)|count(列名) from tbl_name where condition
--1.统计一个班级共有多少学生
select count(*) from student;
--2.统计数学成绩大于等于90的学生有多少人
select count(*) from student where math>=90;
--3.统计总分大于250的人数有多少
select count(*) from student where math+english+chinese>250;
sum
--1.统计一个班级数学总成绩
select sum(math) from student;
--2.统计一个班级语文,英语,数学各科的总成绩
select sum(chinese), sum(english), sum(math) from student;
--3.统计一个班级语文,英语,数学的成绩总和
select sum(chinese+english+math) from student;
--4.统计一个班级语文成绩平均分
select sum(chinese)/count(name) from student;
avg
--1.求一个班级的数学平均分
select avg(math) from student;
--2.求一个班级总分平均值
select avg(math+chinese+english) from student;
max/min
--求班级最高和最低分
select max(chinese+english+math), min(chinese+english+math) from student;
group by --子句
--1.如何显示每个部门的平均工资和高工资
select deptno,avg(sal),max(sal) from EMP group by deptno;
--2.显示每个部门的每种岗位的平均工资和低工资
select avg(sal),min(sal),job, deptno from EMP group by deptno, job;
显示平均工资低于2000的部门和它的平均工资
--1.统计各个部门的平均工资
select avg(sal) from EMP group by deptno
---2.having和group by配合使用,对group by结果进行过滤
select avg(sal) as myavg from EMP group by deptno having myavg<2000