MySQL数据库的使用

服务器端安装

                1.sudo apt-get install mysql-server

                2.sudo service mysql start 启动mysql服务器

                3.ps aux|grep mysql 查看进程中是否有mysql服务

                  4.sudo service mysql stop  停止服务

                   5.sudo service mysql restart  重启服务


配置

              1.配置文件目录/etc/mysql/mysql.cnf

              2. 进入mysql.conf.d目录,打开mysql.cnf可以看到配置

               3.主要配置:

                                1. bind-address:表示服务器绑定的ip,默认为127.0.0.1

                                  2.port表示端口,默认为3306

                                   3.datadir表示数据库目录,默认为/var/lib/mysql

                                    4.general_log_file表示普通日志,默认为/var/log/mysql/mysql.log

                                     5.log_error表示错误日志,默认为/var/log/mysql/error.log


客户端安装

                        1.sudo apt-get install mysql-client

                         2.mysql -u+用户名 -p+密码

数据类型

                    1.使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间

                    2.常用数据类型:

                                    1.整型:int,bit 默认有正负,不想有负值添加约束unsigned

                                    2.小数:decimal 表示浮点数,如decimal(5,2)表示共用5位数,小数占2位

                                    3.字符串:varchar,char text  char表示固定长度的字符串,如char(3),如果填充'ab'时会补充一个空格为'ab '    varchar表示可变长度的字符串,如varchar(3),填充'ab'时就会存储'ab'  字符串text表示存储大文本,当字符大于4000时推荐使用

                                    4.日期时间:date,time,datetime

                                    5.枚举类型(enum)

                     3.对于图片,音频,视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径


约束

            1.主键primary key:物理上存储的顺序

             2.非空not null:此字段不允许填写空值

             3.唯一unique:此字段的值不允许重复

              4.默认default:当不填写此值时会使用默认值。如果填写时填写为准

              5.外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失效并抛出异常


MySQL数据库的操作

                        1.select version();显示当前数据库版本

                         2.select now();显示时间

                         3. show databases;查看所用数据库

                          4.create database 数据库名字 charset=utf8;创建数据库

                           5.show create database 数据库名字;查询数据库的创建语句

                            6.drop database 数据库名字;删除数据库

                             7.select database();查看当前使用的数据库

                              8.use 数据库名字;使用指定数据库


MySQL数据表的操作

1.show tables;显示当前数据库中所有的表

2.create table 表名字(字段1 类型1 约束,字段2 类型2 约束,...);创建表

        例如:create table students(

                                                id int unsigned not null auto_increment primary key,

                                                name varchar(30),

                                                age tinyint unsigned default 0,

                                                high decimal(5,2),

                                                gender enum("男","女","中性","保密") default "保密",

                                                cls_id int unsigned);


3.desc 表名字;查看表的创建结构

4.show create table 表名字;查看表的创建语句

5.alter table 表名 add 字段 类型;给表添加新字段

        例如:alter table students add birthday datetime;

6.alter table 表名 change 原名 新名 类型及约束;修改字段并且重新命名

         例如:alter table students change birthday birth datetime not null;

7.alter table 表名 modify 字段 类型及约束;修改字段并且不重新命名

         例如:alter table students modify birth date not null;

8.alter table 表名 drop 字段;删除字段

        例如:alter table students drop birthday;

9.drop table 表名;删除表


MySQL数据表的增删改查(curd)

增加

    1.全部插入:insert into 表名 values (有多少字段,就写多少字段,且顺序一一对应);

    2.部分插入:insert into 表名 (字段1,字段2...) values (值1,值2...);

        例如:insert into students (name,gender) values ('小红',2);枚举中的下表是从1开始

    3.多行插入:insert into 表名 (字段1,字段2...) values (值1,值2...),(值1,值2...)...;部分多行插入

                       insert into 表名 values (有多少字段,就写多少字段,且顺序一一对应),(有多少字段,就写多少字段,且顺序一一对应)... ;全部多行插入

修改

    update 表名 set 字段1=值1,字段2=值2... where 条件;

删除

    1.delete from 表名 where 条件;物理删除

    2.逻辑删除:用一个字段表示这条信息是否已经不再使用

        例如:alter table students add is_delete bit default 0;若删除某条信息,则把is_delete的值改为1;update students set is_delete=1 where id=6;

