码迷,mamicode.com
首页 > 数据库 > 详细

数据库 - Mysql基础

时间:2020-02-18 14:40:41      阅读:30      评论:0      收藏:0      [点我收藏+]

标签:ons   外键   信息   having   增加   连接   效率   快捷   区分   

关系型数据库(MySQL)

在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一

python连接mysql

conn = pymysql.connect(host=‘root‘)
port=3306,user=‘root‘
passwd=‘1234‘,db=‘user‘,charset=‘utf8mb4‘ # 声明mysql连接对象
cursor=conn.cursor(cursor=pymsql.cursors.DictCursor) # 查询结果以字典的形式
cursor.execute(sql语句字符串) # 执行sql语句
conn.close() # 关闭链接

 

mysql基础

1.安装

         linux中:

                   1.sudo apt-get install mysql-server

                   2.修改配置文件

                   3.启动:sudo service mysql start(重启->restart)

                   4.查看进程中是否有:ps ajx | grep mysql

                   5.停止:sudo service mysql stop

                   6.mysql命令行的安装:mysql命令行的安装:sudo apt-get install mysql-client

         Windows中:

                   1.下载mysql 5.7.msi

                   2.更改系统环境变量

                   3.更改配置文件

                   4.首先打开mysql服务器

                   5.开启mysql服务:net start mysql

2.配置环境

         本机mysql

                   Windows中修改初始密码

                            命令为:mysql -u root -p;

                            use mysql

                            updata user set

                            authentication_string=password("123456")

                            where user="root";

                            flush privileges;

                            updata user set password_expired="N"where

                            user="root"              再次启动:mysql -u root -p

                   建立用户

                            本地登录:create user “u1"@"localhost"indentified by"123“;

                            任意都可以登录:create user ”u2“@”%“identified by "123"

                            具体主机登录:create user ”u4“@”172.16.12.24“identfied by "123";

         Navicat

                   使用步骤

                            1.连接本机的mysql

                            2.先创建数据库

                            3.再创建表

3.表的增删改查

         0.数据库操作

                   创建数据库:create database testdb2 charset utf8;

                   展示数据库:show databases

         1.增加

                   为当前表增加一个字段:alter table stu add gender char(4);

                   增加数据:insert into 表名values(0,"测试");

         2.删除

                   1.drop

                            删除整张表:drop table 表明;

                            删除表中的列:alter table 表名 drop column 列名;

                   2.delete

                            删除表里的所有数据:delete from 表名;

                            删除表里的一条数据:delete from 表名 where id=1

                   3.truncate

                            删除所有数据:truncate table 表名

                   4.删除总结

                            彻底删除一张表:drop

                            删除一张表的记录,保留该表:truncate

                            删除一张表的所有数据:delete

                            (truncate是释放数据页,包括记录,而delete每删除一行需要在日志中记录一行)

         3.修改

