MySql
-
数据库的优势有哪些?
1.为了方便查询数据;
2.为了持久化的保存数据; -
DBNS、DB、SQL
1.DB:是数据库保存数据的容器;
2.DBNS:是数据库管理系统或者数据库管理产品;常见的数据库管理系统有MYSQL、ORACAL、DB2、sql server
3.SQL:是结构化查询语句
4. 三者的关系:
DBMS----SQL-----DB:DBMS
管理系统通过SQL语言下命令给DB数据库 -
数据库存储数据的特点:
1.表是放在库中的;
2.数据是存放在表中的;
3.一个数据库中的表名是唯一的;
4.数据库中的列的名称称为字段;
5.表中数据是以行的形式存放; -
数据类型
1.整数数据类型:一般情况下id的时候就使用int类型。其他的使用较少。
2.浮点数据类型:float和double类型。区别是小数点精确度不同。
3.定点数据类型:DECIMAL(M,D)
4.字符串类型:CHAR–0-255, VARCHAR–0-65535; -
登录登出mysql
登录:
mysql -u root -p
退出:
quit或者exit
-
语法规范:
1.关键字要大写,表名,字段名小写;
2.mysql支持关键字小写 -
常见命令:
1.查询有哪些数据库:show databases;
2.指定操作库:use 数据库名;
3.查看数据库中有哪些表:show tables;
4.查看表结构:desc 表名
5.查看表数据库:select * from 表名
-
DDL语言(数据定义语言)
1.库和表的管理:
创建数据库:create databases 库名;
删除数据库:drop databases 库名;
2.创建表
注意:创建表时,要先进入use库后创建.
创建表:
create table 表名(
字段名 数据库类型
字段名 数据库类型
);
删除表:
drop table 表名;
- MySql修改表
1.修改表名 rename:
alter table 旧表名 rename 新表名;
2.修改字段的数据类型 MODIFY
alter table 表名 MODIFY 字段名 字段类型;
3.修改字段名 change:
alter table 表名 change 旧字段名 新字段名 新字段类型;
4.添加字段 add first after
将字段firstname添加到age字段之后
alter table student add firstname varchar(5)after age;
将firstname添加到第一列
alter table student add firstname varchar(5)first
5.删除字段 drop
alter table 表名 drop 字段名;
- DML语言(数据操纵语言)
1.不指定字段插入:
insert into 表名 values(1,‘lisi’,56,‘13335354646’);
2.指定字段名插入:
insert into student (name,age,stuphone)values(‘lisi’,56,‘13376765454’)
3.同时插入多行数据:
insert into student values
(2,‘wangwu’,46,‘13345677654’),
(3,‘tom’,22,‘12347564857’);
4.修改语句:
修改其中某个字段的值
update 表名 set id = 4 where age = 56;
**where后面跟的是唯一的值,where前是需要修改的内容**
多个字段同时修改时用逗号隔开;
update student set id = 4,name = ‘augus’ where age = 56;
5.删除语句:
删除其中某一行数据
delete from 表名 where name = ‘wagwu’;
同时删除多行数据
delete from 表名 where name in(‘lisi’,‘wangwu’)
6.常见约束:
1.主键: PRIMARY KEY
作用:DBMS为了方便查找数据库,设计的一个规则
特点:
一张表中主键是唯一的;
主键可以用来唯一的标识一行数据,主键不能为空集;
2.联合主键:表中字段不能作为唯一标识每一行的数据时,选取表中两个或者多个字段作为联合主键;
特点:如果去掉联合主键某个字段,剩下的字段任然可以构成联合主键,那么说明之前的联合主键是错误的。
修改表时添加主键:
alter table user add primary key(id);
选中表 表名 关键字 字段名
删除主键:
alter table user drop primary key;
创建表时,设置主键;
方式一
create table class(
-> id int(11) primary key,
-> name varchar(12)
-> );
方式二:
create table class1(
-> id int(11),
-> name varchar(12),
-> primary key(id)
-> );
创建联合主键;
create table user1(
-> name char(16),
-> gender char(10),
-> birthday date,
-> city varchar(16),
-> primary key(name,city)
-> );
主键自增 AUTO_INCREMENT
通过auto_increment设置主键自增
特点:
和主键结合使用,
自增字段的数据类型是整数类型
自增的数据开始值是1,没增加一行数据,自增1
添加自增
create table tb_dept10(
id INT(11) PRIMARY key AUTO_INCREMENT,
name VARCHAR(25),
location VARCHAR(50)
);
设置自增默认值
CREATE TABLE tb_dept11(
id INT(11) PRIMARY key auto_increment,
name VARCHAR(25),
location VARCHAR(50)
)auto_increment=100;
删除自增
ALTER TABLE tb_dept10 MODIFY id int(11);
在修改表时设置自增
ALTER TABLE tb_dept12 CHANGE COLUMN id id INT(11) auto_increment;
修改表时指定初始值
ALTER TABLE tb_dept12 auto_increment=100;
外键:
FOREIGN KEY(sid) REFERENCES studentinfo(id)
)ENGINE=InnoDB DEFAULT CHARSET=GB2312;
唯一约束UNIQUE
特点:
主键在一个表里面只能有一个
但是唯一性约束可以有多个
设置了唯一性约束的字段表中有且只能有一个空值
创建表的时候设置唯一性约束
CREATE TABLE tb_dept1(
id INT(11) PRIMARY KEY,
name VARCHAR(25) UNIQUE,
location VARCHAR(50)
);
修改表的时候添加唯一性约束
ALTER TABLE tb_dept2 ADD UNIQUE(name);
起别名:
ALTER TABLE tb_dept2 ADD CONSTRAINT 别名 UNIQUE(字段);
删除唯一性约束
ALTER TABLE tb_dept2 DROP INDEX name;
默认值DEFAULT 'Beijing'
特点:
在插入数据时,如果不写入就使用默认值,如果写入就使用新值
新建表时创建
CREATE TABLE tb_dept3(
id INT(11) PRIMARY KEY,
name VARCHAR(25),
location VARCHAR(50) DEFAULT 'shanghai'
);
非空约束(NOT NULL)
特点:
一张表中可以设置多个字段非空,主键默认非空
新建表时设置
CREATE TABLE tb_dept4(
id INT(11) NOT NULL,
name VARCHAR(35),
location VARCHAR(50)
);
修改表时设置
ALTER TABLE tb_dept3 CHANGE name name VARCHAR(34) not NULL;
7.DQL数据查询语言
查询会产生一张虚拟表
语法结构:
*代表表中的所有字段,不建议使用,当数据量大时会影响查询效率
select 字段名,字段名 from 表名 where 筛选条件
查询表中所有的数据库:
select * from student;
指定字段查询:
select 'name' , address from student;
as起别名:
select name as 姓名,address as 地址 from student;
起别名中,不写as 也是可以辨认的;
limit使用
注意:limit 0,2 逗号前面表示从哪一行开始取值,第一行是0,逗号右边是取值取多少行
select * from student where id = 901 limit 0,2;
distinct排除重复
select distinct department as 院系,address from student;
单条件查询:
```javascript
= != < > >= <==
select * from student where id >=905
多条件查询:and or not
select * from student where id>=905 and sex='女';
select * from student where id>=905 or sex=‘男’
集合操作:
1、or
SELECT * FROM student WHERE department=' 计算机系' OR department='英语系' OR sex='女'
2、in
SELECT * FROM student WHERE department IN ('计算机系','中文系')
3、not in
SELECT * FROM student WHERE department NOT IN ('计算机系','中文系')
*/
模糊匹配
LIKE
_ 一个字符
SELECT * FROM student WHERE name LIKE '_三'
%任意字符 可以是0个
SELECT * FROM student WHERE address LIKE '辽宁%'
查询空号 is NULL
SELECT * FROM student WHERE name is NULL
常量列:
SELECT name as 姓名,address AS 地址,'希望小学' AS 学校 FROM student
排序
升序 ASC
SELECT * FROM score WHERE c_name='计算机' ORDER BY grade ASC
降序 DESC
SELECT * FROM score WHERE c_name='计算机' ORDER BY grade DESC
聚合函数:
count 计数:
SELECT COUNT(grade) FROM score
max
求计算机系学生的最高分
SELECT stu_id AS 学号, MAX(grade) AS 成绩 FROM score WHERE c_name='计算机'
min 求计算机系学生的最低分
SELECT stu_id AS 学号, min(grade) AS 成绩 FROM score WHERE c_name='计算机'
sum 求和
SELECT stu_id AS 学号, SUM(grade) AS 成绩 FROM score WHERE c_name='计算机'
avg 平均值
SELECT stu_id AS 学号, AVG(grade) AS 成绩 FROM score WHERE c_name='计算机'
分组
WHERE子句:
从数据源中去掉不符合其搜索条件的数据
GROUP BY子句:
搜集数据行到各个组中,统计函数为各个组计算统计值,每个组输出一行结果
HAVING子句:
从分组计算结果中进行过滤,去掉不符合其组搜索条件的各组数据行
求每个系的最高分
SELECT c_name,AVG(grade) FROM score GROUP BY c_name
多字段分组
SELECT stu_id,c_name,AVG(grade) FROM score GROUP BY c_name,stu_id
HAVING 对之前分组的结构进行过滤
SELECT c_name,AVG(grade) FROM score GROUP BY c_name HAVING AVG(grade)<=90;
子查询:sql里面嵌套sql
SELECT id,name FROM student
WHERE id=(
SELECT stu_id FROM score WHERE c_name='计算机' AND grade=70);
IN 后面可以赋多个值,用括号
中文系的学生信息
SELECT * FROM student WHERE id IN (SELECT stu_id FROM score WHERE c_name='中文')
NOT IN
SELECT * FROM student WHERE id NOT IN (SELECT stu_id FROM score WHERE c_name='中文')
EXISTS 如果子查询返回结果为真 则执行前面sql ,如果为假 则前半句sql执行结果为空
SELECT * FROM score WHERE EXISTS (SELECT stu_id FROM score WHERE c_name='中文111')
ALL 本质用and 取最大值
ANY OR 取最小值
1.ANY子句表示父查询只需要任意匹配一条子查询结果就可执行
2.ANY子句中 = ANY(子查询) 与IN同意
3.ANY子句中 > ANY代表大于最小值
4.ANY子句中 < ANY代表小于最大值
1.ALL子句中 > ALL代表大于最大值
2.ALL子句中 < ALL代表小于最小值
UNION 合并表
all 数据会重复
SELECT * FROM student_copy UNION all SELECT * FROM student;
不加all会去重
SELECT * FROM student_copy UNION SELECT * FROM student;
内连接:求两张表交集的部分
SELECT * FROM a_table INNER JOIN b_table ON a_table.a_id = b_table.b_id
左连接: 以左表为基础,展示出左表全部数据和右表交集部分数据
SELECT * FROM a_table LEFT JOIN b_table ON a_table.a_id = b_table.b_id
右连接:以右表为基础,展示出右全部数据和左表交集部分数据
SELECT * FROM a_table RIGHT JOIN b_table ON a_table.a_id = b_table.b_id
- 事务
事务具有4个特定:原子性,一致性,隔离性,耐久性。 - 视图
视图是保存查询结果,把结果虚拟成一张表,视图依赖原始的表数据和结构,如果原来的表数据或者结构发生改变,视图的数据也会相应发生改变。
视图的特点:
1.效率高
2.安全性,可以指定展示其中某几列数据,隐藏敏感信息。
语法结构为:
reate view 视图名 as 查询sql
创建视图:
create view view_show_stu(sid,sname,sex,birth,class) as select * from student;
查看视图结构:
show create view get_stdent_score
修改视图
语法结构:
ALTER VIEW 视图名 AS 新的查询sql
修改视图
ALTER VIEW showstu AS SELECT student.sno,student.sname,student.ssex,student.sbirthday,
student.class,score.cno,score.degree FROM student,score WHERE student.sno = score.sno
删除视图
DROP VIEW showstu;
存储过程
创建存储过程
定义结束结束
创建存储过程
CREATE PROCEDURE ShowStuScore1()
BEGIN
SELECT * FROM tb_students_score;
END
创建带参数的存储过程
delimiter
create PROCEDURE GetStu(in name VARCHAR(30))
BEGIN
SELECT * FROM student WHERE sname=name;
END
通过call语句调用存储过程
delimiter ;
CALL GetStu('李军')
查看存储过程的状态
SHOW PROCEDURE STATUS LIKE 'GetStu';
查看存储过程的定义
show CREATE PROCEDURE GetStu;
修改存储过程 只能修改存储过程的状态,修改内容只能先删除在修改
例子: ALTER PROCEDURE showstuscore MODIFIES SQL DATA SQL SECURITY INVOKER;
删除存储过程
drop PROCEDURE ShowStuScore1
备份数据库中某个表
mysqldump -uroot -p test student>C:\student.sql
备份单个数据库
mysqldump -u root -p 库名>C:\student.sql
同时备份多个库
mysqldump -u root -p --databases 库名 库名>C:\student.sql
导出数据库信息
查看secure-file-priv当前的值是
show variables like ‘%secure%’;
如果导出失败:
则需要添加secure_file_priv
SELECT * FROM student INTO OUTFILE 'C://Pcode/person.txt';
回复数据库
mysql -u root -p < C:\all.sql
备份所有数据库
mysqldump -u root -p --all-databases > C:\all.sql