在cmd命令中开启数据库
net start mysql;
关闭
net stop mysql;
查看所有数据库
show databases;
创建数据库
create database 数据库名称;
例:create database java1;
使用数据库:
use 数据库名称;
例:use school;
如何去存储数据:创建表
create table 表名(
字段1 类型 不允许空 主键 自动增长,
字段2 类型(长度) 不允许空,
字段3 类型(长度)
);
例:create table student(id int not null primary key auto_increment,
name varchar(20) not null,
age int(3)
);
不允许为空:not null
主键:primary key
自动增长(自增1):auto_increment
char:效率高
varchar:节省空间
查询表:
show tables;
查询表字段:
desc 表名;
例:desc book;
删除数据库:
drop database 数据库名称;
例:drop database school;
修改表名:
alter table 旧表名 rename 新表名;
例:alter table result rename result1;
添加字段:
alter table 表名 add 添加的字段名称 数据类型[属性];
例:alter table result add sss varchar(20);
修改表字段:
alter table 表名 change 旧字段 新字段 数据类型[属性];
例:alter table result change bbb bbb int(4) not null;
删除字段:
alter table 表名 drop 字段名;
唯一约束:unique key
例:create table s(name varchar(20) primary key auto_increment,
shengFenZheng int(18) unique key
);
默认值:default
例:create table s(name varchar(20) primary key auto_increment,
shengFenZheng int(18) unique key,
age int(4) default 18,
);
添加
通过语句存储数据
insert into 表名(字段1,字段2,字段3....) values(值1,值2,值3....);
例:insert into pol(name,age) values('stopnow',123);
查询语句:
*:表示所有
select 需要查询的数据 from 需要查询的表 where 条件;
添加外键
alter table 表名 add constraint 外键名 foreign key(外键字段) references 关联表名(关联字段);
例: alter table student add constraint fk_student_gradeid foreign key(gradeid) references grade(gradeid);
数据库增删改查:
增:
insert into 表名(字段1,字段2,字段3....) values(值1,值2,值3....);
例:insert inseleto pol(name,age) values('stopnow',123);
删:
delete from 表名 where 条件;
例:delete from student where name='空1';
改:update 表名 set 需要修改的字段=需要修改的值 where 条件;
例:update student set age=60 where name='萝莉';
查:select * from 表名;
例:select * from student;
查询性别和年龄,在stu dent表中,并且年龄要大于18岁
select sex,age from student where age>18;
as:表示别名
函数:
平均数:avg()
例子:select avg(age) as '平均值' from student;
最大值:max()
例子:select max(age) as '最大年龄' from student;
最小值:min()
例子:select min(age) as '最小年龄' from student;
数量:count()
例子:select count(age) as '数量' from student;
和:sum()
例子:select sum(age) as '总和' from student;
concat():字符串的拼接(和Java中的+类似)
now():当前日期和时间
year(date):当前年份
排序:
select * from student order by 根据从小到大排序 [desc]
desc:从大到小
asc:从小到大
例:select * from student order by age;
分页查询:
limit:从哪条开始查询(下标),每一页有多少个数据
例:select * from student limit 5,5;
/`````````````````````````````````````````
子查询
1.查询年龄比‘空少’大的人信息
(1)查询空少的年龄
select age from student where name='空少';
(2)查询比空少年龄大的人的信息
select * from student where age>(select age from student where name='空少');
or:表示或者的意思
=:只能匹配一个参数,如果有多个参数使用*in*
select name,age from student where gradeid in(select gradeid from student where name='萝莉'or name='御姐');
/·······················································/
模糊查询:like
select * from student where name like '御%';
%:开头为糖的
and:拼接
连接查询(多个表一起查询)
关键字:inner join
查询学生姓名和学生成绩
分析:查什么东西:
学生姓名 student.name
学生成绩 result.number
那张表:学生表和成绩表
student result
条件:找里面有关联的(大多数情况字段名会相等)
student.id = result.studentid;
例子:select student,result.number from student inner join result on student.id=result.studentid;
例子:select subject.subjectname,result.number from subject inner join result on subject.subjectid=result.subjctid;
/*
关联联查
*/
SELECT
tt.content_name,
tc.pj_title
from
tb_content tc
LEFT JOIN tb_type tt ON tc.content_type = tt.content_type AND tc.is_deleted=0
WHERE
tc.is_deleted=0
/*
关联联查
*/
-- select后面是要查的东西
SELECT
tt.content_name,
tc.pj_title
from
-- 主表
tb_content tc
-- 关联关键词
LEFT JOIN
-- 副表
tb_type tt
-- on后面跟关联条件
ON tc.content_type = tt.content_type
-- and后面是子表(从表)条件
AND tc.is_deleted=0
-- where后面是主表条件
WHERE
tc.is_deleted=0
三张表查询:三张表会有两个条件 条件使用and连接
例子:select students.name,subject.subjectName,result.number from students,subject,result where subject.subjectid=result.subjctid and students.id=result.subjctid;
外连接:
左外链接:left join
例子:select students.name,result.number from students left join result on students.id=result.studentid;
左链接三表连接:
例子:select students.name,grade.gradeidName,result.number from students left join grade on grade.gradeid=students.gradeid left join result on students.id=result.studentid;
右外连接:right join
(左外连接和右外连接区别不大)
左外连接以左边的表为主表
右外连接以右边的表为主表
主表:优先从主表中取匹配数据(主表的东西一定会被查询到,再去匹配从表中相对应的数据)
左外连接语法结构
select student.name,result.number from student left join result where student.id=result.studentid;
和内连接的区别:
内连接不分主从表,所有的数据一定要满足where条件才查询的出来
外连接有主从表,所有的数据以主表为主,先查主表里的,再去匹配从表中的数据,如果匹配不上,用null填充
分组查询
select subjctid,avg(number) from result group by subjctid;
翻译:查询subjctid和每个科目的平均分, 来自result表,根据subjctid来分组
分组查询一定要放到where语句后边.
分组查询例子:
1.连表查询加分组查询(把sex_name写成男女):
select sex.sex_name,count(sex) from student,sex where student.sex=sex.id group by sex;
+----------+------------+
| sex_name | count(sex) |
+----------+------------+
| 男 | 4 |
| 女 | 2 |
+----------+------------+
2.分别查询每个年级的性别和个数:
select gradeid,sex_name,count(sex) from student,sex where sex.id=student.sex group by gradeid,sex;
+---------+----------+------------+
| gradeid | sex_name | count(sex) |
+---------+----------+------------+
| 1 | 男 | 2 |
| 1 | 女 | 1 |
| 2 | 男 | 2 |
| 2 | 女 | 1 |
+---------+----------+------------+
3.分别查询每个年级的性别和个数(把gradename改为大一大二)
select gradename,sex_name,count(sex) from student,sex,grade where grade.id=student.gradeid and student.sex=sex.id group by gradeid,sex;
+-----------+----------+------------+
| gradename | sex_name | count(sex) |
+-----------+----------+------------+
| 大一 | 男 | 2 |
| 大一 | 女 | 1 |
| 大二 | 男 | 2 |
| 大二 | 女 | 1 |
+-----------+----------+------------+
having:作为分组之后的条件,等同于where
例子:查询大于75的年龄和id
having:是和group by 一起使用的(和where条件是一样的,它可以在分组的后面使用)
select subjctid,avg(number) from result group by subjctid having avg(number)>75;
+----------+-------------+=
| subjctid | avg(number) |
+----------+-------------+
| 1 | 80.0000 |
| 2 | 80.0000 |
+----------+-------------+
exists子查询:
exists()作为条件 exists括号中写的是查询语句,如果查询语句查的到东西,外层语句执行,如果查不到东西,则不执行;
(自总结)例子:
解析:查询如果分数有大于90的,就查出来,如果没有就不显示
select * from result where exists(select * from result where number>90) and number>90;
+----+-----------+----------+--------+
| id | studentid | subjctid | number |
+----+-----------+----------+--------+
| 4 | 1 | 2 | 97 |
| 7 | 1 | 3 | 94 |
+----+-----------+----------+--------+
not exists子查询:和上面相反
查看分数,如果分数都小于95分,则判定考试太难,让所有的分数都加5分
select number+5 as '修改后的分数' from result where not exists(select number from result where number>100);
+--------------+
| 修改后的分数 |
+--------------+
| 95 |
| 85 |
| 75 |
| 102 |
| 71 |
| 82 |
| 99 |
| 49 |
| 85 |
+--------------+
事物,视图,索引
因为mysql有自动提交功能,每一次执行的语句都会永久保存
事务:
第一步:关闭mysql的自动提交功能
set autocommit=0; (0是关闭,1是开启,默认关闭)
第二步:写上需要执行的语句
把小白的钱减两块
update student set price=price-2 where name='小白';
把小蓝的钱加两块
update student set price=price+2 where name='小蓝';
事物开启之后,这两条语句,要么都执行,要么都不执行
第三步:rollback(回滚/撤销) commit(提交/保存)
第四步:不使用事务的时候把自动提交打开
set autocommit=1;
视图:
创建视图:
create view 视图名称 as 查询语句;
create view student_name as select student1.name,result1.subjectid,result1.number from student1,result1 where student1.id = result1.studentid;
视图的意义:每当有需要多次使用的数据,一般使用视图储存起来,在之后方便调用
使用视图:
select 字段名1,字段名2,... from 视图名;
和查询表语法一样,可以把视图看做一张虚拟的表
删除视图:
drop view 视图名称;
索引:帮助查询数据的方式,提高速度和效率(相当于字典的目录)
--使用原则:经常查询的列;排序和分组的列;建立关系的列(主/外键关系)
--不适用:字段的数据内容种类不多(比如:男/女);数据量不多
--索引不是越多越好,一般表中有2~3个即可(根据情况而定);
--索引一旦创建,数据不宜频繁修改(增删改),如果总是修改的话,索引需要重新建立
--这样的话,反而影响索引的效果
--唯一,全文,空间
--create [UNIQUE|FULL|SPATIAL] INDEX 索引名字
-- ON 表名(字段);
--DROP INDEX 索引名字
--SHOW INDEX from 表名
设计数据库
1.要建立学生管理系统
要求有如下数据
学生学号,学生姓名,学生年龄,学生班级,学生科目,学生成绩,学生性别;
使用三大范式: student id,name,age,gradeid,sexid
sex sexid,sex
result studentid,subjectid,number
grade gradeid,gradename
subject subjectid ,subjectname
### 补充
1、不能用*号 *会影响查询速度
2、where后面数字类型放在前面 日期 字符串
3、能用两表联查多链表联查的 不用嵌套查询 O
```mysql
#sql("title")
select tc.pj_title,tt.type_name from tb_content tc left join tb_type tt on tc.pj_type = tt.pj_type
#end
-- #sql开始
-- #end结束
-- 去all_sqls.sql配置
```