数据库中的表的记录的CRUD
想数据表中添加数据
insert into 表名(列名1,列名2,....) values (要添加的值1,值2,值3) 除了数字之外 其他类型必须加''
注意:列名和表名的问题
对应(值与前面的列名都要对应 且数据类型也要对应;
添加数据格式:
不考虑主键:会出现断号的情况
insert into 表名 (列名) values (值)
添加数据格式:
所有值全给出
insert into 表名 values (全列值)
insert into 表名 (列名1,..2,...3) values (值1,..2,..3),(值1,..2,..3),(值1,..2,..3)
注意事项:
列名的个数与值的个数对应,
类型也要对应
列的类型如果是日期或者字符串的时候,要使用单引号
插入的最大长度不能超过本列的最大长度
出现中文错误的原因,windos系统,mysql客户端(Client),mysql服务端编码不一致(server)
bgk 默认 utf-8 默认 utf-8
插入中文的解决方法:
一次性修改 修改DOS命令的编码 输入命令 set names 'gbk'
永久性修改 Mysql的配置文件(my.ini) default-character-set=gbk;修改完成后重新下mysql服务,services.msc
show variables like '%character%'
会显示出所有的跟字符集相关的数据
修改记录
update 表明 set 列1=值1,列2=值2 where 条件 如果不加条件所有的数据都会被修改
注意事项:
修改的列名与值的类型要对应,长度要符合要求,日期或者字符串要用''
修改条件的写法:
between and
in
like '_'一个下划线代表1一个字符(一个汉字)
SELECT * FROM students WHERE 班级 LIKE '%基础班%'
is null
is not null
id=6;
id<>6;不等于
id<=6;
id in(1,2,3,4) 满足 1234都执行
与或非:
与and
或 or
非 not
删除记录
delete from 表名 where 条件语句
不加条件会删除所有
delete form 表名 :一条一条的删 但是不清空auto_inrement 事务的管理只能在DML语句上,如果在一个事物中使用delete删除所有记录,可以找回
truncate 表名: 直接删除表然后重新建表 auto_increment被置为0,属于DDL,删完了找不回来
start transaction
delete from 表名
rollback;之后可以继续查询到已经删除的数据,但是truncate不行
查询记录 :
select 列名1,列名2... from 表名 where 列明='';
select distinct 列名 from 表名;对列名进行去重
select distinct 列名1,列名2 from 表名;对列名1,2整体进行去重
查询重命名列
select zname AS '' 查询出来的数据重新建一个列名
查询过程中直接对数字进行计算
SELECT zname,zmoney+1000 FROM 表名
聚合
可以对一列进行计算,返回单一的值
count
select count (*) from 表名
select sum(money) from 表名
select sum(列名+列名) 横着加 单行统计(如果有null 那么这一行都是null)完后再统计所有列
select sum(列名),sum(列名) 竖着加 单列(如果有null会自动处理为0)统计完后再统计所有行
如果表中有值为空,上面两种结果会不同
解决办法:
select sum(ifnull(列名,0)+列名) from 表名 ; 横着加的时候null加上任何值都为null
ifnull(列名,0) 如果列中有null就视为0
select max() 最大值
select min() 最小值
select avg() 平均数
select truncate(avg(列名),2) from 表名 计算平均值后保留2位
这些方法的后面不能有空格
分组
SELECT COUNT(*),department FROM student GROUP BY department;
查询后 在count 列的后面有一个department列
分组之后再次筛选 用having 关键字
where 与 having 区别
where 是分组之前过滤 having 是分组之后过滤
排序:
SELECT 列名1,列名2 FROM 表名 order BY 列名1,列名2 desc; 2种排序
排序语句一定是在sql语句的末尾
asc 升序 desc降序
查询语句的语序
select 列名,sum(列名) from 表名 where 条件语句 group by 列名having 条件语句 order by 排序 limit start,length;
Start 开始值,默认值是0
length 数据长度(多少条数据)
表与表之间的关系:
数据库的多表设计
一对多建表原则:
在多的(乙方)创建一个字段最为 外键指向甲方的主键
外键可以重复可以为空,如果他有值必须是一的一方的主键
添加一的一方再添加多的一方
删除的时候先删除多的一方,再删除一的一方
多对多的建表原则:
创建第三张表(中间表),中间表中至少需要2个字段分别作为外键 指向多对多双方各自的主键
一对一建表原则:
外键对应,在一对多的基础上 加一个 唯一约束
主键对应,在主键建立映射
实体与实体之间的关系
1.一对多
客户与订单
部门和员工
2.多对多
学生和课程
3.一对一
公司和地址
多表的约束:外键约束.
给orders中的cid添加外键约束
方式一:
建表的时候加
FOREIGN KEY (cid) REFERENCES customer (cid)
方式二:
alter table 表名1 add foreign key (cid) references 表名2 (cid)
有了外键约束后无法直接删除 表2 的数据
需要先删除表1的数据 再删除表2的数据
多表的查询方式
方式一:
连接查询:
内连接:inner join inner可以省略
显示内连接:
select * from a inner join b on 条件;
隐式内连接:
select * from a,b where 条件;
查询到的是两张表中符合条件的数据
注意隐式的条件是where 显式的是on
外连接:outer join, outer可以省略
左外连接:left outer join
select * from a left outer join b on 条件;
以左边表为基准机型查询
如果左边表有的 右边没有 就会自动添加 null
如果右边有多余的 左边没有,就不会被显示出
右外连接:right outer join
select * from a right outer join b on 条件;
以右边表为基准机型查询
如果右边表有的 左边没有 就会自动添加 null
如果左边有多余的 右边没有,就不会被显示出
交叉连接:基本不用
select * from a,b
select * from a cross join b
子查询:
一个sql语句再查询过程中依赖另外一个语句
select * from customer c,order o where c.cid=o.cid And c.cid in(select cid from orders where addr like '海淀%' )
SELECT c.cname,COUNT(*) FROM customer c,orders o WHERE c.cid=o.cid GROUP BY c.cname;
select case sex when 0 then '男' when 1 then '女' else '人妖' end as sex from user;
case:如果这一列是sex就判断值是 0 还是 1 0就是男 1 就是女
数据合并(公司收购的时候整合数据库,会拿一个不重复的字符串(UUID varchar类型)作为主键)
Select length(name) from exam;查询name列中所有的姓名的长度 一个中文占用3个字符
Select ASCII('a');查询a的asc码
Select Concat('aa','cc');拼接
select Reverse("xxoo") 交换
select truncate(3.14,0)直接取整
select Round(3.14)四舍五入
select Least(33,22,11)最小值
select Greatest(33,44,55);
select now(); 当前时间
select sysDAte();系统时间
|
|