数据库
一个文件,存放数据的文件
命令
linux下安装mysql:
$:sudo apt-get install mysql-server (注意:安装数据库时一定要设置数据库密码)
.运行退出数据库:
$:mysql -uroot -p (登录数据库)
mysql> quit 或 exit 退出数据库
.删除数据库:
$:sudo apt-get autoremove mysql* –purge
$:sudo apt-get remove apparmor
$:sudo rm /var/lib/mysql/ -R
$:sudo rm /etc/mysql/ -R
.查看数据库
mysql> show databases;
.
.使用数据库
mysql> use mysql;(mysql为数据库中已存在的文件)
.
.显示数据库表
mysql> show tables;
.
.创建数据库
mysql> create database 数据库名
.
.创建数据库表(use 数据库名后的操作)(unique表示不能重复)(default表示默认值)
mysql> create table school(id int unique not null,
name varchar(32) unique not null,
address varchar(32) default “china”)
default charset ‘utf8’;
.删除数据库表
mysql> drop table school;
.插入数据
insert school(id,name,address) value(1001,”黄山学院”,”黄山”);
.
插入多条数据
insert school(id,name,address) values(1002,”北京大学”,”北京”),(1003,”清华大学”,”北京”);
.查看数据库表插入的内容
mysql> select * from school
.
插入数据时需要设定一个id为主键,否则容易报错因为主键值不能改变不能重复
报错信息:Duplicate entry ‘20’ for key ‘age’
mysql> show create table school \G;(查看创建表的条件)
.
.修改表结构:
增加一个字段
mysql>alter table school add level varchar(32) default “一本大学”;
修改一个字段
mysql>alter table school modify build date;(将build字段修改为date字段)
删除一个字段
mysql>alter table school drop build;
.
.修改数据库表名
mysql> rename table school to newschool;
显示数据库表内前三行内容
mysql> select * from newschool limit 3;
.
.更新数据库表内容
更改student 表中id为2013和2014的学生信息
mysql> update student set depart=”体育系” where id=2013 or id=2014;
.
.条件查询(嵌套查询,一个查询条件结果作为另一个查询语句的条件)
找出与小明同一个系的学生(包括小明)
mysql> select * from student where depart = (select depart from student where name = “小明”)
找出与小明同一个系的学生(不包括小明)
mysql> select * from student where depart = (select depart from student where name = “小明”) and name != ‘小明’
找出与小明年龄性别都一样的学生
mysql> select * from student where age = (select age from student where name =’小明’) and sex = (select sex from student where name = ‘小明’) and name != ‘小明’;
按年龄从小到大排序
mysql> select * from student order by age asc;
按年龄从大到小排序
mysql> select * from student order by age desc;
显示人数
mysql> select count(*) from student;
查询计算机系有多少人
mysql> select depart,count(*) from student where depart = ‘计算机系’;
查询年龄最大是多少
mysql> select max(age) from student;
查询年龄最大的人
mysql> select * from student where age = (select max(age) from student);
查询年龄最大和最小的人
mysql> select * from student where age = (select min(age) from student) || age = (select max(age) from student);
mysql> select * from student where age in ((select min(age) from student),(select max(age) from student));
查询平均年龄为多少
mysql> select avg(age) from student;
查询小于平均年龄的人有多少个
mysql> select count(*) from student where age < (select avg(age) from student);
计算总年龄大小
mysql> select sum(age) from student;
分组查询
mysql> select depart,count(*) from student group by depart;
查询每个系的平均年龄
mysql> select depart,avg(age) from student group by depart;
统计每个年龄有多少人
mysql> select age,count(*) from student group by age;
分组查询后的条件判断
将同一系的学生分类在一起
.
.
.查询音乐系的年龄并当年龄相同时去除重复
.
.
.
查询计算机系年龄大于音乐系最大年龄的人
或者
.
.
.
查询计算机系中大于音乐系中年龄的任意一个的人
等同于or的使用
方块改成some同样
主键与外键的使用
外键关联两个数据库表
分组查询
.
.
.
查询student表中id不在score中的人
创建两个数据库表,(小案例)
创建teacher数据库表
创建course数据库表
向teacher数据库表插入数据
向course数据库表插入数据
查询数据库表course的tecId,并使用distinct去重
查询没有课程号的老师
查询老师id与课程tecId相匹配的情况
查询只满足join on 关键字后面的条件的情况
查询右边数据库表只满足join on 关键字后面的条件的情况(左边不需要满足条件)
查询左边数据库表只满足join on 关键字后面的条件的情况(右边不需要满足条件)
向score数据库表中插入数据
查询没有成绩的课程
关联三个表查询学生课程分数信息
分组查询student数据库表中学生的总分
降序排序学生总成绩
关联student,score,course,teacher四个数据库表查询学生课程老师分数信息
like条件查询
字符串部分查询
关于’%%’中的下划线_匹配规则,匹配到字符串结束方可匹配成功
空和null的区别,空表示有这个实体没数据,null表示没有这个实体
更新表内容语句
删除表内容语句
组合查询,将各个值都查询出来然后组合起来
组合查询,union all 不会去重(去重 不写 all即可)
视图
存储过程
事先写好的语句
delimiter // 设置新的语句结尾,此时语句结束要以//结尾
创建存储过程 create procedure …()
->begin 存储过程的开始
->end 存储过程的结束
调用存储过程
展示存储过程的创建
删除存储过程
创建一个存储过程 ,将数据传进去
mysql> create procedure stuInfo(in id int)
-> begin
-> select s.id,s.name,c.name,m.mark from student as s,
-> score as m,course as c where s.id=m.stuId and m.courseId = c.id and s.id = id;
-> end
-> //
mysql> call stuInfo(2001) //
定义变量 必须加上@符号,表示全局变量
关于存储过程的传参与返回值
创建一个存储过程实现个人所得税的计算
mysql> create procedure protax(in base float)
-> begin
-> select id,name,salary,(salary-base)*0.04 as tax from teacher where salary > base;
-> end
-> //
mysql> call protax(20000)
->//
+------+--------+--------+------+
| id | name | salary | tax |
+------+--------+--------+------+
| 3001 | 孔子 | 90000 | 2800 |
| 3004 | 季 | 80000 | 2400 |
+------+--------+--------+------+
2 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
存储过程内的条件判断
游标
用于遍历结果集
游标cur指向 select name,age from student;
打开游标 open cur
repeat 开始遍历
end repeat; 结束遍历
触发器
当student数据库表插入数据时打印返回值
关于表teacher 触发器小案例
mysql>create trigger addc
->after insert on course
->for each row
->update teacher set salary=salary+1000
->where id=new.tecId;
->//
Query OK, 0 rows affected (0.01 sec)
mysql> insert course(name,tecId) value('编译原理',3003) //
+------+-----------+--------+
| id | name | salary |
+------+-----------+--------+
| 3001 | 孔子 | 90000 |
| 3002 | 孟子 | 8000 |
| 3003 | 谭浩强 | 5000 |
| 3004 | 季 | 80000 |
| 3005 | 张纪忠 | 3000 |
+------+-----------+--------+
5 rows in set (0.00 sec)
+------+-----------+--------+
| id | name | salary |
+------+-----------+--------+
| 3001 | 孔子 | 90000 |
| 3002 | 孟子 | 8000 |
| 3003 | 谭浩强 | 6000 |
| 3004 | 季 | 80000 |
| 3005 | 张纪忠 | 3000 |
+------+-----------+--------+
5 rows in set (0.00 sec)
#
将自动提交设置为False 方便修改数据后回滚roll 恢复数据
mysql> rollback; 回滚恢复数据
mysql> commit; 提交数据后不能恢复
mysql> delimiter //
mysql> create procedure sendMoney()
-> begin
-> declare A int;
-> set A = 90000;
-> declare B int;
-> set B = 1000;
-> set A=A-1000;
-> declare send int;
-> set send = 1000;
-> set send = -1000
-> ;
-> if send < 0 then
-> rollback
-> else then
-> set B = B + send;
-> commit
-> end if;
-> end
-> //