MySQL的基本操作
修改一个数据库的字符集 alter database 数据库名 character set 字符集名; 修改一个数据库的校对规则 alter database 数据库名 collate 校对规则名; 删除一个数据库 drop database 数据库名; 练习: 1.将数据库mydb2的字符集改成utf8 2.将数据库mydb3的校对规则改成utf8_bin 3.删除mydb1数据库 创建数据表 create table 数据表名( 列名 列类型, 列名 列类型, 列名 列类型 ); MySQL中的数据类型: MySQL中的数据类型和Java中的数据类型并不是完全一一对应的关系. 数值类型 tinyint smallint MEDIUMINT int (最常用) bigint 时间和时间戳的区别: date:只包含日期,如果传入数据的时候,没有指定值,将是null timestamp:包含日和时间,如果传入数据时,没有指定值,将是当前的系统时间 字符串类型: char:(character)定长,例如:指定长度为100,但是实际传入的值只有20,剩余的字符用空格补全. varchar:(variable character):可变长度,例如:指定长度为100,但是实际传入的值只有20,真实存储的就是20个字符 创建一个没有约束的员工表: create table employee( id int, name varchar(20), gender varchar(10), birthday date, entry_date date, job varchar(50), salary double, resume text ); 查看表信息: show create table employee;//显示建表信息 desc employee;//格式化显示 单表约束: 非空约束:not null name varchar(20) not null 唯一约束:unique id int unique 在MySQL中,唯一列,允许有null值,null并不等于null 主键约束:primary key 相当于非空约束 + 唯一约束 uid int primary key auto_increment auto_increment //表示此列的值如果不传入的话,系统自动赋值,在前一条记录基础上加1(通常用在int型主键上) 练习: 创建表employee2,加上各种约束 create table employee2( id int primary key auto_increment, name varchar(10) not null, gender varchar(10) not null, birthday date not null, entry_date date not null, job varchar(50) not null, salary double not null, resume text ); 删除表: drop table tbl_name; 修改表: 添加列: alter table employee2 add email varchar(20) not null; 删除列: alter table employee2 drop email; 修改列: alter table employee2 modify job varchar(40); alter table employee2 change salary money float not null; 修改表名: alter table employee2 rename to emp; rename table emp to employee2; alter table employee2 drop money; alter table employee2 drop resume; 插入数据到数据表 insert into employee2 (id,name,gender,birthday,entry_date) values(1,'tom','male','2010-10-10','2018-3-4'); 把一个表中的所有列都显示出来 select * from employee2; insert into employee2 (id,name,gender,birthday,entry_date,job) values(2,'toms','male','2000-10-10','2018-2-5','boss'); 当插入的列是一个表的所有列的时候,此时有简化写法: insert into employee2 values(3,'toms','male','2005-10-10','2018-2-10','clear'); insert into employee2 values(4,'toms','male','2005-10-10','2018-2-10');//列数量不匹配 insert into employee2 values(null,'toms','male','2005-10-10','2018-2-10',null);//主键列可以传null,系统自动维护 //删除数据(记录)//删除表:drop 删除列:drop delete from 表名 [where id = 2]; delete from employee2 where id = 2; delete from employee2 ; 更新数据:update update 表名 set 列名 = 值 [where记录过滤条件]; update employee2 set gender = 'female'; update employee2 set gender = 'male' where id = 1; 查询:select select 列名1,列名2... from 表名; select * from emp; select id,name from emp; 中文乱码 insert into employee2 values(null,'张飞','男','2010-10-10','2018-2-10',null); 第一种解决方法: 临时: mysql --default-character-set=gbk -uroot -proot; 修改配置文件 my.ini中修改 default-character-set=gbk 重启服务生效 更新练习: 练习: 1.将tom的id改成50 update employee2 set id = 50 where name = 'tom'; 2.将tyson的id改成60,job改成HR update employee2 set id = 60,job = 'HR' where name = 'tyson'; 3.将toms的salary在原有基础上增加1000 update employee2 set salary = salary + 1000 where name = 'toms'; 4.把所有人的salary增加500 update employee2 set salary = salary + 500; truncate和delete的区别 truncate相当于delete不加where控制条件(清空表) truncate的操作是:先把表删除(drop table ...),然后重新创建一个一样的表. delete是一条一条数据的删除 练习: 1.删除表中id=2的记录 delete from employee2 where id = 2; 2.删除表中所有记录 delete from employee2 ; 3.使用truncate删除所有记录 truncate employee2; 查询操作 select * from employee; select name , id from employee; select name ,id from stu where id > 3;//把id>3的记录的name和id列的值显示 select distinct name from stu; create table stu( id int primary key auto_increment, name varchar(10), ch int not null, math int not null, team varchar(10) ); insert into stu values(null,'tom',70,70,'first'); insert into stu values(null,'tom',80,80,'first'); insert into stu values(null,'toms',90,90,'first'); insert into stu values(null,'tyson',70,70,'second'); insert into stu values(null,'tyson',80,80,'second'); insert into stu values(null,'toy',90,90,'second'); insert into stu values(null,'tyson',70,70,'thrid'); insert into stu values(null,'tyson',80,80,'thrid'); insert into stu values(null,'toy',90,90,'thrid'); //查询出的列可以进行运算 select math + 10 from stu; //别名 select math + ch as sum from stu; select math + ch sum from stu;//as 可以省略 select * from stu where id > 3; select * from stu where id <= 5; select * from stu where id != 5; select * from stu where id <> 5; //选择一组和二组的记录 select * from stu where team in('first','second'); select * from stu where team = 'first' or team = 'second'; //区间 select * from stu where ch >= 70 and ch <= 85; select * from stu where ch between 70 and 85; //模糊查询 select * from stu where name like 'to%'; %占位符,表示任意多个字符 select * from stu where name like 'to_'; _占位符,表示一个任意字符 select * from stu where name like '%m%'; 练习: 1.查询成绩在80-90之间的记录:between and select * from stu where ch between 80 and 90; 2.查询70,90分的记录 select * from stu where ch in(70,90); 3.查询所有姓张的同学的记录 insert into stu values(null,'张三',80,90,'first',null); insert into stu values(null,'张三丰',80,90,'first',null); insert into stu values(null,'张飞',80,90,'first',null); select * from stu where name like '张%'; 4.查询所有名字为两个字的记录 select * from stu where name like '__'; //排序order by select name,ch from stu order by ch asc;//按照ch列升序排序,asc可以省略 select name,ch from stu order by ch; select name,ch from stu order by ch desc; 练习:(使用测试数据的表stu) 1.查询各个学生总成绩,并按总分从高到底排序 select ch + math from stu order by ch + math desc; select ch + math sum from stu order by sum desc; 2.查询学生成绩,先按ch升序,ch相同,按math降序排序 select * from stu order by ch asc, math desc; 3.将所有姓张的同学的ch成绩降序排列 select ch from stu where name like '张%' order by ch desc; 聚合函数 count 查询某列有多少行? select count(name) from stu; select count(*) from stu; //查询表中的记录条数,不论某列是否有null值 查询stu中math成绩>80的记录条数 select count(*) from stu where math > 80; 查询stu中总成绩>150的记录条数 select * from stu where (ch + math) > 150; select count(*) from stu where (ch + math) > 150; sum 查询stu中math的总成绩 select sum(math) from stu; 查询各科总成绩 select sum(ch),sum(math) from stu; 查询整个班级总成绩 两种实现方式: 1.先求出个人的总成绩,再加起来 select sum(ch + math) from stu; select sum(ifnull(ch,0) + ifnull(math,0)) from stu; 2.先求出整个班级单科总成绩,在加起来 select sum(ch) + sum(math) from stu; 当记录中某列有null值,进行算术运算,结果都为null. 如果使用聚集函数,就会把null值当0 解决办法:使用ifnull函数 查询math的平均分 select sum(math) / count(*) from stu; 查询math的平均分 select avg(math) from stu; 查询整个班级的平均分 select avg(ifnull(math,0) + ifnull(ch,0)) from stu; //select avg(sum(ch) + sum(math)) from stu; 出错!!! 求math最高分 select max(math) from stu; 求ch最低分 select min(ch) from stu;//排除null值 create table orders( id int, product varchar(20), price double ); insert into orders values(1,'洗衣机',900); insert into orders values(2,'洗衣机',900); insert into orders values(3,'电视',700); insert into orders values(4,'电视',900); insert into orders values(5,'吹风机',20); insert into orders values(6,'游戏机',9); //求每种产品的销售总额 select product , sum(price) from orders group by product; select product , sum(price) as sum from orders group by product order by sum desc; //对分组后的数据再次进行过滤 (where) select product , sum(price) as sum from orders group by product where sum > 1000;//不能用where进行过滤 select product , sum(price) as sum from orders group by product having sum > 1000; 对group by分组之后的结果再次进行过滤,使用关键字having 统计单价在100以上的产品销售总额大于1000的,降序排序 select product,sum(price) sum from orders where price > 100 group by product having sum > 1000 order by sum desc; s f w g h o 笛卡尔积 表A 表B 1 aa1 1 bb1 2 aa2 2 bb2 3 bb3 select * from a,b; 1 aa1 1 bb1 1 aa1 2 bb2 1 aa1 3 bb3 2 aa2 1 bb1 2 aa2 2 bb2 2 aa2 3 bb3 create table dept( did int primary key auto_increment, dname varchar(20) ); create table emp( eid int primary key auto_increment, ename varchar(20), dno int ); insert into dept values(null,'财务部'); insert into dept values(null,'研发部'); insert into dept values(null,'后勤部'); insert into emp values(null,'toms',1); insert into emp values(null,'tyson',1); insert into emp values(null,'tom',2); insert into emp values(null,'lucy',3); insert into emp values(null,'lily',4); //内连接 select * from emp inner join dept on emp.dno = dept.did; select * from emp,dept where emp.dno = dept.did; (常用)