mysql小结

一、列举常见的关系型数据库和非关系型都有哪些?关系型数据库 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语句数据库定义语言:操作的是数据库、表的结构、视图、索引、存储过程1create:创建create database 数据库名 charset utf8; // 创建数据库create table 表名(id int,name char); // (列名1 数据类型,列名2,数据类型...) 这个是创建表和表头,还没有内容的2alter:跟新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;3drop:删除drop database 数据库名; // 删除数据库drop table 表名; // 删除表4、show/desc:查询show databases; // 查询所有的数据库show tables; // 查询所有表desc 表名; // 查看表的结构describe 表名; //查看表的结构show create table 表名 \G; 查看当前表更详细的信息DML语句数据库操纵语言: 操作的是表的具体的记录1insert:插入数据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 …;2update:跟新数据语法: UPDATE 表名 SET 字段1=值1,字段2=值2,WHERE CONDITION;示例: UPDATE mysql.user SET password=password(‘123’) where user=’root’ and host=’localhost’;注:mysql库的user表存储的是用户的信息3delete:删除数据语法: DELETE FROM 表名 WHERE CONITION;示例: DELETE FROM mysql.user WHERE password=’’;4select:查询数据查看所有列的数据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.找到表:from2.拿着where指定的约束条件,去表中取出一条条记录3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组4.将分组的结果进行having过滤5.执行select6.distinct去重7.将结果按条件排序:order by8.限制结果的显示条数 DCL语句数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE1、权限:: usage 无权限 all 全部权限 selectcreatedrop2、授权具体语句: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语句:1、 启动server端 - 可以在service服务中操作,也可以打开cmd窗口> net start mysql2、停止服务 - 可以在service服务中操作,也可以打开cmd窗口> net stop mysql3、登录用户> 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> \c11、创建账号# %表示这个网段内所有ip都可以连接,identified by 123表示给这个用户设置密码123mysql> 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;

 

相关文章