zoukankan      html  css  js  c++  java
  • mysql基础


    title: MySQL第一章
    data: 2017年6月5日 08:55:50
    categories: MySQL

    MySQL

    python2 安装MySQLdb

    python3 安装pymysql或者mysql-connector

    MySQL:是用于管理数据的一个软件

    -服务端软件

    	-socket服务端
    	-本地文件操作
    	-解析指令【SQL语句】
    

    -客户端软件

    	-socket服务端
    	-发送指令
    	-解析指令【SQL语句】	
    

    PS:

    	-DBMS数据库管理系统
    	-SQL语句	
    

    技能:

    -安装  服务端和客户端
    
    -连接
    
    -学习SQL语句规则:指示服务端做任意操作
    

    其他类似软件:

    关系型数据库:sqllite,db2,oracle,sql server MySQL
    
    非关系型数据库: MongODB,redis
    

    MySQL安装

    windows:

    可执行文件:exe

    	按照流程一步步选择。
    

    压缩包:

    	放置任意目录
    
    	初始化:
    		服务端:安装目录binmysqld-initialize-insecure
    		#用户名:root 密码:空
    
    		启动服务端:双击bin下的mysqld.exe
    
    		客户端连接:mysql -u root -p
    		
    		连接成功后可以输入指令:
    				show databases;
    				show tables;
    
    		环境变量的配置:
    			将安装路径添加到环境变量
    
    		windows服务:
    			生成服务:
    				安装路径inmysqld --install
    			
    			删除服务:
    				安装路径inmysqld --remove
    
    			启动和停止服务:
    				net start MySQL
    
    				net stop MySQL
    

    MySQ连接

    mysql -u 用户名 -p

    -p:表示该用户需要输入密码,下一行就会弹出一个password:让输入密码,如果用户名没有密码,则可以不写-p回车直接就能登录

    也可以用管理工具连接:如navicat

    MySQL:SQL语句

    新建用户及权限

    创建用户

    create user "用户名"@"允许在哪些IP上使用" identified by "密码";
    
    
    create user "gaoyue"@"192.168.31.24" identified by "123456";
    
    PS:
    	IP地址那可以写%, 表示所有的都可以用
    	192.168.31.%  表示在192.168.31的网段都可以用。以此类推
    

    授权

    	权限    人
    	grant   select,insert,update on 数据库名.表名 to "用户名"@"允许在哪些IP上使用"
    
    	grant all privileges  on 数据库名.表名 to "用户名"@"允许在哪些IP上使用"   ----全部权限
    
    
    	revoke all privileges on 数据库名.表名 to "用户名"@"允许在哪些IP上使用"   -----删除权限
    
    	数据库名.表名:
    			*表示所有的。如数据库名.* 表示指定数据库下所有的表。同理*.*表示全部的数据库和表。
    

    数据库和表

    show databases; 显示数据库名字信息

    use 数据库名 : 使用输入的数据库

    show tables; 显示选择数据库的表信息

    创建数据库和表

    create database 数据库名;

    create database 数据库名 default charset utf8;设置默认编码为utf8

    drop database 数据库名; 删除数据库

    create table 表名;

    create table 表名(键 类型,键 类型) default charset=utf8; 设置默认编码是UTF8,这样可以输入中文

    create table 表名(键 类型 auto_increment primary key,键 类型)engine=innodb default charset=utf8;

    auto_increment:表示该键值自增
    
    primary key	:表示约束,主键(不能重复且不能为空)
    
    innodb:支持事物,原子性操作  如果两个表在做数据交换,突然断电,为避免数据错误,可以恢复表到还未交换之前的状态
    
    create table t1(
    	列名 类型 null,可为空
    	ID   int not null,
    	列名 类型 not null, 不可为空
    	列名 类型 not null auto_increment primary key,
    	id int,
    	name char(10)
    )engine=innodb default charset=utf8;
    

    主键和外键和自增

    主键

    primary key :表示约束,主键(不能重复且不能为空)

    一个表中只能有一个主键,但是主键并不是指的是一列,如果要多列组合成一个主键,可以在新的一行
    
    写,primary key (A_id,B_id)  这样A_id 和 B_id 就组合成了一个主键
    
    唯一索引
    create table a(
    	id int primary key,
    	num int,
    	xx int,
    	unique uq1 (num), #num设置成唯一索引
    	unique up2 (num,xx) #num和xx组成唯一索引,以后2个组合不能完全重复
    )
    

    主键:
    不能重复且不能为空

    索引:
    不能重复 能为空

    外键

    constraint 别名 foreign key ("需要建立外键的键名",) references 外键所在表名('外键值'),

    例如现在有2张表。表1是学生表,表中内容有,学生ID,学生姓名,学生班级。表2是班级表,表中内容有。班级ID,班级姓名。

    如果学生表中班级都要打中文的话,不仅花费时间,还占用空间,后期维护还不方便,那么我们把学生表中的班级,设置成外键连接到班级表中的ID一行,让这两列相互对应,这样不仅节省空间,后期维护还很方便。所以在学生表中加入。

    constraint stu_class foreign key ("class",) references class_one('id'),
    

    给已创建的表添加外键:

    alter table 需加外键的表 add constraint 外键名 foreign key(需加外键表的字段名) references 关联表名(关联字段名);
    
    外键名不能重复。
    
    扩展:一对一,多对多。
    一对一

    例子:

    博客园:注册完用户后,还需要开通博客才能拥有博客。
    	用户表
    		ID   USERNAME  PASSWORD
    		1     高1        123
    		2     高2        123
    		3     高3        123
    		4     高4        123
    	上述用户表中,只有高2 和 高4 开通了博客表,所以
    	博客表
    		ID   BOKEURL    USER
    		1     /GAO2/      2
    		2     /GAO4/      4						
    	博客表中的USER和用户表中的ID建立外键关系,并设置唯一unique,这样博客表中最多只能拥有4条数据,实现了一对一的关系。
    
    多对多

    例子:
    百合相亲网:2张表,一张男生表,一张女生表
    用户表men:
    ID USERNAME sex
    1 高1 man
    2 高2 man
    3 高3 man
    用户表wommen:
    ID USERNAME sex
    1 跃1 woman
    2 跃2 woman
    3 跃3 woman

    	相亲记录表:
    		ID   USERman  userwoman
    		1     1        1
    		2     1        2
    		3     1        3
    		4     2        1
    		5     1        1
    
    	相亲记录表中,userman和userwoman,分别和两张表的ID设置外键连接。但是会出现重复现象,比如1和5就重复了。如何避免这种情况。这就需要给userman和userwoman组合添加一个唯一索引。
    
    	unique man_woman (userman,userwoman),这样就避免了重复约会相同对象的情况了。
    

    自增

    auto_increment:

    desc 表名;查看表的描述信息
    
    show create table 表名;显示当前表创建时候的SQL语句
    
    show create table 表名 G; 显示当前表创建时候的SQL语句,能查看到当前auto_increment的值
    
    alter table 表名 auto_increment=0;给auto_increment 设置值。
    

    mysql自增的步长,基于会话级别;

    show session variables lick "auto_inc%" 查看全局变量
    
    set  session auto_increment_increment=2;设置步长为2
    
    set  session auto_increment_offset=2;设置起始值为2
    

    全局变量:session变成global

    sql server自增的步长,基于表级别;

    数据类型

    数字:

    bit:[(M)]
    	二进制位(101001),m表示二进制位的长度(1-64),默认m=1
    tinyint:[(m)] [unsigned] [zerofill]
    	小整数,数据类型用于保存一些范围的整数数值范围:
    
        有符号:
            -128 ~ 127.
        无符号:
            0 ~ 255
    	特别的: MySQL中无布尔值,使用tinyint(1)构造。
    
    int :[(m)][unsigned][zerofill]
    	整数,数据类型用于保存一些范围的整数数值范围:
        有符号:
            -2147483648 ~ 2147483647
        无符号:
            0 ~ 4294967295
    
    	特别的:整数类型中的m仅用于显示,对存储范围无限制。例如: int(5),当插入数据2时,select 时数据显示为: 00002
    
    bigint:[(m)][unsigned][zerofill]
    	大整数,数据类型用于保存一些范围的整数数值范围:
        有符号:
            -9223372036854775808 ~ 9223372036854775807
        无符号:
            0  ~  18446744073709551615
    
    FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
    	单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
    
    DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
    	双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
    
    decimal:[(m[,d])] [unsigned] [zerofill]
    	准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
    
        特别的:对于精确数值计算时需要用此类型
        decaimal能够存储精确值的原因在于其内部按照字符串存储。
    

    字符串:创建数据表,定长放前面,不定长放后面,如果是大型文件,图片或者视频。数据库中存放的是文件存放的路径

    char(m) 定长,查询快
    	char数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中m代表字符串的长度。
        PS: 即使数据小于m长度,也会占用m长度
    
    varchar(m) 不定长,节省空间
    	varchars数据类型用于变长的字符串。其中m代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。
    
        注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡
    
    text
        text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。
    
    mediumtext
        A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
    
    longtext
        A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.
    

    时间类型:
    date:YYYY-MM-DD 年-月-日

    time:HH:MM:SS   时-分-秒
    	
    year:YYYY 年
    
    datetime:YYYY-MM-DD  HH:MM:SS  年月日时分秒
    
    timestamp:YYYYMMDD HHMMSS
    

    其他类型:

    enum:枚举类型
    	示例:create table user(
    		id int(5),
    		name varchar(10),
    		sex enum("man","woman")
    		)
    	这张user表中sex只能填写man或者woman,如果填写其他数据,会报错
    
    set:集合类型
    	作用和enum类似,不同的是,enum只能填给了的组合中的某一个值,而set集合,可以填一个值,也可以填多个符合要求的值。
    

    对表进行操作:增删改查

    insert into 表 (列名,列名...) values (值,值,值...)
    insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)
    insert into 表 (列名,列名...) select (列名,列名...) from 表
    

    delete from 表  清空表
    delete from 表 where id=1 and name='alex'
    

    update 表 set name = 'alex',age=19 where id>1
    

    select * from 表
    select * from 表 where id > 1
    select nid,name,gender as gg from 表 where id > 1
    

    查询条件

    条件
    select * from 表 where id > 1 and name != 'alex' and num = 12;
    
    select * from 表 where id between 5 and 16;[5-16]
    
    select * from 表 where id in (11,22,33)
    select * from 表 where id not in (11,22,33)
    select * from 表 where id in (select nid from 表)
    
    通配符
    select * from 表 where name like 'ale%'  - ale开头的所有(多个字符串)
    select * from 表 where name like 'ale_'  - ale开头的所有(一个字符)
    
    限制
    select * from 表 limit 5;            - 前5行
    select * from 表 limit 4,5;          - 从第4行开始的5行,5 6 7 8 9
    select * from 表 limit 5 offset 4    - 从第4行开始的5行
    
    排序
    select * from 表 order by 列 asc              - 升序
    select * from 表 order by 列 desc             - 降序
    select * from 表 order by 列1 desc,列2 asc    - 根据 “列1” 降序,如果相同则按列2升序
    
    分组
    select num from 表 group by num
    select num,nid from 表 group by num,nid
    select num,nid from 表  where nid > 10 group by num,nid order nid desc
    select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid
    
    select num from 表 group by num having max(id) > 10
    
    特别的:group by 必须在where之后,order by之前
    
    如果对于聚合函数结果进行二次筛选时,就必须使用having,而不使用where.
    
    count(id):计数,有几个ID显示几
    
    sum():求和
    
    max():最大的值
    
    min():最小的值
    
    avg():平均值
    
    连表
    无对应关系则不显示
    select A.num, A.name, B.name
    from A,B
    Where A.nid = B.nid
    
    无对应关系则不显示
    select A.num, A.name, B.name
    from A inner join B
    on A.nid = B.nid
    
    A表所有显示,如果B中无对应关系,则值为null
    select A.num, A.name, B.name
    from A left join B
    on A.nid = B.nid
    
    B表所有显示,如果B中无对应关系,则值为null
    select A.num, A.name, B.name
    from A right join B
    on A.nid = B.nid
    
    组合
    组合,自动处理重合
    select nickname
    from A
    union
    select name
    from B
    
    组合,不处理重合
    select nickname
    from A
    union all
    select name
    from B
  • 相关阅读:
    .net core下直接执行SQL语句并生成DataTable
    asp.net core获取HttpContext相关操作
    连接Oracle的几种方式
    数据库(表)的逻辑备份与恢复
    Oracle函数
    Oracle 11g ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务
    未在本地计算机上注册"MSDAORA.1"提供程序
    如果在安装32位oracle 客户端组件时的情况下以64位模式运行,将出现问题
    Oracle Client安装与基本配置
    事务
  • 原文地址:https://www.cnblogs.com/G-YUE/p/6952264.html
Copyright © 2011-2022 走看看