一、列举常见的关系型数据库和非关系型都有哪些?
关系型数据库
mysql 开源,主要用于大型门户
oracle 企业级,功能强大、安全但是费用高
sqlite 轻量级
sql server 大学课程多数用这个,是微软公司的产品
非关系型数据库 :消息转发
nosql
redis
memcache
MongoDB
二、常用的搜索引擎
1、搜索引擎
1.InnoDB:支持事务、行级锁、外键,保持事务的完整性,在修改数据的效率比较快
MySql 5.6 版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它具备提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提升了它的多用户并发数以及性能。
InnoDB 将用户数据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。
2.MyISAM:表级锁,查询速度快,但是插入和修改效率慢
MyISAM既不支持事务、也不支持外键、其优势是访问速度快,但是表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景。
3.Memory:数据都存在内存中,处理数据的速度快,但是对内存要求高,重启服务和断电消失
在内存中存储所有数据,应用于对非关键数据由快速查找的场景。Memory类型的表访问数据非常快,因为它的数据是存放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失,
长用于数据量小的数据库,并对服务器的内存有要求,一般应用于每个用户的登录状态。
4.BLACKHOLE:放进去的所有数据都不会存储,但有一个日志记录着插入的数据,利用日志分流数据
黑洞存储引擎,类似于 Unix 的 /dev/null,Archive 只接收但却并不保存数据。对这种引擎的表的查询常常返回一个空集。这种表可以应用于 DML 语句需要发送到从服务器,但主服务器并不会保留这种数据的备份的主从配置中。
2、相关sql语句
1.查看当前的默认存储引擎:
mysql> show variables like "default_storage_engine";
2.查询当前数据库支持的存储引擎
mysql> show engines \G;
8、指定存储引擎建表
1.在建表时指定
mysql> create table t1(id int,name varchar(20)) ENGINE=MyISAM;
mysql> create table country(id int,cname varchar(50)) ENGINE=InnoDB;
2.也可以使用alter table语句,修改一个已经存在的表的存储引擎。
mysql> alter table country engine = MyISAM;
9、在配置文件中指定
#my.ini文件
[mysqld]
default-storage-engine=INNODB
三、各种定义语言的区别
DDL语句数据库定义语言:操作的是数据库、表的结构、视图、索引、存储过程
1、create:创建
create database 数据库名 charset utf8; // 创建数据库
create table 表名(id int,name char); // (列名1 数据类型,列名2,数据类型...) 这个是创建表和表头,还没有内容的
2、alter:跟新
alter database 数据库名 charset latin1(要修改的内容); // 修改数据库
ALTER表的操作
1. 修改表名
ALTER TABLE 表名 RENAME 新表名;
2. 增加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…];
3. 删除字段
ALTER TABLE 表名 DROP 字段名;
4. 修改字段:modify 修改数据类型和约束,change修改字段名并重新定义数据类型和约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
5.修改字段排列顺序/在增加的时候指定字段位置
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 放在首位
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 在某个字段后
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
6.增加/删除约束
ALTER TABLE 表名 ADD PRIMARY KEY (字段);
ALTER TABLE 表名 ADD UNIQUE (字段);
ALTER TABLE 表名 DROP PRIMARY KEY;
3、drop:删除
drop database 数据库名; // 删除数据库
drop table 表名; // 删除表
4、show/desc:查询
show databases; // 查询所有的数据库
show tables; // 查询所有表
desc 表名; // 查看表的结构
describe 表名; //查看表的结构
show create table 表名 \G; 查看当前表更详细的信息
DML语句数据库操纵语言: 操作的是表的具体的记录
1、insert:插入数据
1. 插入完整数据(顺序插入)
语法一:
INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);
语法二:
INSERT INTO 表名 VALUES (值1,值2,值3…值n);
2. 指定字段插入数据
语法:
INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);
3. 插入多条记录
语法:
INSERT INTO 表名 VALUES (值1,值2,值3…值n),(值1,值2,值3…值n),(值1,值2,值3…值n);
4. 插入查询结果
语法:
INSERT INTO 表名(字段1,字段2,字段3…字段n)
SELECT (字段1,字段2,字段3…字段n) FROM 表2 WHERE …;
2、update:跟新数据
语法:
UPDATE 表名 SET 字段1=值1,字段2=值2,WHERE CONDITION;
示例:
UPDATE mysql.user SET password=password(‘123’) where user=’root’ and host=’localhost’;
注:mysql库的user表存储的是用户的信息
3、delete:删除数据
语法:
DELETE FROM 表名
WHERE CONITION;
示例:
DELETE FROM mysql.user WHERE password=’’;
4、select:查询数据
查看所有列的数据
select * from staff_info;
查看指定列的数据
select name,age from staff_info;
4-1单表查询语法
SELECT [DISTINCT] 字段1,字段2... FROM 表名
WHERE 条件
GROUP BY 字段
HAVING 筛选
ORDER BY 字段[ASC/DESC]
LIMIT 限制条数
1、关键字执行的优先级
1.找到表:from
2.拿着where指定的约束条件,去表中取出一条条记录
3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
4.将分组的结果进行having过滤
5.执行select
6.distinct去重
7.将结果按条件排序:order by
8.限制结果的显示条数
DCL语句数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
1、权限::
usage 无权限
all 全部权限
select 查
create 增
drop 删
2、授权具体语句:grant 权限 on 库.表 to 用户
mysql> grant all on *.* to 'ming'@'%'; # all表示授予所有权限,第一个*代表所有库,第二个*代表所有表,'ming'@'%'代表用户和客户端主机,%代表任意主机
mysql> grant select on db1.* to 'ming'@'localhost'; # select代表只给查的功能,db1.* 代表库db1的所有表,localhost代表本地主机
# 给未存在的用户授权,会创建再授权
mysql> grant all on *.* to 'dong'@'%' identified by '123456' # 创建账号并授权
# 刷新权限
mysql> flush privileges; # 刷新使授权立即生效
# 查看用户权限
show grants for 'ming'@'%';
3、回收权限:revoke 权限 on 库.表 from 用户
mysql> revoke select on *.* from 'ming'@'%';
其他SQL语句:
0、导入数据库文件db.sql
步骤:
1. 进入MySQL数据
2. 创建数据库
create database db;
3. use db;
4. source db.sql保存的路径/
1、 启动server端 - 可以在service服务中操作,也可以打开cmd窗口
> net start mysql
2、停止服务 - 可以在service服务中操作,也可以打开cmd窗口
> net stop mysql
3、登录用户
> mysql -u root -p # mysql5.6默认是没有密码的,遇到password直接按回车键
4、查看所有的库
mysql> show databases;
5、查看当前用户
mysql> select user();
6、查看当前使用的数据库
mysql> select database();
7、退出当前用户
mysql> exit # 也可以用\q或者quit退出
8、给当前用户设置密码
mysql> set password = password('newpassword');
9、给其他用户设置密码
mysql> set password for 'username'@'host' = password('newpassword')
10、在输入sql语句的过程中 如果想要放弃本条语句
mysql> \c
11、创建账号
# %表示这个网段内所有ip都可以连接,identified by '123'表示给这个用户设置密码123
mysql> create user 'ming'@'192.168.16.%' identified by '123';
mysql> create user 'ming'@'192.168.16.5' # 表示某机器可以连接
mysql> create user 'ming'@'%' # 表示所有机器都可以连接
12、远程登陆
mysql> mysql -u ming -p123 -h 192.168.16.31 # u是user p是password h是localhost的ip地址
13、使用某个数据库(切换到文件夹)
use 数据库名;
14、交叉连接:不适用任何匹配条件。生成笛卡尔积
mysql> select * from employee,department;
15、内连接:只连接匹配的行
说明:
找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果
department没有204这个部门,因而employee表中关于204这条员工信息没有匹配出来
mysql> select employee.id,employee.name,employee.age,employee.sex,department.name from employee inner join department on employee.dep_id=department.id;
16、外链接之左连接:优先显示左表全部记录
说明:
以左表为准,即找出所有员工信息,包括没有部门的员工
本质就是:在内连接的基础上增加左表有而右表没有的结果
mysql> select employee.id,employee.name,department.name as depart_name from employee left join department on employee.dep_id=department.id;
17、外链接之右连接:优先显示右表全部记录
说明:
以右表为准,即找出所有部门信息,包括没有员工的部门
本质就是:在内连接的基础上增加右表有而左表没有的结果
mysql> select employee.id,employee.name,department.name as depart_name from employee right join department on employee.dep_id=department.id;
18、全外连接:显示左右两个表全部记录
说明:
在内连接的基础上增加左表有右表没有的和右表有左表没有的结果
注意:mysql不支持全外连接 FULL JOIN
但是:mysql可以使用UNION这种方式间接实现全外连接,需要注意的是union与union all的区别:union会去掉相同的纪录
select * from employee left join department on employee.dep_id=department.id
union
select * from employee right join department on employee.dep_id=department.id;