一台数据库服务器中会创建很多数据库(一个项目会创建一个数据库),在数据库中会创建很多张表(一个实体会创建一个表),在表中会有很多记录(一个对象实例回添加一条新的记录)
creat database 数据库名称 [character set 字符集 collate 字符集校对规则];
中括号里面的可以省略不写,这样会采用默认的字符集和gbk校对规则
注意SQL语言写完后,要加分号
演示:
show databases;
show create database 数据库名称;
alter database 数据库名称 character set 字符集 collate 校对规则;
drop database 数据库名称;
use 数据库名称;
select database();
语法:
creat table 表名称(字段名称 字段类型(长度) 约束, 字段名称 字段类型(长度) 约束...)
注意:
一个实体对应一个表,一个实体属性对应一个表中的字段
java中基本变量类型对mysql中的类型:
约束:
建表语句:
create database web_test1;
use web_test1;
create table user(
id int primary key auto_increment,//自动增长
username varchar(20) unique,
password varchar(20) not null,
agr int,
birthday date
);
注意:在数据库中创建表的前提是要切换到要使用的数据库中
语法:
show tables;
语法
show tables from mysql;
这样做,省去了切换数据库的麻烦
语法:
desc 表名;
语法:
drop table 表名;
语法:
alter table 表名 add 列名 类型(长度) 约束;
语法:
alter table 表名 modify 列名 类型(长度) 约束;
语法:
alter table 表名 drop 列名;
语法:
alter table change 旧列名 新列名 类型长度 约束;
语法:
rename table 表名 to 新的表名;
语法:
alter table 表名 character set 字符集;
语法:
insert into 表名(列名1,列名2,列名3...)values(值1,值2,值3..);
insert inot 表名 values(值1,值2,值3...);
注意事项:
添加记录:
insert into user (id,username,password) values(null,'aaa','123');
insert into user values(null,'bbb','123',23,'1997-2-1');
展示添加的效果:
按照上面的思路,下面的插入代码应该这样写:
insert into user values(null,'大忽悠','123',23,'2002-1-2');
直接向数据库插入中文记录会出现错误!!!
解决方法:
show variables like '%character%'; 查看数据库中与字符集相关的参数
需要将MySql数据库客户端服务器部分的字符集改为gbk
找到MySql的安装路径:my.ini文件,修改文件中[client]下的字符集
修改完后,重新启动MySql服务
修改后,再次查看数据库中与字符集相关的参数
重新再次插入中文:
语法:
update 表名 set 列名=值,列名=值 [where 条件];
注意事项:
update user set password="5201314";
这里字符串用双引号其实也可以
update user set password="123456" where username="大忽悠";
update user set password="654321",agr="100" where username="aaa";
同时修改两个对象的值:
update user set password="654321",agr="100" where username="aaa" or username="大忽悠";
语法:
delete from 表名 [where 条件]
注意事项:
delete from user where username="aaa";
delete from user;
另一种写法:
truncate table user;
两者写法的区别:
delete from user;
删除所有记录,属于DML语句,一条记录一条记录的删除。事务可以作用在DML语句上。
truncate table user;
删除表中所有记录,属于DDL语句,将表删除,然后重新创建一个结构一样的表。事务不能控制DDL的
语法:
select [distinct] * from 表 [条件]; //*是查看所有列,distinct去除重复记录
或者
select [distinct] 列名1,列名2... from 表 [条件];
环境准备:
create table exam(
id int primary key auto_increment,
name varchar(20),
english int,
chinese int,
math int
);
insert into exam values (null,'张三',85,74,91);
insert into exam values (null,'李四',95,90,83);
insert into exam values (null,'王五',85,84,59);
insert into exam values (null,'赵六',75,79,76);
insert into exam values (null,'田七',69,63,98);
insert into exam values (null,'李老八',89,90,83);
select *from exam;
select name,english from exam;
select distinct english from exam;
select name,english+chinese+math from exam;
select name,english+chinese+math as sum from exam;
或者
select name,english+chinese+math sum from exam;
select *from exam where name="李四";
select *from exam where name="李四" and english>90;
like可以进行模糊查询,在like字句中可以使用_或者%作为占位符号,_只能代表一个字符,%代表任意个字符。
like '李_' :名字必须是两个字,必须姓李
like '李%': 必须是姓李的学生,李字后面可以跟任意个字符
like '%四': 名字中以四结尾的
like '%王%': 只要名称中包含这个王字即可
代码:
select *from exam where name like '李_';
select *from exam where name like '李%';
select *from exam where english in (69,75,89);
select *from exam where english>=75 and (english=75 or english=89);
语法:
order by 字段名称 asc/desc;//asc升序 desc降序 默认升序
select *from exam order by chinese;
或者
select *from exam order by chinese asc;
select *from exam order by chinese desc;
逗号分隔条件:按照多个条件进行排序,总是先执行第一个条件,再执行第二个条件,即第一个条件都满足时,走第二个条件
select *from exam order by chinese desc,english asc;//按照多个条件进行排序,总是先执行第一个条件,再执行第二个条件,即第一个条件都满足时,走第二个条件
select *from exam where name like '李%' order by english desc;
select sum(english) from exam;
或者
select sum(english) as englishSum from exam;
select sum(english),sum(math) from exam;
select sum(english) from exam where name='李%';
select sum(english)+sum(math)+sum(chinese) from exam;//按照列的方式统计,先计算所有学生的英语成绩总和,然后是语文成绩总和,最后计算数学成绩总和
或者
select sum(english+math+chinese)from exam;//计算完当前学生的英语,语文,数学成绩之和,再计算下一个学生的,最后累加所有学生的成绩总和
注意:在sql中null加上任何值都为null,因此上面两种写法,在遇到null数据时,计算结果会不同
数据中存在null的值:
下面来看存在null时,两种方法得到的结果:
1.对应竖排统计:从上到下,遇到null值时就停止累加 2.横排统计:从左到右,遇到null值时就停止累加
解决方法 使用ifnull函数:
select sum(ifnull(english,0)+chinese+math) from exam;
select count(*) from exam;
select count(*) from exam where name like "李%";
select max(math) from exam;
select min(math) from exam;
select avg(chinese) from exam;
group by 字段名称
环境准备:
create table orderitem
(
id int primary key auto_increment,
product varchar(20),
price double
);
insert into orderitem values (null,'电视机',2999);
insert into orderitem values (null,'电视机',2999);
insert into orderitem values (null,'洗衣机',1000);
insert into orderitem values (null,'洗衣机',1000);
insert into orderitem values (null,'洗衣机',1000);
insert into orderitem values (null,'冰箱',3999);
insert into orderitem values (null,'冰箱',3999);
insert into orderitem values (null,'空调',1999);
select product,count(*) from orderitem group by product;
select product,sum(price) from orderitem group by product;
where子句后面不能跟聚合函数,如果要使用带有聚合函数的条件过滤(分组后条件过滤),需要使用一个关键字having
select product,sum(price) from orderitem group by product having sum(price)>5000;
select product,sum(price) from orderitem group by product having sum(price)>5000 order by sum(price) asc;
Sql操作表的基本范式:
S(select)...F(from)...W(where)...G(group by)...H(having)...O(order by);
条件顺序不能颠倒,例如*where子句不能放在group by 后面 每一部分如果不需要可以省略,例如:如果不需要where子句可以不写,以此类推