• MySql数据库基础


    MySql数据库

    """
    1、什么是数据库:管理数据的系统 - 安装某种管理数据的系统 - 管理的对象本质是文件
    2、存储数据的位置:内存、硬盘
    3、什么是系统:运行在硬件基础上,管理其他软件
    """
    
    # 数据库的组成
    """
    库:存放多张表 - 文件夹
    表:包含多条相同结构的记录 - 文件
    记录:包含多个key-value键值对的一条数据 - 二进制数据
    字段:描述信息 - 信息本身 == key-value - 二进制数据
    
    stu
    id	name	age		gender
    1	Bob 	18 		男
    2	Tom 	17 		女
    ...
    
    teacher
    ...
    
    """
    

    数据库的分类

    # 1)关系与非关系
    # 	关系:数据库中表与表之间有联系 - mysql
    #	非关系:没有表概念 - redis、mongodb(介于关系与非关系)
    
    # 2)内存与硬盘
    # 	硬盘:数据可以永久存储 - mysql、mongodb
    #	内存:数据的存取效率极高 - redis、memcache
    
    # 3)sql与nosql
    #	sql:数据库操作通过sql语句
    #	nosql:数据库操作就是key-value形式(value就是一条记录)
    #			stu - {'name': 'Bob', 'age': 18}
    #			stus - [{'name': 'Bob', 'age': 18}, {'name': 'Tom', 'age': 18}]
    #			name - 'Jerry'
    

    安装

    """
    1、解压免安装版本(5.6 - 没有初始密码)
    2、配置环境变量:数据库绝对路径下的bin
    3、配置服务:
    	启动管理员终端:mysqld --install [nmysql]  #安装服务端
    	
    """
    

    卸载

    """
    前提)启动终端,输入 mysql,如果不是提示 不是内部或外部命令,代表已安装数据库
    
    1)直接连入
    	i 搜索:服务,检索mysql服务,有
    		停止服务,并移除服务 - 启动管理员终端:mysqld --remove
    			
    	ii 搜索:服务,检索mysql服务,无 (mysql使用命令启动)
    		停止服务,启动管理员终端
    			tasklist | findstr mysql
    			taskkill /pid 进程pid /f
    	
    2)连接超时
    	搜索:服务,检索mysql服务,移除服务即可
    	
    3)移除环境变量
    
    总结:如果能连入,先停止服务 | 如果添加了服务,就移除服务 | 取消环境变量配置
    """
    

    连接数据库

    1)游客登陆(不一定能登入,登入了也啥都不能干)
    >: mysql
    
    2)账号密码登录
    >: mysql -u root -p[密码]
    再输入密码,没有任何提示,没有密码直接回车
    
    3)连接指定服务器的mysql
    >: mysql -h ip地址 -P 端口号 -u 账号 -p[密码]
    回车后敲入密码
    eg:
    >: mysql -hlocalhost -P3306 -uroot -p[密码]
    
    4)退出数据库
    >: quit
    >: exit
    

    用户信息查看

    1)查看当前登录的用户
    mysql>: select user();
    mysql>: select version(); 查看mysql版本: 
    2)root权限下可以查看所有用户信息
    mysql>: select * from mysql.user;    #查看所有用户的所有信息
    mysql>: select * from mysql.user G; #查看所有用户的权限
    mysql>: select user,password,host from mysql.user;  #查看所有用户的(user,password,host)
    
    3)root登录下,删除游客(操作后要重启mysql服务)
    mysql>: delete from mysql.user where user='';
    
    4)root登录下,修改密码(操作后要重启mysql服务)
    mysql>: update mysql.user set password=password('12345678') where host='localhost';
    
    updata mysql.user set password=password('root') where host='localhost';
    
    5)没有登录
    >: mysqladmin -u用户名 -p旧密码 -h域名 password "新密码"
    eg>: mysqladmin -uroot -p12345678 -hlocalhost password "root"
    
    6)root登录下,创建用户
    mysql>:grant 权限们 on 数据库名.表名 to 用户名@主机名 identified by '密码';
    

    数据库的基本操作

    1)查看已有数据库(当前用户可以操作的)所有数据库
    mysql>:show databases;
    
    2)选择某个数据库
    mysql>:use 数据库名  #进入某个具体的数据库,可以直接对该数据库下的表进行操作,不需要用 . 
    
    3)查看当前所在数据库
    mysql>:select database();  #需要通过 use 进入具体数据库,并查看当前数据库锁拥有的表
    
    4)创建数据库
    mysql>:create database 数据库名 [charset=编码格式]; #不指定编码格式的话,默认为latin1
    eg>: create database owen;
    eg>: create database zero charset=utf8;
    eg>: create database tank;
    
    5)查看创建数据库的详细内容
    mysql>:show create database 数据库名;
    eg>: show create database owen;
    
    6)删除数据库
    mysql>: drop database 数据库名;
    eg>: drop database tank;
    
    7)修改字符编码
    mysql>: alter database 数据库名 charset=编码格式;
    

    SQL语句、语句扩展

    top:TOP 子句用于规定要返回的记录的数目。
    列(s) = *
    sql top 语法
    select top number|precent 列(s) from table_name;     # 列(s) 表示 所有的列名称 
    top number例:select top 2 * from table_name; 或 select * from table_name limit 2;
    top precent例:select top 50 precent * from table_name; # 选取表中50%的记录
    
    like:LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式
    sql like 语法
    select 列(s) from table_name where 列 like pattern;
    例:select * from table_name where 列 like 'A%'(在表中搜寻以A开头的)|'%B'(以B结尾的)|'%AB%'(包含AB的);
    
    in:IN 操作符允许我们在 WHERE 子句中规定多个值
    sql in 语法
    select * from table_name where 列 in(值1,值2,...);
    
    between:操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
    sql between 语法
    select * from table_name where 列 between 值1 and 值2;  # 范围取头不取尾
    
    alias:为列名称和表名称指定别名(Alias)。
    sql alias 语法
    表:select * from table_name as alias_name;
    表别名例:select p.列1,p.列2,p.列3 from table_name1 as p,table_name2 as po where p.列1='值1' and p.列2='值2';
    列:select 列 as alias_name from table_name;
    列别名例:select 列1 as alias_name1,列2 as alias_name2 from table_name;
    
    join:用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
    sql join 语法
    select tb1.列1,tb1.列2,tb2.列 from tb1 inner join tb2 on tb1.列3=tb2.列3 order by tb1.列1;
    或
    select tb1.列1,tb1.列2,tb2.列 from tb1,tb2 where tb1.列3=tb2.列3;
    备注:不同的 SQL JOIN
    除了在上面的例子中使用的 INNER JOIN(内连接),还可以使用其他几种连接。
    下面列出了可以使用的 JOIN 类型,以及它们之间的差异。
    JOIN: 如果表中有至少一个匹配,则返回行
    LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
    RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
    FULL JOIN: 只要其中一个表中存在匹配,就返回行
    
    inner join 关键字语法:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
    select * from tb1 inner join tb2 on tb1.列=tb2.列;        # inner join 与join是相同的
    
    left join 关键字语法:LEFT JOIN 关键字会从左表(tb1)那里返回所有的行,即使在右表(tb2)中没有匹配的行。
    select * from tb1 left join tb2 on tb1.列=tb2.列;
    
    right join 关键字语法:RIGHT JOIN 关键字会右表(tb2)那里返回所有的行,即使在左表(tb1)中没有匹配的行。
    select * from tb1 right join tb2 on tb1.列=tb2.列;
    
    full join 关键字语法:只要其中某个表存在匹配,FULL JOIN 关键字就会返回行
    select * from tb1 full join tb2 on tb1.列=tb2.列;
    
    11、union:用于合并两个或多个 SELECT 语句的结果集(UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同)
    sql union 与 union all 语法
    select * from table_name1 union select * from table_name2;
    select * from table_name1 union all select * from table_name2;
    备注:默认地,union 选取不同的值,如果允许重复的值,就使用 union all(列出所有的值)
    
    select into:从一个表中选取数据,然后把数据插入另一个表中。常用于创建表的备份复件或者用于对记录进行存档。
    sql select into 语法
    select * into new_table_name [in externaldatabase] from old_table_name; # 所有列插入新表
    select 列 into new_table_name [in externaldatabase] from old_table_name;  # 某一列插入新表
    例:备份某张表  select * into tb1_backup from tb1;
    向另一个数据库中拷贝表  select * into tb1 in 'backup.mdb' from tb1;
    多表查询存入到新表   select tb1.列1,tb2.列2 into new_table_name from tb1 inner join tb2 on tb1.列3=tb2.列3;
    
    create index:用于在表中创建索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
    注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
    sql create index 语法
    create index index_name on table_name(列);   # 简单的索引,允许使用重复的值
    create index index_name on table_name(列1 desc,列2);      # 默认是升序,希望降序在列名称后添加保留字 desc,索引不止一个列可以逗号隔开
    
    sql create unique index 语法      # 唯一的索引
    create unique index index_name on table_name(列);    # 唯一的索引意味着两个行不能拥有相同的索引值
    
    alter table : 语句用于在已有的表中添加、修改或删除列。
    sql alter table 语法
    添加列:alter table table_name add 列 数据类型;
    删除列:alter table table_name drop column 列;
    改变列中数据类型:alter table table_name modify column 列 需要修改的类型;
    只修改列的数据类型的方法:
    通常可以写成 alter table 表名 modify column 列名 新的列的类型
    例如:student表中列sname的类型是char(20),现在要修改为varchar(20),SQL语句如下
         alter table student modify column sname varchar(20);
    同时修改列名和列的数据类型的方法:
    通常可以写成 alter table 表名 change column 旧列名 新列名 新的列类型
    例如:student表中列sname的类型是char(20),现在要修改为stuname varchar(20),SQL语句如下
         alter table student change column sname stuname varchar(20);
    
    alter table table_name add <新列名> <数据类型> [约束条件][FLRST(添加列到表的最前面)|AFTER(指定列后面)  <已存在的列>]; # 添加列
    alter table table_name <旧列名> <新列名> <新数据类型>; # 修改列名
    alter table table_name modify <列名> <数据类型>; # 修改列的数据类型
    alter table table_name modify <列1(想要改变的列)> <数据类型> FLRST|AFTER <列2>; # 修改列的位置
    alter table table_name drop <列>;  # 删除列
    alter table <旧表名> rename to <新表名>; # 修改表名
    
    view(视图): 视图是可视化的表。视图包含行和列,就像一个真实的表
    注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
    
    sql create view 语法
    create view view_name as select 列(s) from table_name where 条件;
    注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
    
    更新视图:create or replace view view_name as select 列(*) from table_name where 条件;
    删除视图:drop view view_name;
    

    数据库配置

    # 通过配置文件统一配置的目的:统一管理 服务端(mysqld) 、客户端(client)
    #		配置了 mysqld(服务端) 的编码为utf8,那么再创建的数据库,默认编码都采用utf8
    
    # 配置流程
    # 1)在mysql安装根目录下,创建配置文件:my.ini
    #		mac下配置文件名叫 my.cnf
    
    # 2)设置配置文件内容并保存
    [mysqld]  # 服务器配置
    port=3306  # 可以修改数据库默认端口(如果数据库端口被其他软件占用)
    character-set-server=utf8  # 编码格式
    #非安全模式
    sql_mode = no_engine_substitution
    #安全模式
    #sql_mode = strict_trans_tables
    #设置引擎
    default-storage-engine=INNODB
    collation-server=utf8_general_ci  # 排序方式(默认跟编码格式走)
    #utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。
    #utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果
    #utf8_bin:字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容
    [client]  # mysql自己的客户端叫[mysql],配置[client]即配置了[mysql],也配置了其他存在方式的客户端,比如Navicat可视化客户端
    default-character-set=utf8  # 编码格式
    
    # 3)重启数据库服务
    

    用户操作:重点

    # 为特定的数据库分配有该数据库 操作权限 的用户
    mysql>: grant 权限们 on 数据库.表 to 用户名@'主机名' identified by '密码';
    
    # 1)all:所有权限
    # 2)oldboy.*:oldboy数据库下所有表
    # 3)oldboy@'localhost':本机可以通过oldboy用户登入
    # 4)identified by 'Oldboy123':密码为Oldboy123
    eg>: grant all on oldboy.* to oldboy@'localhost' identified by 'Oldboy123';
    
    # 1)select,delete,update,insert,drop,alter:指定的权限
    # 2)oldboy.*:oldboy数据库下所有表
    # 3)oldboy@'%':任何机器可以通过oldboy用户登入
    # 4)identified by 'Oldboy123':密码为Oldboy123
    eg>: grant select,delete,update,insert,drop,alter on oldboy.* to oldboy@'%' identified by 'Oldboy123';
    
    # 撤销权限
    mysql>: revoke 权限1,权限2,... on 数据库名.表名 from 用户名@'主机名';
    # 禁掉本地oldboy用户对oldboy数据库的所有表的drop权限
    eg:> revoke drop on oldboy.* from oldboy@'localhost';
    
    # 删除用户
    drop user 用户名@'主机名';
    

    数据库表的引擎:驱动数据的方式 - 数据库优化

    # 前提: 引擎是建表是规定, 提供给表使用的, 不是数据库
    
    # 展示所有引擎
    mysql> show engines; 
    
    # innodb(默认): 支持事务, 行级锁, 外键
    mysql>: create table t11(id int)engine=innodb;
    
    # myisam: 查询效率要优于innodb, 当不需要支持事务, 行级锁, 外键, 可以通过设置myisam来优化数据库
    mysql>: create table t12(id int)engine=myisam;
    
    # blackhole:黑洞,存进去的数据都会消失(可以理解不存数据)
    mysql>: create table t13(id int)engine=blackhole;
    
    # memory:表结构是存储在硬盘上的,但是表数据全部存储在内存中
    mysql>: create table t14(id int)engine=memory;
    

    数据库的模式

    # mysql 5.7 以后默认都是安全模式
    
    # mysql 5.6 版本
    sql_model=no_engine_substitution  # 非安全性,默认
    sql_model=strict_trans_tables  # 安全性
    
    # 查看当前数据库模式:
    show variables like "%sql_mode%"; # %匹配0~n个任意字符 => 模糊查询
    
    # 临时设置为安全模式,服务重启后会被重置
    mysql>: set global sql_mode="strict_trans_tables";  # 在root用户登录状态下
    # 在设置后,quit断开数据库连接后(服务器不重启)就会进入安全模式
    
    # 安全模式下,非安全模式下sql执行的警告语句,都会抛异常
    eg>: create table t1(name char(2));
    eg>: insert into t1 values ("ab") # 正常
    eg>: insert into t1 values ("owen") # 错误 Data too long for column 'name' at row 1
    

    表的基本操作

    ##前提:先选取要操作的数据库
    
    1)查看已有表
    mysql>:show tables;
    
    2)创建表
    mysql>:create table 表名(字段1 类型, ..., 字段n 类型);
    eg>: create table student(name varchar(16), age int);
    eg>: create table teacher(name varchar(16), age int);
    
    3)查看创建表的sql
    mysql>:show create table 表名;
    eg>: show create table student;
    
    
    4)查看创建表的结构
    mysql>:desc 表名;
    
    5)改表结构
    # 修改表名
    mysql>: alter table 旧表 rename 新表;
    
    # 修改字段名
    mysql>: alter table 表名 change 旧字段 新字段 类型(长度);
    
    # 修改字段属性
    mysql>: alter table 表名 modify 字段 新类型(长度);
    
    6)删除表
    mysql>: drop table 表名;
    eg>: drop table teacher;
    

    创建表的完整语法

    # 长度和约束在某些情况下是可以省略的
    mysql>: create table 表名 (
    	属性名1 类型(长度) 约束,
    	...
    	属性名n 类型(长度) 约束
    ) engine=引擎 default charset=utf8;
    

    记录的基本操作

    1)查看某个数据库中的某个表的所有记录,如果在对应数据库中,可以直接查找表
    mysql>: select * from [数据库名.]表名;
    注:*代表查询所有字段
    
    2)给表的所有字段插入数据
    mysql>: insert [into] [数据库名.]表名 values (值1,...,值n);
    eg:如果给有name和age两个字段的student表插入数据
    1条>:insert into student values ('Bob', 18);
    多条>:insert into student values ('张三', 18),('李四', 20);
    指定库>:insert owen.student values ('张三', 18),('李四', 20);
    
    3)根据条件修改指定内容
    mysql>: update [数据库名.]表名 set 字段1=新值1, 字段n=新值n where 字段=旧值;
    eg:> update student set name='王五', age='100' where name='张三';
    注:i) 可以只修改部分字段 ii) 没有条件下,所有记录都会被更新
    eg:> update student set name='呵呵';
    
    4)根据条件删除记录
    mysql>: delete from [数据库名.]表名 where 条件;
    eg:> delete from student where age<30;
    

    sql函数

    函数及描述
    NOW():返回当前的日期和时间
    CURDATE():返回当前的日期
    CURTIME():返回当前的时间
    DATE():提取日期或日期/时间表达式的日期部分
    EXTRACT():返回日期/时间按的单独部分
    DATE_ADD():给日期添加指定的时间间隔
    DATE_SUB():从日期减去指定的时间间隔
    DATEDIFF():返回两个日期之间的天数
    DATE_FORMAT():用不同的格式显示日期/时间
    
  • 相关阅读:
    字符、字符串和文本处理
    接口
    泛型
    事件
    Expression表达式树 案例
    栈帧
    属性
    方法
    常量和字段
    Dynamic
  • 原文地址:https://www.cnblogs.com/TMesh/p/11731074.html
Copyright © 2020-2023  润新知