增加一个字段:alter table 表名 add 字段名 字段类型(alter table user add image varchar (100) comment "图片路径”after birthday)

                   修改表名:alter table 表名 rename to 新的表名

                   修改列名:alter table 表名 change 字段 新字段名 类型

                   update:update表set列where列条件;是对表内的数据进行操作

                   update和alter的区别:alter是指修改表的结构,update修改表的数据

4.查询

         单表查询

                   查询该表的所有值:select * from 表名

                   使用as给字段起别名:select column as 别名 from 表名

                   按某种条件进行查询:select * from 表名 where 条件

                   范围查询,in里面是范围:select * from students where id in(数字)

                   查询某字段信息,按升序or降序排列:select 列名 from 表名 order by 字段名 asc|desc;

                   聚合函数:

                            查询学生总数:select count(*)from students;

                            查询此列的和:select sum(字段名)from 表名 where 条件

                            查询某条件下某字段的平均值:select avg (字段名) from 表名 where 条件

                   分组+聚合:

                            查询当前性别的种类并进行分组:select gender from students group by gender;

                            查询结果并将每个集合进行分组:select gender,group_concat(name)from student

                            分别统计性别为男/女的人平均年龄数:select gender,avg(age) from students group by gender;

                            查询性别总数>2的数量并进行分组:select gender,count(*) from student group by gender having count(*)>2;

                   查询前3行男生信息:select * from students where gender=1 limit 0,3;

         多表查询

                   交叉连接:

                            获得的是两个表的笛卡尔积:select * from A,B

                   内连接:

                            显式内连接:select * from A inner join B on 条件;

                            隐式内连接:select * from A,B where 条件;

                            实例:使用内连接查询班级表与学生表,取AB得交集- select * from students inner join classes on students.cls_id = classes.id;

                   左连接:

                            通式:select * from A left join B on A.id = B.user_id

                            实例:select * from students as s left join classes as c on s.cls_id = c.id

                   右连接:

                            通式:select * from A right join B on A.id = B.user_id

                            实例:select * from students as s right join classes as c on s.cls_id = c.id;

5.数据库优化方案

         1.避免使用select*

         2.固定长度在前面

         3.内存代替表,如:性别等

         4.读写分离

         5.分库

         6.分表-水平分表-垂直分表

         7.命中索引

         8.组合索引代替索引合并

         9.尽量使用短索引

         10.如果取一条数据时,使用limit 1:select id , name from tb where name = "limit 1"

         11.禁止使用子查询,遇到使用子查询的情况,尽量使用join代替

         12.避免使用大事务,使用短小的事务

         13.减少锁等待和竞争

        

$$数据库高级

         视图

                   简单来说,视图就是呈现给用户数据的一个虚拟表,只能查看,不会对原表产生任何影响

         触发器

                   触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助,应用在数据库端确保数据的完整性。

                   触发器中的两个限制:

                            触发程序不能调用将数据返回客户端的存储程序,但是允许存储程序通过参数将数据返回触发程序;

                            不能在触发器中使用以显式和隐式方式开始或结束事务的语句;

                                     显示:用COMMIT命令直接完成的提交为显式提交

                                     隐式:用SQL命令完成的提交为隐式提交

                   执行过程:

                            触发器是行触发的,每次增加,修改都会触发进行处理,所以尽量少编写复杂的触发器,能提升性能优化

         事务

                   事务的概念:事务是一组不可分被分割的SQL语句集合,如果有必要,可以撤销

                   事务的四大特性:

                            原子性(atomicity):事务是由一个或一组相互关联的SQL语句组成,这些语句被认为是一个不可分割的单元;

                            一致性(consistency):对于数据库的修改是一致的,即多个用户查的数据是一样的;

                            隔离性(isolation):事务之间不会相互影响;

                            持久性(durability):提交了这个事务之后对数据的修改更新就是永久的,即事务执行成功后必须全部写入磁盘;

         索引

                   定义:每个表至少支持16个索引,总索引长度至少为256字节。大多数存储引擎有更高的限制。

                            一个表的索引,就好比一本书的目录,有了目录,查询速度自然会大大加快。

                   搜索的索引列,不一定是所要选择的列:意思是说,如果索引在where子句后,会比select关键字的选择列表中要好很多;

                   使用唯一索引:索引的列的基数越大,索引的效果越好,例如:存放出生日期的列具有不同值,很容易区分各行;

                   使用短索引:如果对字符串列进行索引,应该制定一个前缀长度,这样搜索起来更快捷;

                   使用最左前缀:在创建一个n列的索引时,实际是创建了MySQL可利用的n个索引。

                            多列索引可起几个索引的作用,因为可利用索引中最左边的列集来匹配行。这样的列集称为最左前缀。

                   不要过度索引

         存储过程:定义;是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,经由用户调用;

Mysql的语法规范

²  不区分大小写

²  每条命令分号结尾;

²  命令根据需要进行缩进或换行;

²  注释:#注释文字(单行);--注释;多行注释:/注释文件/;

²  mysql配置文件,my.ini(如果改了配置文件需要重启服务)

创建数据库并插入数据

创建一个名为 mysql_shiyan 的数据库,其中有两张表 employee和 department

准备:在Linux系统上配置好Mysql,打开MySQL并使用root登录

# 打开 MySQL 服务
sudo service mysql start
#使用 root 用户登录,密码为空
mysql -u root

新建数据库:

# 创建数据库
CREATE DATABASE mysql_shiyan;
# 查看数据库
show database;

连接使用数据库:

# 使用数据库
use mysql_shiyan;
# 查看数据库中有几张表
show table

新建数据表:

# 新建一张表 employee,包含ID,姓名 和电话信息
CREATE TABLE employee (id int(10),name char(20),phone int(12));

插入数据:

# 通过 INSERT 语句向表中插入数据,语句格式为:
INSERT INTO 表的名字(列名a,列名b,列名c) VALUES(值1,值2,值3);
# 向 employee 中加入 Tom、Jack 和 Rose
INSERT INTO employee(id,name,phone) VALUES(01,‘Tom‘,110110110);
INSERT INTO employee VALUES(02,‘Jack‘,119119119);
INSERT INTO employee(id,name) VALUES(03,‘Rose‘);

有的数据需要用单引号括起来,比如 Tom、Jack、Rose 的名字,这是由于它们的数据类型是 CHAR 型。此外 VARCHAR,TEXT,DATE,TIME,ENUM 等类型的数据也需要单引号修饰,而 INT,FLOAT,DOUBLE等则不需要。

第一条语句比第二条语句多了一部分:(id,name,phone) 这个括号里列出的,是将要添加的数据 (01, ‘Tom‘, 110110110) 其中每个值在表中对应的列。而第三条语句只添加了 (id,name) 两列的数据,所以在表中Rose的phone为NULL。

CHAR 和 VARCHAR 的区别: \
CHAR的长度是固定的,而VARCHAR的长度是可以变化的,比如,存储字符串 “abc",对于 CHAR(10),表示存储的字符将占 10 个字节(包括 7 个空字符),而同样的 VARCHAR(12) 则只占用4个字节的长度,增加一个额外字节来存储字符串本身的长度,12 只是最大值,当你存储的字符小于 12 时,按实际长度存储。
ENUM和SET的区别: ENUM类型的数据的值,必须是定义时枚举的值的其中之一,即单选,而SET类型的值则可以多选。  

 

RDBMS

即关系数据库管理系统(RelationalDatabaseManagementSystem)的特点:

1、数据以表格的形式出现

2、每行为各种记录名称

3、每列为记录名称所对应的数据域

4、行和列组成一张表单

5、若干的表单组成database

[client]#设置mysql客户端默认字符集

default-character-set=utf8

[mysqld]

port=3306#设置3306端口

basedir=C:\\web\\mysql-8。0。11#设置mysql的安装目录

#设置mysql数据库的数据的存放目录,MySQL8+不需要以下配置,系统自己生成即可,否则有可能报错

#datadir=C:\\web\\sqldata

max_connections=20#允许最大连接数

character-set-server=utf8#服务端使用的字符集默认为8比特编码的latin1字符集

default-storage-engine=INNODB#创建新表时将使用的默认存储引擎

日期和时间

类型

大小(字节)

范围

格式

用途

DATE

3

1000-01-01/9999-12-31

YYYY-MM-DD

日期值

TIME

3

‘-838:59:59‘/‘838:59:59‘

HH:MM:SS

时间值或持续时间

YEAR

1

1901/2155

YYYY

年份值

DATETIME

8

1000-01-0100:00:00/9999-12-3123:59:59

YYYY-MM-DDHH:MM:SS

混合日期和时间值

TIMESTAMP

4

1970-01-0100:00:00/2038

YYYYMMDDHHMMSS

混合日期和时间值,时间戳

 

 

 

MYSQL存储引擎

InnoDB支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。

MyISAM插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。

MEMORY所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

MySQL查询优化

mysql查询优化,1万条数据30秒;

1、 表的主键、外键必须有索引;

2、 数据量超过300的表应该有索引;

3、 经常与其它表进行连接的表,在连接字段上应该建立索引;

4、 经常出现where子句中的字段,特别是大表的字段,应该建立索引;

5、 索引应该建在选择性高的字段上;

6、 索引应该建在小字段上,对于大的字段甚至超长字段,不要建索引;

7、 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替;

8、 频繁进行数据操作的表,不要建立太多的索引;

9、 删除无用的索引,避免对执行计划造成负面影响;

MySQL慢查询

MySQL的慢查询,全名是慢查询日志 ,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阈值的语句;

具体环境中,运行时间超过long_query_time的值的SQL语句,则会被记录到慢查询日志中。

long_query_time的默认值为10,意思是记录运行10秒以上的语句。默认不开启,调优时候开启,会对性能有一定影响,支持将日志文件写入文件和数据表。

 

数据库 - Mysql基础

标签:ons   外键   信息   having   增加   连接   效率   快捷   区分   

原文地址:https://www.cnblogs.com/qingaoaoo/p/12326072.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!