insert into tablename
(字段1,字段2,字段3....)
values
(value1,value2,value3...)
..........................
(value1,value2,value3...)
在添加多条数据的时候注意插入的数据类型要与字段能够放入的类型相一致,或相兼容,并且值的个数,顺序,类型要与字段的个数、顺序,类型一致。
insert语句中列的数量必须和值的数量一致
每个值的数据类型,精度和小数位必须和列的要求向匹配
列的值要符合列的约束
如果列有默认值,可以使用关键字default来插入默认值
where条件判断
where id = 1;
where id > 1 and id < 6;
where id in(1,2,3,6,4,5);
where id between 1 and 7;(在两者之间包括1和7)
where 字段名 is null(找出字段为空)
where 字段名 is not null(找出字段名不为空)
where id = 2 or id = 23(找出id为2或id为3的值)
where `name`='tom'
mysql运算符
等于---------=
不等于--------!= <>
小于---------<
大于--------->
小于等于-----<=
大于等于----->=
between 在制定的两个值之间
关系运算符
and
or
not
update table:
Update tablename
set
col_name = value
where 条件限制;
delete table:
delete某条记录
delete from tablename where 条件判断;
delete 全表记录
delete from tablename;
当删除整个表的时候使用delete from tablename的方式执行效率很低,这个时候可以使用truncate table tablename;
使用truncate的时候不能跟where条件判断,这种将整个表中的数据删除的效率是很高的。
表的设计:
在设计表的时候每个表都相当于一个实体类,每个实体类的对象相当于表中的一条记录。对象的属性相当于表中的字段。
表的设计
三大范式;
1.确保每列的原子性
2.在保证第一范式的基础上,每列必须和表的主键相关
3.在保证第二范式的基础上,每列必须和主键直接相关而不是间接相关
1、保证每列的原子性,是指每列的内容不可在拆分成两列,比如username&password这中字段名是可以再拆分的,原子是最小的单位,拆到原子的单位就不能再拆了。
2、在第一范式的基础上,确保每列都和主键相关(每个列都应该是跟这个表中的主体相关,比如说一个学生表中的所有列都应该是和学生相关的,不能往这个表中添加非学生相关的列)
3、在第二范式的基础上,确保每列都和主键直接相关(表中的每个列都和这个表中的主体直接相关而不是间接相关,例如学生表中的姓名、年龄、学院和这个学生表直接相关,但学院电话和这个表示间接相关),因此要将学院电话这个列从学生表中剥离出来,形成一个单独的表---学院表,将学院名称和学院电话存进去, 将学院表中的主键作为外键插入到学生表中,从而使学生表引用学院表中的主键。引用的表成为子表,被引用的表成为主表。
表的设计最低标准是不能低于第二范式,当适当的冗余可以为查询表中的数据带来极大的方便的时候允许违反第三范式。
将学生表中的学员电话和学员抽出来,进行拆表
好处:降低数据冗余程度
坏处:增加查询数据难度
- 拆表:
拆表
首先创建一个外键列
alter table student add collegeid int; -
添加外键约束
alter table student
add constraint FK_colid
foriegn key(collegeid)
references
college(id);
创建外键的时候,字表中的外建列的数据类型必须和主表中的主键数据类型一致,外键约束只能约束外键中的值必须是主表中主键的值,但是外键列的值可以为null,主表中的主键值也可以不都在子表的外键中。 -
删除外键约束
alter table student
drop foreign key FK_colid; -
外键:
外键数据类型和长度必须和主键中的数据类型一致
只要存在外键约束,先删除字表数据,在删除主表数据
只要主表的数据在字表中有引用,主表中的数据就不能被删除。
基本查询:
基本查询
select from student;
这种查询是现实所有的列
select id,name,age
from student;
这种也是显示Student表中所有的列,但是这种方式的查询效率是比较高的,使用*来查询表中的所有数据的效率是很低的,在Java中使用*来查询表中的数据,这种做法不能够显示要查询的具体内容,因此推荐使用全部列名的方式来查询表中所有的数据。
去重复记录:
去重复记录
显示商品表中不同的供应商
select distinct vend_name from products;
使用去重复的时候不能添加其他的列,当添加其他的列的时候是对这两个列进行去重复,往往得不到想要的结果。
分页:
select from tablename limit 0,5;
表示从0的位置开始向后数5条记录作为一页的内容。
查询下一页的内容是
select from tablename limit 5,5;
查询第三页的内容
select from tablename limit 10,5;
排序:
按升序和降序排列
select colname from tablename asc;
将查询到的colname内容按升序的内容排列
select colname from tablename desc;
将查询到的colname内容按降序的内容排列,默认排序的时候采用升序的顺序排列。
过滤查询:
使用where子句来过滤条件
select username from student where id = 1;
.....where username = 'tom';
.....where price > 2.5;
.....where id > 2 and id < 8;
.....where content is null;
.....where content is not null;
模糊查询:
_:下划线代表一个任意字符
%:百分号代表0个或一个或多个任意字符
使用模糊查询的时候要用关键字like来查询
example
select name
from student
where name like '_o%';
就代表查询以下划线开头、第二个字符为o开头的字符串。
在使用like查询的时候,由于like查询的效率是很低的,在尽一切可能的情况下为了提高查询的效率,将like查询放在过滤条件的最后面。一般情况下不要使用like查询。
提示:
1、不要过度使用LIKE通配符,如果其他操作符可以完成就使用其他操作符
2、通配符搜索使用的时间比其他搜索的时间长
3、如果确实需要使用通配符,除非绝对有必要,否则不要把通配符放到WHERE子句的开始处,把通配 符放到搜索模式的开始处,搜索起来是最慢的
别名:
sql语句可以执行简单的算术运算
select quanity,price,quanity price as 'total' from orders;
文本函数:
从这以后的函数都是mysql特有的,其他数据库系统是没有的,在这之前将到的SQL语句是所有平台都通用的,从这里开始就要将mysql的一些新特性。
选择字段名左边指定长度数字的字符串
select left(prod_name,2) from products;
查询指定字段prod_name左边两个字符的内容
选择字段名右边指定长度数字的字符串
select right(prod_name,3) from products;
查询指定字段prod_name右边的三个字符串的内容
查询指定字段字符串的长度
select length(prod_name) from products;
查询指定字段去掉左边空格后的内容
select ltrim(prod_name) from products;
查询指定字段去掉右边空格后的内容
select rtrim(prod_name) from products;
查询指定字段去掉两边空格后的内容
select trim(prod_num) from products;
将字段内容转换为大写
select upper(prod_name) from products;
将字段内容全部转换为小写
select lowwer(prod_name) from products;
连接字符串
select concat('I buy the ',prod_name) from products;
时间和日期函数有专门的一篇文章介绍
聚合函数:
max()
min()
avg()
count()
num()
聚合函数在所有的数据库系统中又是通用的,通常用于数据统计中.
聚合函数count()在统计某个字段中数量的时候会忽略null和空值。为了保证统计的准确性,使用*来统计表中有多少条记录,这样的话,当表中某个字段的值为null或空的话也会统计在内,提高数据的准确性。
select count( ) from student;
在使用聚合函数的时候不能跟其他的列,除非后面跟group by语句
分组统计:
group by
select vend_id from products group by vend_id;
having 过滤条件
having过滤和where过滤条件的区别
having用于分组后的过滤,where用于分组前的过滤。
在使用SQL语句的时候注意这些关键字当同时出现时的顺序
select
from
where
group by
having
order by
limit
子查询(嵌套在查询中的查询):
获取订购商品编号为TNT2的客户名
这个问题分三步解决
1首先获得商品编号为TNT2的订单编号
select order_num from order where prod_id = 'TNT2';
2.根据订单号获得下了该订单的客户编号
select cust_id from orderitems where order_num in(1005,1007);
3.根据客户ID获得俄该客户的姓名
select cust_name from customers where cust_id in (1001,1002);
讲上述三个语句从上往下,从里网内嵌套在一块就可以了
SELECT cust_name FROM customers WHERE cust_id
IN (SELECT cust_id FROM orders WHERE order_num
IN(SELECT order_num FROM orderitems WHERE prod_id = "TNT2")
);
难点:
获取每个客户的订单数量:
等值连接查询和内连接查询:
等值查询和内连接查询(查询学员及对应班级信息,班级没有学员或学员班级信息错误的不显示)
等值查询和内连接查询最后的内容是一样的。
等值查询:
select `name`,classname
from student,class
where student.classid = class.id;
内连接查询:
select `name`,classname
from student
inner join
class
on student.classid = class.id;
外链接查询:
外连接查询(查询所有学员及对应的班级信息)
左外连接查询:左外联接将会显示左表的所有记录,右表对应数据不存在的内容将值设置为null
select `name`,classname
from student
left outer
class
on student.classid = class.id;
右外连接查询:右外连接将会显示右表的所有记录,坐标对应数据不存在的内容设置为null
select `name`,classname
from student
right outer
class
on student.classid = class.id;
组合查询:
组合查询:(想要将两个表中两个字列的内容合并在一起使用组合查询)
select name from student
union
select classname from class;
组合查询默认会去掉重复的值
在使用的时候当Student表中的name字段和class表中的classname字段有内容相同时,将去掉内容相同的值,只保留其中一个值。
要想使用组合查询不去重复可以使用union all
select name from student
union all
select classname from class;
在使用组合查询的结果集中会默认添加createtime来表示最终的时间
union必须由两条或两条以上的select语句组成,语句之间使用union分割
• union的每个查询必须包含相同的列,表达式或聚合函数
• 列的数据类型必须兼容:类型不必完全相同,但是必须是相互可以转换的
• union查询会自动去除重复的行,如果不需要此特性,可以使用union all
• 对union结果进行排序,order by语句必须在最后一条select语句之后
在很多表中都会使用createtime这个字段来存储字段值添加修改的时间。这个字段的类型是timestamp(时间戳类型),会记录值创建和修改的时间。很多表中都会使用这个字段值用来存储字段修改时间。
mysql的数据引擎:
mysql数据库引擎
InnoDB:可靠的事务处理引擎,不支持全文搜索
MyISAM:是一个性能极高的引擎,支持全文搜索,但不支持事务处理
MEMORY:功能等同于MyISAM引擎,但由于数据存储在内存中,所以速度快
事务处理值当进行一连串数据库的增删改查操作的时候,这些结果要么全做,要么全不做,不能只做一个。当执行事务中的内容到一半的时候出现错误,则事务会回滚到原来的没有修改的状态。
在创建某张表的时候可以声明这张表的引擎
create table test(
............
)engine=InnoDB;
小结:
导表:
insert into tableA
(name1,.....)
values
(select name1,.... from tableB)
MysqlWorkbench
表与表只有三种对应关系
一对一 1:1
一对多 1:N
对多多 M:N
在构建系统的时候先分析连个表之间的关系,当两个表示一对多的关系的时候在多的那个表中建立一的那个表中的外键。
例如Student和class这两个表之间的关系
要在Student这个表中建立class这个表的外键。
当时多对多的关系的时候,就要产生一个中间表来维护这两张表之间的关系。
例如Student和teacher这两张表,这时候产生的中间表要分别有一个Student和teacher表的外键,这两个外键在一块组成这个表的主键,也就是联合主键。