创建库
create database s19 character set utf8(创建数据库时指定字符编码否则中文会乱码);
create database 数据库名
创建表
create table 表名(
id int primary key auto_increment,
name varchar(20),
)
=======================================================================================================================================
表结构操作
增加:alter table 表名 add 字段名 字段类型 NOT NULL/first/(after列名);
删:drop table 表名
改:alter table 表名 modify 列名 字段类型 /first/(after列名);
查:
查看表结构:desc 表名
查看当前数据库下有哪些表show tables
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
完整性约束:
primary key(非空且唯一 ):哪个字段设置为auto_increment 那么该键就必须设置为primary key(主键)
-- 方式1
CREATE TABLE t1(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
-- 方式2
CREATE TABLE t2(
id INT NOT NULL,
name VARCHAR(20)
);
注意:
1、一张表中最多只能有一个主键
2、表中如果没有设置主键,默认设置NOT NULL的字段为主键;此外,表中如果有多个NOT NULL的字段,则按顺序将第一个设置NOT NULL的字段设为主键。
结论:主键一定是非空且唯一,但非空且唯一的字段不一定是主键。
3、主键类型不一定必须是整型
-------------------------------------------------------------------------------------------------------------------------------
复合主键
所谓的复合主键 就是指你表的主键含有一个以上的字段。
如果一列不能唯一区分一个表里的记录时,可以考虑多个列组合起来达到区分表记录的唯一性,形式
①创建时:
create table sc (
studentid int,
courseid int,
score int,
primary key (studentno,courseid)
);
②修改时:
alter table tb_name add primary key (字段1,字段2,字段3);
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
unique(唯一):create table t1 (name varchar(20) unique);
实例:CREATE TABLE t5(
id INT AUTO_INCREMENT,
name VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY UK_t5_name (name)
);
建表之后添加unique(唯一性约束)
alter table t5 add constraint UK_t5_name unique (name);
删除
ALTER TABLE t5 DROP INDEX UK_t5_name;
表与表之间的关系:
一对多
将关联字段设置在多的那张表中
1、书表 2、出版社表 一个出版社可以出版多本书,根据一对多外键设置在多的那张表里 即书表里有个出版社ID字段。
多对多
创建第三张关系表:例如 1学生表、2老师表 老师有多个学生,一个学生有多个老师
1、创建学生表
2、创建老师表
3、创建两者之间的关联关系的表。
一对一
==================================================================================================================================================================
表记录操作
增insert insert 表名 (字段名) values(值);
删delete delete from 表 where name='字段名';(删大数据用truncate+表名)
改update update 表名 set salary =300 where name='whq';
查select(重点)
语法顺序(不可跌倒):select 列名 form 表名 + where字句 + group by + having + order by + limit
执行顺序:from---> where----> select ---> group by -----> having --->order by
命令行:
单表: select 列名 form 表名
where 条件+
1、where +关系运算符
2、where +逻辑运算符
3、where +子关键字
3.1、where+ between ...and...(范围)
3.2、where + is null
3.3、where + in
3.4、where +not in:select name from emp where name like 'zhang%';
3.5、where +like + %/_ :
3.5.1、where +like + %
3.5.2、where +like + %%
3.5.3、where +like + _
3.5.4、where +like + and
3.5.5、where +like + or
3.5.6、where +like + not %/_
group by列名(出现:"每一个XX的统计"字样) select +count/max/min/avg(所要统计的字段名) +from 表名 group by +所要分组的条件字段
分析:每一个部门的薪水平均值
1.1、出现'每一个' 的字样说明用分组
1.2、'薪水'说明是分组的列字段(selec后)
1.3、说明用的是哪个聚合函数(count/max/min/avg)
1.4、每个部门的平均薪水,查询三个东西:1、每个部门 2、平均、3、薪水
1.5、如果想用第四个及以上的东西就要用having
实例1:select * from emp group by dep(部门)
实例2:select avg(salary) from emp group by dep ;统计每个部门的平均薪水
2、group by作为输入:查询结果作为后一个查询语句的条件:
2.1、查询每个部门最大年龄员工的姓名
select max(age) from emp group by dep查询的结果给select name from emp where age in
实例1:select name from emp where age in ( select max(age) from emp group by dep);
3、group by 与group_concat连用查询分组后 组内的的信息
3.1、查询每个组的员工姓名:(查询每个组的哪些年龄、姓名等:定义是:分组显示每个组内的信息)
实例1:select dep,group_concat(name) from emp group by dep;
having 筛选
分组之后进行过滤
Oder by 列名 +DESC/ASC
1、DESC:该列名从大往小降序
2、ASC:默认 从小往大的升序
LIMIT 限制条数
1、select * from emp limit 3 :取三条从第一条开始取
2、select * from emp limit 2,5:从第2条开始取,取5条
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
命令行:
多表查询:(暂略)