zoukankan      html  css  js  c++  java
  • Python day11 Mysql

    一、数据库的简介

    1.1 数据库

    数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合。数据库中的数据按一定的数学模型组织、描述和存储,具有较小的冗余,较高的数据独立性和易扩展性,并可为各种用户共享。

    1.2 数据库管理系统软件

      数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。

    数据库管理系统是数据库系统的核心,是管理数据库的软件。数据库管理系统就是实现把用户意义下抽象的逻辑数据处理,转换成为计算机中具体的物理数据处理的软件。有了数据库管理系统,用户就可以在抽象意义下处理数据,而不必顾及这些数据在计算机中的布局和物理位置。

    常见的数据库管理软件:甲骨文的oracle,IBM的db2,sql server, Access,Mysql(开源,免费,跨平台).

    1.3 数据库系统

      数据库系统DBS(Data Base System,简称DBS)通常由软件、数据库和数据管理员组成。其软件主要包括操作系统、各种宿主语言、实用程序以及数据库管理系统。数据库由数据库管理系统统一管理,数据的插入、修改和检索均要通过数据库管理系统进行。数据管理员负责创建、监控和维护整个数据库,使数据能被任何有权使用的人有效使用。

                            

    二、mysql的管理

    2.1 安装

    linux:

    --yum -y install mariadb mariadb-server
    OR
    --yum -y install mysql mysql-server

    win:

    --http://dev.mysql.com/downloads/mysql/ 

    启动

    --service mysqld start  #开启
    --chkconfig mysqld on   #设置开机自启
    OR
    --systemctl start mariadb
    --systemctl enable mariadb

    查看

    -- ps aux |grep mysqld    #查看进程
    -- netstat -an |grep 3306 #查看端口

    设置密码

    -- mysqladmin -uroot password '123'   #设置初始密码,初始密码为空因此-p选项没有用
    -- mysqladmin -u root -p123 password '1234' #修改root用户密码

    登录

    -- mysql               #本地登录,默认用户root,空密码,用户为root@127.0.0.1
    -- mysql -uroot -p1234 #本地登录,指定用户名和密码,用户为root@127.0.0.1
    -- mysql -uroot -p1234 -h 192.168.31.95 #远程登录,用户为root@192.168.31.95

    2.2 mysql的常用命令

    复制代码
    -- 
    -- 启动mysql服务与停止mysql服务命令:
    -- 
    -- net start mysql
    -- net stop  mysql
    -- 
    -- 
    -- 登陆与退出命令:
    -- 
    --    mysql -h 服务器IP -P 端口号 -u  用户名 -p 密码 --prompt 命令提示符  --delimiter 指定分隔符
    --    mysql -h 127.0.0.1 -P 3306 -uroot -p123
    --    quit------exit----q;
    -- 
    -- C:ProgramDataMySQLMySQL Server 5.7
    -- s;   ------my.ini文件:[mysql] default-character-set=utf8 [mysqld] character-set-server=utf8-- 
    -- prompt 命令提示符(D:当前日期 d:当前数据库  u:当前用户)
    -- 
    -- T(开始日志) 	(结束日志)
    -- 
    -- show warnings;
    -- 
    -- help() ? h
    -- 
    -- G;
    -- 
    -- select now();
    -- select version();
    -- select user;
    -- 
    -- c 取消命令
    -- 
    -- delimiter 指定分隔符
    复制代码

    示例:

    忘记密码怎么办?

    方法1:启动mysql时,跳过授权表

    复制代码
    [root@controller ~]# service mysqld stop
    [root@controller ~]# mysqld_safe --skip-grant-table &
    [root@controller ~]# mysql
    mysql> select user,host,password from mysql.user;
    +----------+-----------------------+-------------------------------------------+
    | user     | host                  | password                                  |
    +----------+-----------------------+-------------------------------------------+
    | root     | localhost             | *A4B6157319038724E3560894F7F932C8886EBFCF |
    | root     | localhost.localdomain |                                           |
    | root     | 127.0.0.1             |                                           |
    | root     | ::1                   |                                           |
    |          | localhost             |                                           |
    |          | localhost.localdomain |                                           |
    | root     | %                     | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
    +----------+-----------------------+-------------------------------------------+
    mysql> update mysql.user set password=password("123") where user="root" and host="localhost";
    mysql> flush privileges;
    mysql> exit
    [root@controller ~]# service mysqld restart
    [root@controller ~]# mysql -uroot -p123
    复制代码

    方法2(删库):

    删除与权限相关的库mysql,所有的授权信息都丢失,主要用于测试数据库或者刚刚建库不久没有授权数据的情况(从删库到跑路)
    [root@controller ~]# rm -rf /var/lib/mysql/mysql
    [root@controller ~]# service mysqld restart
    [root@controller ~]# mysql

    sql及其规范

    sql是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。

    在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持sql。

    <1> 在数据库系统中,SQL语句不区分大小写(建议用大写) 。但字符串常量区分大小写。建议命令大写,表名库名小写;

    <2> SQL语句可单行或多行书写,以“;”结尾。关键词不能跨多行或简写。

    <3> 用空格和缩进来提高语句的可读性。子句通常位于独立行,便于编辑,提高可读性。

    1
    2
    SELECT * FROM tb_table
                WHERE NAME="YUAN";

    <4> 注释:单行注释:--

                   多行注释:/*......*/

    <5>sql语句可以折行操作

    <6> DDL,DML和DCL

    复制代码
    -- --SQL中 DML、DDL、DCL区别 .
    -- 
    -- 
    -- -- DML(data manipulation language):
    --    它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的
    --    数据进行操作的语言
    -- 
    -- -- DDL(data definition language):
    --    DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)
    --    的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
    -- 
    -- -- DCL(Data Control Language):
    --    是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)
    --    语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权
    --    力执行DCL
    复制代码

    2.3 数据库操作(DDL)

    复制代码

    -- 1.创建数据库(在磁盘上创建一个对应的文件夹)
    create database [if not exists] db_name [character set xxx] 

    -- 2.查看数据库
    show databases;查看所有数据库
    show create database db_name; 查看数据库的创建方式

    -- 3.修改数据库
    alter database db_name [character set xxx]

    -- 4.删除数据库
    drop database [if exists] db_name;

    -- 5.使用数据库
    切换数据库 use db_name; -- 注意:进入到某个数据库后没办法再退回之前状态,但可以通过use进行切换
    查看当前使用的数据库 select database();

    复制代码

    示例:

    复制代码
    查看时间
    select now();
    
    注释:--
    多行注释:/*....*/
    
    DDL:数据库操作
    DML:
    DCL:权限
    
    查看表
    mysql> select host,user from user;
    
    #查看数据库
    show databases;
    
    #删除数据库
    drop database 数据库名;
    
    #创建数据库
    mysql> create database s3;
    Query OK, 1 row affected (0.00 sec)
    
    #创建数据库,如果已经存在,就不创建s3,如果没有就创建。
    mysql> create database if not exists s3;
    Query OK, 1 row affected, 1 warning (0.00 sec)
    
    #查看错误信息
    mysql> show warnings;
    +-------+------+---------------------------------------------+
    | Level | Code | Message                                     |
    +-------+------+---------------------------------------------+
    | Note  | 1007 | Can't create database 's3'; database exists |
    +-------+------+---------------------------------------------+
    1 row in set (0.00 sec)
    
    #查看创建表信息
    mysql> show create database s3;
    +----------+---------------------------------------------------------------+
    | Database | Create Database                                               |
    +----------+---------------------------------------------------------------+
    | s3       | CREATE DATABASE `s3` /*!40100 DEFAULT CHARACTER SET latin1 */ |
    +----------+---------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    #创建s4数据库,指定字符编码:gbk
    mysql> create database if not exists s4 character set gbk;
    Query OK, 1 row affected (0.00 sec)
    
    
    #修改数据库编码方式utf8
    mysql> alter database s4 character set utf8;
    Query OK, 1 row affected (0.00 sec)
    
    
    #进入数据库,创建表
    
    #切换数据库 use
    mysql> use s4;
    Database changed
    
    #查看在那个数据库里
    mysql> select database();
    +------------+
    | database() |
    +------------+
    | s4         |
    +------------+
    1 row in set (0.00 sec)
    
    
    #查看帮助
    mysql> help
    
    #查看命令帮助
    mysql> help tinyint
    
    #查看命令帮助
    mysql> ? tinyint
    Name: 'TINYINT'
    Description:
    TINYINT[(M)] [UNSIGNED] [ZEROFILL]
    
    A very small integer. The signed range is -128 to 127. The unsigned
    range is 0 to 255.
    
    URL: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
    复制代码

    2.4 mysql数据类型

    MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

    数值类型

    下面的表显示了需要的每个整数类型的存储和范围。

    日期和时间类型

    表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

    每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

    字符串类型

    字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

    CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

    BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。

    BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

    有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

    三、数据表操作

    3.1 数据库操作

    复制代码

    创建:
    create database db_name;
    create database db_name default charset utf8;

    删除

    drop database db_name;

    进入库

    use_db_name

     3.2 表操作

    单表:

    1. 列名
    2. 数据类型
    3. 是否可以问空(null,not null)
    4. 默认值(default 1)
    5. 自增(auto_increment) 一个表只能有一个自增列
    6. 主键(primary key)
    约束:数据不能为空、数据不能重复。
    索引:加速查找(B树结构)
    7. 外键:
    对某列数据的内容进行约束。
    约束:只能是某个表中某列已经存在的数据。
    constraint 约束名称 foregin key(deparment_id) references dep_info(id)
    含外键的关系成为1对多。

    CREATE TABLE user_info (   -- 表名
    	id INT NOT NULL auto_increment PRIMARY KEY,  
    	NAME CHAR (20),
    	age INT,
    	gender CHAR (1)
    ) ENGINE = INNODB DEFAULT charset = utf8;
    
    INSERT INTO user_info (NAME, age, gender)
    VALUES('alex', 19, '男');
    

    多对多:(关系表)

    CREATE TABLE boy (
    	id INT NOT NULL auto_increment PRIMARY KEY,
    	NAME CHAR (32)
    ) ENGINE = INNODB DEFAULT charset = utf8;
    
    CREATE TABLE girl (
    	id INT NOT NULL auto_increment PRIMARY KEY,
    	NAME CHAR (32)
    ) ENGINE = INNODB DEFAULT charset = utf8;
    
    CREATE TABLE b2g (
    	id INT NOT NULL auto_increment PRIMARY KEY,
    	b_id INT,
    	g_id INT,
    	CONSTRAINT 约束名称1 foregin KEY (b_id) REFERENCES boy (id),
    	CONSTRAINT 约束名称2 foregin KEY (g_id) REFERENCES girl (id)
    ) ENGINE = INNODB DEFAULT charset = utf8;
    

    删除表

    清空表:
    delete from table_name  --> 自增列会继续之前的ID
    truncate table table_name  --> 物理删除,速度快,重新计算ID
    删除某一条:
    delete from table_name where filed = values and/or ...  --> 只删除符合条件的数据
    delete from table_name where filed in (1,2,3,4)  
    delete from table_name where id between 5 and 10 
    删除表结构
    drop table table_name;
    

    插入数据

    insert into  table_name(field) values(value),(value2)  --> 两个(value)表示插如多行数据
    insert into  table_name(cname) select field from table_name  -->  把select查到的结果,当作数据来赋值给value
    

    修改数据

    update table_name set field = 'value'  --> 更新所有数据的field字段的值,加 where 只修改匹配到的行
    update table_name set id = 8 , name = 'daxin' where age = 18;
    

    查询 

    select * from table_name where id > 2
    select field as '别名' from table_name  --> 加别名
    select * from table_name where id in (1,2)
    select * from table_name where cid in (select tid from teacher) ——>in后边括号里只能查询条件唯一的值

    条件:
    select * from table_name order by field asc/desc(正序/倒序)
    select * from table_name order by field asc limit 1 取第一个值
    select * from table_name limit 1,2(起始位置,找几个)
    select * from table_name where field like '%key%' --> 查找field字段包含key的数据
    % 表示任意个任意字符, _表示任意一个字符
    分组:
    select * from table_name group by field --> 分组显示,会去重,需要使用聚合函数来统计重复的次数
    select field,count(id) from table_name group by field --> 对id字段进行聚合(其他的还有min(),max(),sum(),avg()等)
    例子:
    1、获取每个班级多少人
    SELECT class.caption,count(sid) from class
    LEFT join student on student.class_id = class.cid
    group by class.caption
    2、获取每个班级有多少人并且选出认识大于2的班级,
    注意:如果针对 group by 的结果进行筛选,那么需要使用 having 不能在使用 where 了.
    SELECT class.caption,count(sid) as number from class
    LEFT join student on student.class_id = class.cid
    group by class.caption
    HAVING number >= 2
    3、每个课程的不及格的人数。
    select course.cname,count(sid) from score
    left join course on score.corse_id = course.cid
    where number < 60
    group by course.cname

    连表:
    select student.sid,student.sname,class.caption from student LEFT JOIN class on student.class_id = class.cid ;
    把class表中的字段放在student表的左边,并且进行 student.class_id = class.cid 匹配后显示,数据量以from指定的表为基准
    left join:
    以 from 指定的表为基准,对数据进行显示
    right join: -->不常用
    以 join 后面的表为基准进行显示。
    inner join:(join 使用的就是)
    只保留连个表中都有数据的条目
    例子:
    1、id=1的老师任教的课程名称
    2、老师姓名瞎猫任教的课程命令
    3、已选课程id=1,所有学生的姓名
    4、已选体育课,所有学生的姓名
    5、已选波多任教任意课程,所有学生姓名

    union:
    把两个SQL的结果进行组合(上下合并)
    select * from student
    union / union all
    select * from teacher;
    注意上下两个表中的列数要统一
    注意:
    1、如果所有数据都一致,那么union会对结果进行去重
    2、union all ,会保存所有的

    MySQL的扩展:wupeiqi 博客 

     

    3.3 表设计应用场景

    应用场景:
        1、根据具体业务
        2、HTML的场景
            创建的时候只需要输入数据的情况下:单表
            创建的时候必须要我们选择一个其他数据的场景下:一对多
            创建的时候针对某些字段可以进行多选的情况下:多对多
    

      

     

      

  • 相关阅读:
    微信小程序HTTPS
    微信商城-1简介
    va_list
    Event log c++ sample.
    EVENT LOGGING
    Analyze Program Runtime Stack
    unknow table alarmtemp error when drop database (mysql)
    This application has request the Runtime to terminate it in an unusual way.
    How to check if Visual Studio 2005 SP1 is installed
    SetUnhandledExceptionFilter
  • 原文地址:https://www.cnblogs.com/hanjialong/p/7154933.html
Copyright © 2011-2022 走看看