4、查询
1、条件语句(where)
select * from person; // 整张表查询 ,
* 代表所有字段,如果用这种方式,java中类中属性的个数与 字段个数不匹配的时候,会报错
2、 select name, age, ... from person; // 需要什么字段,查询什么字段就可以了
3、select name,age from person where name = 'aa'; // 根据名字进行查询
4、select name,age form person where name = 'cc' and age = 3 and 1 = 1; // 名字='cc'并且age=3
5、select name,age from person where name = 'cc' or age = 3; 名字='cc' 或者 age = 3
6、select name,age from person where name in ('aa','cc'); // 效率太低,一般不用
7、select name,age from person where name like '%c%'; // %是通配符
8、select name,age from person where age > 3; // 把年龄大于3都查出来
9、select name,age from person where age BETWEEN 2 and 5; // 查询出[2,5]区间内的数据
2、order by 排序
order by 字段 [asc/desc] asc 升序 desc 降序
select name,age from person where age BETWEEN 2 and 5 order by age desc; //查询出[2,5]区间内的数据,按照年龄降序排
select name,age from person where age BETWEEN 2 and 5 order by age desc,
name asc; //查询出[2,5]区间内的数据,先按照年龄进行降序, 如果年龄一样的话, 按照姓名进行升序
3、limit begin,count 分页 下标计算从0开始, 查询多少个
select * from persin where name link '%c%' limit 1, 2; // 从第一行记录开始,查询两条
4、表关联
一张表中还能存储一种类型数据
班级(主键,班级名称,班级人数,班级代码)
学生(主键,名称,学号,班级主键(外键))
1、外键
当我们进行表关联的时候,我们可以通过外键约束一下
1.创建表的时候直接添加
create table表名(字段,类型,字段,类型,…,constraint [外键名称] foreign key(外键字段)references 父表(主键字段))
create table stu(id int primary key auto increment,name varchar(20),card_id varchar(10),clazz_id int,constraint fk_clazz_id_id foreign key(clazz_id)references clazz(id));
2.通过alert进行修改
(外键起名要有一个命名规则)(自己习惯的规则)
Alter table 表名 add [constraint 外键名字] foreign key(外键字段)references 父表(主键字段);
alter table stu add constraint fk_clazz_id id foreign key(clazz_id)references clazz(id);
3.删除外键
alter table [表名] drop foreign key [外键名称];
alter table stu drop foreign key fk_clazz_id_id;
4.查询外键
show create table [表名]
2、级联操作(级联更新,级联删除)
1、级联更新,当父表主键发生变化变化的时候,从表中外键也跟着更新
alter table stu add constraint fk_clazz id_id foreign key(clazz_id)references clazz(id)update cascade;
2、级联删除,当父表中记录被删除时候,字表外键相关的记录全部被删除
alter table stu add constraint fk_clazz_id_id foreign key(clazz_id)references clazz(id)on delete cascade;
级联更新和级联删除可以一起使用,默认情况下不带级联更新和级联删除的
3、表连接查询
查询出表中所有的记录 select from stu,clazz(笛卡尔积33=9行记录)
添加关联条件(不使用) select* froml stu,clazz where stu.clazz_id=clazz.id
连接查询
1、内连接 inner join (on是关联条件)两张表中符合条件的交集
select *from stu inner join clazz on stu.clazz_id=clazz.id
2、左连接 left join 哪张表在前面,哪张表就是左表
select*from stu left join clazz on stu.clazz_id=clazz.id
3、右连接 right join 把右表内容都列出来,左表中有匹配的就匹配,没有匹配的直接为空
select * from stu right join clazz on stu.clazz_id=clazz.id
或者三张表,四张表
select * from stu inner join clazz on stu.clazz_id = clazz.id inner join teacher on stu.stu_id = teacher.id left jon ...
4、子查询
一个查询的结果是另外一个查询的条件
select name from clazz where id in (select clazz_id from stu where name='zhangsan'
5、别名(as)
通过as可以给表起别名,也可以给字段起别名
select s.name as sname,c.name as cname,C.number cnumber from stu as s inner join clazz as c on s.clazz_id=c.id;
as可以省略掉
select s.name sname,c.name cname,c.number cnumber from stu s inner join clazz c on s.clazz_id=c.id ;
6、分组查询(group by)
分组查询(group by)
学生表(姓名,年龄,性别)
create table stu2(id int primary key auto_increment,name varchar(20),age tinyint,gender char(1));
insert into stu2(name,age,gender)value('wang',20,'m'),('li',19,'m'),('h',16,'m'),('h',20,'g'),('j'19,'g′),('a',19,'g'),('q',19,'g'),('z',16,'g');
1、查询出男生有多少人,女生有多少个人
select gender,count(gender)gcount from stu2 group by gender;
2、查询出18岁以上的男生有多少人,18岁以上的女生有多少人(年龄大于18岁)(where分组之前执行过滤)
select gender,count(gender)gcount from stu2 where age>18 group by gender;
3、查询出18岁以上的男生,人数大于3个的性别才加入统计(having分组出结果之后,过滤结果)
select gender,count(gender)gcount from stu2 where age>18 group by gender having gcount>3;
5、三大范式
三大范式,设计数据数据库的一个原则
1.对于属性(字段)必须是原子性的,不可再进行分割
person表(name,age,gender,tel,birthday)
2.对于记录的唯一性,要求记录有唯一标识,
数据表中都要求主键,而且主键尽量不要是业务字段,单独拿个字段来做主键
字段与主键要有直接关系,不是间接关系,确保一张表中只能存储一种类型的数据,不能存储多种
3.对于字段的冗余性,要求任何字段不能由其他字段派生过来,要求字段没有冗余性
person表(province,abbreviation,name)
省份的简称可以有省份派生过来
但是在实现开发中我们允许有适当的冗余来减少数据库操作花费的时间
在一张表中只能存储一种类型的数据,不能存储多种
6、mysql的函数
1、max 最大值
求男生的最大年龄
select gender, max(age) mage from stu2 group by gender having gender = 'm';
2、 min 最小值
求女生最小年龄
select gender, min(age) mage from stu2 group by gender having gender = 'g';
3、count 数量和
分别求男生和女生的数量
select gender, count(gender) gcount from stu2 group by gender;
4、avg 平均数
男生和女生的年龄的平均数
select gender, avg(age) gcount from stu2 group by gender;
5、concat 字段拼接
全表查询,把姓名字段和年龄字段拼接输出
select name,age,concat(name,'-','age') cc from stu2;
6、substring 字段裁剪 substring(字段,begin,count) begin 是从1开始的
截取姓名的字段的首字母输出
select name ,substring(name,1,1) sub from stu2;
7、password (不要求了解)
加密 8.0被移除了,咱们在开发时候不使用,讲这个目的是 mysql的登录密码是password加密存储的时候对姓名进行加密,并查询
8、md5 (不要求了解)
insert into stu2 (name,age,gender) value (substring(md5('aa'),1,10),12,'m');
select * from stu2 where name = substring(md5('aa'),1,10);