查找

    1.select * from 表名;查询所有字段

    2.select 字段1,字段2... from 表名;查询指定字段

    3.select 字段1,字段2... from 表名 where 条件;查询指定条件的指定字段

    4.select distinct 字段 from 表名;distinct消除重复行

    5.select 字段1 as 别名1,字段2 as 别名2 from 表名 where 条件;使用as给字段起别名

    6.select 字段2 as 别名2 ,字段1 as 别名1 from 表名 where 条件;修改字段显示顺序


MySQL的查询(实际开发中用的最多的)

条件查询

        1.比较运算符:>,<,>=,<=,=,!=不等于

        2.逻辑运算符:and,or,not

        3.模糊查询:

                            1.like %替换1个或者多个;_替换1个

        例如:查询姓名中以"小"开始的名字

            select name from students where name like "小%";

          例如:查询姓名中包含"小"的名字

            select name from students where name like "%小%";

             例如:查询有2个字的名字

            select name from students where name like "__";

            例如:查询至少2个字的名字

              select name from students where name like "__%";      

                             2.rlike 正则

                例如:查询以周开头的姓名

                select name from students where name rlike "^周.*";

                例如:查询以周开头,伦结尾的姓名

                  select name from students where name rlike "^周.*伦$";

范围查询

        1.in(1,3,8)表示在一个非连续的范围内

            例如;查询年龄为12,18,34的姓名

            select name,age students where age in (12,18,34);

        2.not in(1,3,8)表示不在一个非连续的范围内

                例如;查询年龄不在12,18,34的姓名

                select name,age students where age not in (12,18,34);

        3.between ... and ...表示在一个连续的范围内

                    例如:查询年龄再18到34之间的信息

                    select name,age from students where age between 18 and 34;

        4.not between ... and ...表示不在一个连续的范围内

                      例如:查询年龄不再18到34之间的信息

                        select name,age from students where age not between 18 and 34;

        5.is null 空判断

                         例如:查询身高为空的信息

                            select * from students where height is null;

        6.is not nll 判断非空

                            例如:查询身高为不为空的信息

                            select * from students where height is not null;

排序

            1.order by 字段,asc从小到大排序(默认),desc从大到小排序

                    例如:查询年龄再18到34岁之间的男性,并且按照年龄从小到大排序

                    select * from students where (age between 18 and 34 ) and gender = 1 order by age asc;

                    例如:查询年龄再18到34岁之间的男性,并且按照年龄从大到小排序

                     select * from students where (age between 18 and 34 ) and gender = 1 order by age desc;

                2.order by 多个字段

                        例如:查询年龄再18到34岁之间的女性,身高从高到矮排序,如果身高一样的情况下按照年龄从小到大排序

                        select * from students where (age between 18 and 34) and gender=2 order by height desc,age asc;

                        例如:按照年龄从小到大,身高从高到矮排序

                        select * from students order by age asc,height desc;

聚合函数

            1.总数:count

                例如:查询男性人数有多少

                select count(*) as 男性人数 from students where gender=1;

            2.最大值:max

                例如:查询最大年龄

                select max(age) from students;

                 例如:查询女性的最高身高

                select max(height) from students where gender=2;

            3.最小值:min       

            4.求和:sum

                例如:查询所有人的年龄总和

                   select sum(age) from students;

            5.平均值:avg

                   例如:计算平均年龄

                    select avg(age) from students;

                    例如:计算平均年龄

                    select sum(age)/count(*) from students;

            6.四舍五入:round(123.123,1)保留1为小数

                    例如:计算平均年龄,保留2为小数

                    select round(avg(age),2) from students;

分组

        1.group by        

              例如:按照性别分组,查询所有的性别

               select gender from students group by gender;

                例如:计算每种性别的人数

                 select gender,count(*) from students group by gender;

                 例如:计算男性的人数

                 select gender,count(*) from students where gender=1 group by gender;

        2.group_concat(...) 查看组里面的信息

                例如:查看同种性别中的姓名

                select gender,group_concat(name,'_',age,'_',id) from students where gender=1 group by gender;

          3.having

              例如:查询平均年龄超过30岁的性别,以及姓名

              select gender group_concat(name,avg(age)) from students group by gender having avg(age) > 30;

            例如:查询每种性别中的人数多于2个的信息

              select gender group_concat(name) from students group by gender having count(*) > 2;

分页

        1.limit start, count    start表示起始的下表,count表示查询的总数 (查询时limit放于最后面)

            例如:限制查询个数

            select * from students where gender=1 limit 2;

            例如:查询前5个数据

            select * from students limit 0,5;

