今天主要学习的内容是数据库的相关操作,知识很零散,命令很多,大家多练习,希望都记下来。
知识梳理
数据表的相关操作:
字段名 f_xx
字段类型 ty_xx
使用数据库;
use db_xxxx;
查看当前数据库中的所有数据库;
show tables;
创建数据表;
create table t_xxx(字段名 字段类型,f_xx ty_xx, ......);
查看数据表创建信息;
show create table t_xxx;
查看表的结构:
desc t_xxx;
改-为表添加新字段:
alter table t_xx add new_f_xx ty_xx;
改 - 修改字段类型:
alter table t_xx modify f_xx new_ty_xx;
改 - 修改字段名:
alter table t_xx change old_f_xx new_f_xx ty_xx;
删除字段:
alter table t_xx drop f_xx;
删除表:
drop table t_xx;
数据操作:
插入单条数据1
insert into t_stu value(1,'tom',12,'boy',180);
插入单条数据2
insert into t_stu values(2,'jack',13,'boy',190);
插入指定字段数据
insert into t_stu (name,gender) value('rose','girl');
插入多条数据
insert into t_stu (name,age,gender) value('tony',18,'boy'),('alice',20,2),('alex',13,1);
insert into t_stu (name,age,gender) values('tony',18,'boy'),('alice',20,2),('alex',13,1);
更新
update t_stu set height = 123.6789;
update t_stu set age = 25 where name = 'rose';
删除数据
语法1:truncate 表名
语法2:delete from 表名 [条件]
导入导出数据库:
< 输入重定向 > 输出重定向
导出整个数据库
- 语法:mysqldump –uroot –p(注意不要输入密码) 要导出的数据库名 要导出的数据表 ... > 目标文件.sql
mysqldump -uroot -p School > school_bak.sql
导入整个数据库
- 语法:mysql -uroot -p 数据库名 < 要导入的文件.sql
mysql -uroot -p sch < school_bak.sql
注意点:
- 在导入数据库的时候,要注意数据库文件xx.sql存放位置,放到家目录用户目录下面。然后导入的时候是退出数据库在外面直接进行操作的。
- 导入数据库的时候先创建一个空数据库。
约束:
约束就是一种限制和条件,为了让数据准确。
数据完整性:
域完整性:取值范围
实体完整性:记录
参考完整性:引用完整性,多个表,一个表参考另一个表去看。
数据常见问题:
- 数据冗余
- 失去数据完整性
- 数据缺少唯一标示
- 失去实体完整性
- 失去域完整性
- 失去引用完整性
数据库常用约束:
- 主键约束
- 唯一性,非空性,主键在一张表中只能有一个
- create table tpk(id int(5) primary key,name char(10));
- 数据库在屏幕上都是以表格的形式显示,但是实际上就不一定了
- insert into tpk values(1,'tom');
- id的值不允许重复,也不允许为空,必须传入数据
- 自动增长作用
- 只能用来修饰整型字段,一般和主键配合使用。编号增长时,从1开始,如果插入数据为0时,那么就会进行自动增长。
- auto_increment
- show create table tai; 查看表信息,里面的auto_increment记录了自动增长的下一个值,如果是0,那么就按这个值进行填充
- 自动增长相当于缺省参数,你给了id就按你给的id显示,如果不给,就自动增长。
- 本来是1,2自动增站的,如果你给了10,那么auto_increment记录的就是11。从11开始往后增长,前面的3,4这些还可以手动插入。自动增长的时候,按最大的索引来记录下一个值。
- delete不能删除 alter可以删除。
- 唯一性约束
- unique
- 保证该字段中的数据唯一
- create table tui(id int primary key,name char(10) unique);
- 主键显示PRI,唯一性显示UNI
- 非空约束
- not null
- 修饰后,字段不允许有空值 NULL
- create table tnn (id int primary key ,name char(10) not null);
- 默认值约束
- default
- 如果在给字段插入数据时,如果没有给定数据,那么就是用默认值,如果给了那就用给定的数据
- create table tdf (id int, name char(10) default 'No Name');
- 外键约束
- foreign key(字段名) references 表名
- 也叫引用约束,参考约束
- 需要有多张表来进行参考
- create table tclass (id int primary key,name char(10));
- 参照关联的表
- create table student(id int primary key, name char(10), class_id int, foreign key(class_id) references tclass(id));
- 在数据删除时,被引用的数据表中的数据,不能随意删除。
- 先删除引用的,才能删除被引用的。
- 解决引用完整性的问题
单表操作:
导入数据库的两种方式;
一:
1.将数据库.sql文件放到一个目录下,然后cd切换到该目录下,然后连接数据库MySQL,
2.创建一个新的数据库
3.use 创建的新数据库
4.source 文件路径/数据库名
二:
看前面
查询基本操作:
as加别名:可以写as,也可以直接不写,加一个空格:
select c_id as 编号, c_name as 姓名, c_gender 性别, c_address 地址 from t_student;
消除重复数据 distinct了解一下,不怎么用
单字段:
select distinct c_address 地区分布 from t_student;
多字段:
select distinct c_gender,c_address from t_student;
两个算一个整体,然后如果两个都一样才算重复的,才删除。
指定查询条件和关系运算符
select c_id,c_name,c_gender,c_address from t_student where c_id = 5;
先执行from,再执行where,最后是select
select c_id from t_student where c_id != 8;
关系运算符放的位置注意一下
逻辑运算符
select c_id ,c_gender,c_name from t_student where c_id <10 and c_gender = '女';
select c_id ,c_gender,c_name from t_student where c_id <10 or c_gender = '女';
select c_id ,c_gender,c_name from t_student where not (c_id <10 or c_gender = '女');
select c_id ,c_gender,c_name from t_student where not c_id <10 or c_gender = '女';
模糊查询:
like
%表示任意多个字符
_表示任意一个字符
select c_id,c_name,c_gender from t_student where c_name like '孙%';
select c_id,c_name,c_gender from t_student where c_name like '%小%';
select c_id,c_name,c_gender from t_student where c_name like '孙__';
select c_name,c_phone from t_student where c_gender = 2 and c_phone like '138%';
select c_name,c_phone from t_student where c_gender = 2;
范围查询
非连续范围 in
select c_name ,c_id from t_student where c_id in (1,3,5,7,9);
可以是数字,可以是汉字的字符串
SQL注入:
select c_name ,c_id from t_student where c_id = 1 or c_id = 3 or c_id =5 or 7 or 9;
它的意思是将7和9认为是真,就是将所有的东西都拖出来,叫做“拖库”
连续范围
select c_id, c_name,c_age from t_student where c_age between 18 and 20;
是一个闭区间
between只能在数字上使用。
空判断(很重要)
下面这些都不可以:
mysql> select * from t_student where c_age = 0; Empty set (0.00 sec) mysql> select * from t_student where c_age = ''; Empty set (0.00 sec) mysql> select * from t_student where c_age = NULL; Empty set (0.00 sec) mysql> select * from t_student where c_age = 'NULL'; Empty set, 1 warning (0.00 sec) select * from t_student where not c_age is null;与下面的is not null相比较效率低
下面的很重要
select * from t_student where c_age is null; select * from t_student where c_age is not null;
查询结果排序
null比零还小
select * from t_student order by c_age;
排序是一个在查询数据时非常重要的操作。比如买东西时,想按一定的条件进行有序显示。就需要使用排序
asc(默认) 升序 / desc 降序 语法:select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...]
- 单字段排序
select * from t_student orderby c_age;
select * from t_student orderby c_age asc;
- 默认使用就是升序排序,可以不指定 asc ,效果相同。
- 多字段排序 可以对多个字段进行排序,只需将字段的排序方式依次写在 order by 后面即可,字段间使用逗号分隔
select * from t_student orderby c_age desc,c_id asc;
多个字段间用逗号隔开,每个后面都要跟着asc或者desc,
先按第一个排序,没有结果再看第二个,依次往下。
查询所有性别为女的数据按年龄升序排序
select * from t_student where c_gender = 2 order by c_age asc;
先筛选再排序
分页查询
select 字段名 from 表名 limit start=0,count =*; • 从start开始,获取count条数据 • start默认值为0 • 需要获取数据的前n条的时候可以直接写 limit n start是起始索引,从0开始,可以省略(只有从0开始时) count是显示条数,一次查询时,条数不可变。 计算当前页的起始索引(current_page - 1)*count 查询性别为女的年龄最小的三个人 select * from t_student where c_gender = 2 order by c_age asc limit 3;分页放在最后。
聚合函数
sum() avg() count() 用* ,其他的指定字段 min() max() select sum(c_age),avg(c_age),max(c_age),min(c_age),count(c_age) from t_student; 这里面不包括NULL的数据 select sum(c_age),avg(c_age),max(c_age),min(c_age),count(*) from t_student; *代表所有的数据
分组
select c_gender,c_address from t_student group by c_gender,c_address; select c_gender from t_student group by c_gender; 分组的时候,后面的group跟着的字段名是啥,前面select就是啥 分组可以跟着聚合函数来使用 查看分组内的数据 group_concat(要查看的字段) select c_gender,c_address,group_concat(c_age) from t_student group by c_gender,c_address; select c_gender,c_address,group_concat(c_age) from t_student where c_gender = 2 group by c_gender,c_address; select c_gender,c_address,group_concat(c_age) from t_student group by c_gender,c_address having c_gender = 2;找到全是女的
先where筛选,在分组,然后对分组之后的数据进行操作
where读取数据源,在from后用
having在分组中用