MYSQL 数据库笔记

在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配置
```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值