• MySQL入门


    1. mysql是一种常用的数据库管理软件,优点有:免费,开源,跨平台,本文只是介绍一下MySQL的简单操作

    2.数据库的基本结构

      可以把数据库理解成一个文件夹,数据库中的数据存放的单位是表,可以理解为excel表格,表格的表头称为字段,表中的每一条数据称为记录

      

    3.MySQL安装

      1.从官网下载 https://www.mysql.com/downloads/

      2.下载msi格式的文件,双击安装即可

      3.配置环境变量

      windows环境安装比linux简单的多,所以安装过程就不赘述

      4.安装好以后,打开命令提示行,输入mysql -uroot -pkey,(key为安装过程中设置的 密码),然后回车出现  mysql > ,就表示安装成功了

    4.sql语句规范

      sql是结构化查询语言的缩写。我们通过sql语句来操作数据库,下面是sql语句的一些书写规范

      1.sql语句不区分大小写,但是建议sql命令大写,自定义的库名表名之类小写

      2.sql语句支持分行,以分号结尾,关键词不能跨行

      3.用空格和缩进来提高语句可读性

      4.单行注释:--

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

      5.中括号里的内容表示 可有可无

    5.数据库简单操作

      1.创建数据库  CREATE DATABASE database_name;

       可以在创建数据库的时候指定编码集  CREATE DATABASE database_name CHARACTER SET utf8;

      2.删除数据库  DROP DATABASE database_name; 从删库到跑路

      3.查看已创建的数据库  SHOW DATABASES;

      4.查看数据库创建信息   SHOW CREATE DATABASE database_name;

      5.修改数据库字符集  ALTER DATABASE database_name CHARACTER SET utf8;

      6.使用数据库  USE database_name;    进入数据库后没有退出名令,但是可以继续用SHOW查看数据库并用USE切换到其他数据库

    6.表的简单操作

      使用数据库后执行的操作

      1.创建表  CREATE TABLE table_name(字段名称 字段数据类型  [约束],

                            字段名称 字段数据类型  [约束],    

                          字段名称 字段数据类型  [约束]

                          );

      2.查看所有表  SHOW TABLES;

       查看表的详细信息  DESC table_name;

       查看表的创建信息  SHOW CREATE TABLE table_name;

      3.增加列  ALTER TABLE table_name ADD 列名 类型 [完整性约束条件] [first|after 字段名];

        增加多列用逗号隔开

      4.修改 

       修改一列类型   ALTER TABLE table_name MODIFY 列名 类型  [完整性约束条件];

       修改列名    ALTER TABLE table_name CHANGE 列名 新名 类型 [约束条件];

       修改表名  RENAEM TABLE 表名 TO 新名;

       修改表的字符集  ALTER TABLE table_name CHARACTER SET utf8;

      5.删除 

       删除一列  ALTER TABLE table_name DROP 列名;

       删除表   DROP TABLE table_name;

       删除主键的自增长  ALTER TABLE table_name CHANGE id id int(10)

    7.约束条件

      创建表的时候,字段后面要加约束条件。常用的约束条件有:

      1.非空  not null

      2.唯一性 unique

      3.主键  primary key  如果一个字段设置了非空属性和唯一性约束,那么自动识别为主键

      4.自增  auto_increment  只有主键可以设置这个约束

       

    8.sql数据类型

    数值类型:  

    类型大小范围(有符号)范围(无符号)用途
    TINYINT 1 字节 (-128,127) (0,255) 小整数值
    SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
    MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
    INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
    BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
    FLOAT 4 字节 (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度
    浮点数值
    DOUBLE 8 字节 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度
    浮点数值
    DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

    时间类型:

    类型大小
    (字节)
    范围格式用途
    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-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
    TIMESTAMP 8 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

      

    字符串类型:

    类型大小用途
    CHAR 0-255字节 定长字符串
    VARCHAR 0-65535 字节 变长字符串
    TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
    TINYTEXT 0-255字节 短文本字符串
    BLOB 0-65 535字节 二进制形式的长文本数据
    TEXT 0-65 535字节 长文本数据
    MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
    MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
    LOGNGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
    LONGTEXT 0-4 294 967 295字节 极大文本数据

    9.表记录操作

      1.插入数据 insert

      INSERT [INTO] table_name (字段名称,,,) VALUES(值,,,),

                               (值,,,),

                                .......  

                               (值,,,);

      2.修改表记录

        UPDATE table_name SET 字段=值,字段=值....WHERE子句;

      3.删除表记录

        DELETE FROM table_name WHERE子句; 不加where子句的话会把整个表删除

        TRUNCATE TABLE table_name;  删除整个表

        delete和truncate的区别:

          1.语法不同

          2.delete后面可以加限制条件,选择删除某条记录,而truncate只能删掉整个表

          3.delete 可以返回删除的数据,但是truncate不能

          4.在删除整个表的时候,delete的原理是一条一条的删除,而truncate 的原理是把整个表删掉,再新建一个同样字段的表

           所以,如果表中有自增长的字段,delete删除之后,新的表是从上个位置开始自增的,但是truncate是从1开始

    10.表记录查询  select

    这个是最重要,也是最常用的

      1.单表查询

    SELECT [DISTINCT] *|field1,field,... from table_name where .... group by .... order by...[desc|asc]

         1.显示表的全部信息  SELECT * FROM table_name; 

            显示指定列的信息  SELECT 列,列.. FROM table_name;

            SELECT 后面可以跟 表达式 、distinct(表示去重)

         2.用WHERE子句进行过滤

           WHERE子句中可以使用:

            1.比较运算符  > < >= <= !=

            2.between .. and ..   在..和.. 之间

            3.in (a,b,c)         在a,b,c 这三个值中一个

            4.like  条件  eg: like "李%"  表示已“李”开头

                      like "李_"    表示以“李”开头,并且后面有一个字符,一个下划线代表一个字符

            5.逻辑运算符 and or not

         3.order by  表示以。。排序,排序的列可以是列名,也可以是设置的别名

            order语句后面可以跟两个模式,asc表示升序(默认),desc表示降序

         4.group by 表示以..分组,分组后只会显示每个字段的第一条记录,分组后的筛选用的关键字是having ,作用和 where一样,与where相比,having后面可以使用聚合函数

         5.聚合函数:

            1.avg() 求平均值

            2.count() 统计个数

            3.sum() 求和函数

            4.max(),min()  最大值最小值函数

         6.limit 关键字用来控制显示的条数,limit 1 表示只显示第一行,limit 2,5 表示显示第2到5行

         7.使用正则表达式

            

            

      2.多表查询

        1.外键

          如果两张表要创建联系,就需要使用到外键,需要考虑几种关系:一对一,多对多,和一对多

          1.一对多: 这种模型中,有主表和子表的区别,比如一个老师有多个学生,一个学生只能有一个老师,这种情况老师就是主表,学生就是子表,我们需要在子表中创建关联字段(外键)

            增加外键:[ADD CONSTRAINT name] FOREIGN KEY (字段名)REFERENCES table_name;

            删除外键:ALTER TABLE table_name DROP FOREIGN KEY name;

                  (这个name是增加外键时给外键起的名字,如果没有设置,从表的创建方式中可以找到)

          2.多对多:需要借助第三张表,在第三张表中创建两个外键

          3.一对一:这种实际就是外键加一个unique,很少用

          4. 一旦两张表建立了关联,就不能随便从表中删除记录了,必须解除关联后才能删

        2.内连接

          我们在查询表记录的时候,可以同时显示多张表的记录,类似

          select * from tableA,tableB 

          但是这样并不是我们想要的结果,当然我们可以在查询结果后面用where子句进行筛选,但更常用的是用内连接:

          select * from tableA inner join tableB on tableA.id = tableB.id

        3.外连接

          1.左外连接:在内连接的基础上增加左边有右边没有的结果

              select * from tableA left join tableB on tableA.id = tableB.id

          2.右外连接:在内连接的基础上增加右边有左边没有的结果

           select * from tableA right join tableB on tableA.id = tableB.id

      

    多表查询练习(代码通过navicat书写):

      1 -- 1.查询平均成绩大于八十分的同学的姓名和平均成绩
      2 -- SELECT sname,avg(num) from student INNER JOIN  score
      3 --                                 on student.sid = score.student_id
      4 --                                 GROUP BY student_id
      5 --                                 HAVING avg(num) >80
      6 
      7 -- 2、查询所有学生的学号,姓名,选课数,总成绩
      8 
      9 -- SELECT student.sid,sname,count(course_id),sum(num) from student
     10 --                     INNER JOIN score
     11 --                     on score.student_id = student.sid
     12 --                     GROUP BY student_id
     13 -- 3、查询没有报李平老师课的学生姓名
     14 
     15 -- SELECT sname from student WHERE sid not in (SELECT DISTINCT student_id from score WHERE course_id  in (SELECT cid from teacher
     16 --                                                                                     INNER JOIN course
     17 --                                                                                     on teacher.tid = course.teacher_id
     18 --                                                                                     WHERE tname like '李平%'))
     19 
     20 -- 4、查询物理课程比生物课程高的学生的学号
     21 -- SELECT * from
     22 --
     23 -- (SELECT * from    score WHERE course_id = (SELECT cid from course WHERE cname="物理")) as A
     24 --
     25 -- INNER JOIN
     26 --
     27 -- (SELECT * from    score WHERE course_id = (SELECT cid from course WHERE cname="生物")) as B
     28 --
     29 -- on A.student_id = B.student_id
     30 --
     31 -- WHERE A.num > B.num
     32 --
     33 -- 5、查询没有同时选修物理课程和体育课程的学生姓名
     34 
     35 -- SELECT sname from student where sid not in(SELECT student_id from score
     36 --                 WHERE course_id
     37 --                 in (select cid from course
     38 --                         WHERE cname
     39 --                         like "物理" or cname = "体育")
     40 --                 GROUP BY student_id having count(sid)=2)
     41 --
     42 
     43 -- 6、查询挂科超过两门(包括两门)的学生姓名和班级
     44 
     45 -- SELECT sname,caption from student
     46 --                                         INNER JOIN class
     47 --                                         on student.sid = class.cid
     48 --                                         where sid in
     49 --                                         (SELECT student_id from score
     50 --                                                     where num    <60 GROUP BY student_id
     51 --                                                             HAVING count(num) >=2)
     52 
     53 -- 7、查询选修了所有课程的学生姓名
     54 -- SELECT sname from student
     55 --                             WHERE sid in (SELECT student_id  from score
     56 --                                                                                             GROUP BY student_id
     57 --                                                                                                 HAVING count(course_id) = (SELECT count(cid) from course)
     58 -- )
     59 
     60 
     61 
     62 
     63 -- 8、查询不同课程但成绩相同的学号,课程号,成绩
     64 
     65 SELECT student_id,course_id,num from score WHERE student_id = (SELECT A.student_id from
     66 
     67 (SELECT *,COUNT(DISTINCT num) as C FROM score GROUP BY student_id)as A
     68 
     69 LEFT JOIN
     70 
     71 (SELECT *,count(num) as D FROM score GROUP BY student_id) as B
     72 
     73 on A.sid = B.sid
     74 
     75 where C!=D)
     76 
     77 -- 9、查询没学过“李平”老师课程的学生姓名以及选修的课程名称;
     78 
     79 SELECT a.sname,course.cname from course
     80                     RIGHT JOIN (SELECT * from student
     81                                 WHERE sid not in
     82                                             (select student_id
     83                                                     from score where course_id =3) )as A
     84                     on course.cid = A.class_id
     85 
     86 
     87 
     88 
     89 -- 10、查询所有选修了学号为1的同学选修过的一门或者多门课程的同学学号和姓名;
     90 
     91 --
     92 SELECT sid,sname
     93         from student
     94         WHERE sid in (SELECT DISTINCT student_id from score 
     95                                                                 WHERE course_id
     96                                                                 in (SELECT course_id
     97                                                                                 from score where student_id = 1))
     98 
     99 
    100 
    101 
    102 -- 11、任课最多的老师中学生单科成绩最高的学生姓名
    103 
    104 SELECT sname from student
    105         where sid in (SELECT DISTINCT student_id from score
    106                                             WHERE course_id in (SELECT cid from course
    107                                                     where teacher_id=(SELECT teacher_id from course
    108                                                             GROUP BY teacher_id order by count(cid) desc limit 1))
    109                                                                         and num=(SELECT max(num) from score WHERE course_id in
    110                                                                                 (SELECT cid from course where teacher_id=(SELECT teacher_id
    111                                                                                             from course GROUP BY teacher_id order by count(cid) desc limit 1)) ))-- SELECT * from score  GROUP BY course_id having
    练习题
  • 相关阅读:
    linux grep命令
    PHP 利用simplexml_load_file 读取XML对应的字段 然后存入mysql数据库
    php 设计模式之单类模式
    Mac C#开发工具Rider安利与环境配置教程
    模拟,贪心,枚举(二)
    模拟,贪心,枚举
    10.10 review
    review 10.9
    10.6 review
    9.28 review
  • 原文地址:https://www.cnblogs.com/zhang-can/p/7247877.html
Copyright © 2020-2023  润新知