MySQL入门

Posted 名刀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
练习题

 

以上是关于MySQL入门的主要内容,如果未能解决你的问题,请参考以下文章

Atom编辑器入门到精通 Atom使用进阶

linux中怎么查看mysql数据库版本

Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)

Cg入门19:Fragment shader - 片段级模型动态变色

从mysql的片段中加载ListView

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段