连接查询

            1.内连接查询:查询的结果为两个表匹配的数据 (inner join ... on)

            2.右连接查询:查询的结果为两个表匹配到的数据,右表特有的数据,对于左表中不存在的数据使用null填充 (right join ... on)

            3.  左连接查询:查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充 (left join ... on)  

            例如:查询有能够对应班级的学生以及班级信息

            select * from students inner join classes on students.cls=classes.id;

            例如:按照要求显示姓名,班级

            select students.name,classes.name from students inner join classes on students.cls=classes.id;

              select s.name,c.name from students as s inner join classes as c on s.cls=c.id;

           例如:查询没有对应班级信息的学生

            select * from students as s left join classes as c on s.cls_id=c.id having c.id is null;

                    select * from students as s left join classes as c on s.cls_id=c.id where c.id is null;

自关联

            例如:查询出山东省有哪些市

            select * from areas as province inner join areas as city on city.pid=province.aid having province.atitle='山东省';

子查询

        一个select语句中嵌入另一个select语句

        例如:查询最高的男生信息

        select * from students where height = (select max(height) from students);

数据库设计

三范式

第一范式(1NF): 强调的是列的原子性,即列不能够分成其他几列

第二范式(2NF):首先是1NF,另外包含两部分内容,一是表必须有一个主键,二是没有包含在主键中的列必须完全依赖于主键,而不是只依赖于主键的一部分

第三范式(3NF):首先是2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖,即不能存在:非主键列A依赖于非主键列B,非主键B依赖于主键的情况

外键

        alter table goods add foreign key (cate_id) references goods_cates(id); 添加外键

        实际开发的时候很少使用外键,因为会降低表更新的效率

        alter table goods drop foregin key 外键名; 删除外键(用show create table goods查看外键名字)

MySQL与Python交互

                    1.先下载pymysql:pip install pymysql

                     2.然后导入pymysql:from pymysql import *

                    3.创建Connection连接:conn = connect(host=连接ip,port=端口号,user=用户名,password=密码,database=数据库名,charset='utf8')

                    4.获取Cursor对象:cs1 = coon.cursor()

                    5.执行sql语句:cs1.execute('sql语句')  例如:cs1.execute("select * from goods;") 执行成功会返回生效的行数,再用cs1.fetchone(),查看每一条数据,以元组的形式返回,或者cs1.fetchmany(n),返回n行信息,返回的是元组,或者cs1.fetchall(),返回所有

                    6.关闭,先关闭cursor,再关闭connect:cs1.close(),conn.close()

                    7.对数据的增删改的时候,在结束时要用conn.commit()提交,否则无法进行操作,在commit之前若后悔,则可以用conn.rollback()退回去

SQL注入

            防止SQL注入的方法

            find_name= input('请输入商品名:')

            sql = "select * from goods where name=%s"

            cursor.execute(sql,[find_name]) 利用execute函数自己拼接去防止sql注入

京东商品查询小程序

视图

        视图就是一条select语句运行后返回的结果集,视图是对若干张基本表的引用,一张虚表,查询语句执行的结果

        定义视图

                create view 视图名  as select语句

                例如:create view goods_info as select g.*,c.name as cates_name,b.name as brands_name from goods as g left join goods_cates as c on g.cate_id = c.id left join goods_brands as b on g.brand_id = b.id;

        查看视图

                show tables

        使用视图

                    视图的用途就是查询

                    select * from goods_info;

          删除视图

                    drop view 视图名称;

                    drop view goods_info;

           视图的作用

                    1.提高了重用性,就像一个函数

                    2.对数据库重构,却不影响程序的运行

                    3.提高了安全性能,可以对不同的用户

                    4.让数据更加清晰

事务

         事务就是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位

        事务四大特性(简称ACID)

            原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)

        开启事务:start transaction或者begin

        提交事务:commit

        回滚事务:rollback

索引

        索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针

        更通俗的讲,数据库索引好比是一本书前面的目录,能加快数据库的查阅速度

        创建索引

           create index 索引名 on 表名(字段(n));如果字段属性是字符串,就要写字符串长度

         查看索引

             show index from test_index;

           删除索引

                drop index 索引名称 on 表名

        注意:建立太多索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件,对于一个经常需要更新和插入的表格,就没必要建立索引,对于较小的表,排序开销不会很大,也没比要建立索引,建立索引占用磁盘空间

        

                  

      




       

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容