美文网首页
Mysql(2)查询实例

Mysql(2)查询实例

作者: 仙灵儿 | 来源:发表于2018-07-21 22:58 被阅读5次

一:MySQL简介与安装

    MySQL是一种中型、易用的关系型数据库管理系统(DBMS,Database Management System)。

    安装步骤:

    第一步:  sudo apt-get install mysql-server

    第二步:  sudo apt install mysql-client

    第三步:  sudo apt install libmysqlclient-dev

    进入MySQL环境:

    mysql -u root -p

二:MySQL常用操作命令

    1. show databases;      # 显示所有数据库

    2. use 数据库名称;      # 进入(使用)某个数据库

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

    4. desc 表名称;        # 查看表的结构

三:基本SQL语句

    SQL:Structured Query Language,结构化查询语言,专门用来操作关系型数据库的

        语言。

    1. 创建数据库

      create database 数据库名 [default character set 'utf8'];

    2. 创建表

      create table 表名称(

          字段名  字段数据类型  约束,

          字段名  字段数据类型  约束,

          ......

          字段名  字段数据类型  约束

      );

    3. 插入记录

      方式一:

      insert into 表名称(字段名1,字段名2,...)values(值1,值2,...);

      方式二:

      insert into 表名称 values(值1,值2,...);

      方式三:

      insert into 表名称(字段名1,字段名2,...)values(值1,值2,...),(值1,值2,...),

        (值1,值2,...).....(值1,值2,...);

    4. 修改记录

      update 表名称 set 字段名=修改值 [,字段名=修改值,...] [where 条件];

    5. 删除记录

      delete from 表名称 [where 条件];

    6. 查询记录

      select 字段列表 from 表名称 [where 条件];

    7. 增加一个字段

      alter table 表名 add 新字段的名字  字段属性

      alter table students add sex char(10)

    8. 删除一个字段

      alter table 表名 change 老字段名 新字段名 字段属性;

      例如:

      alter table students change id id int(4) auto_increment;

    9. 修改某个字段 --- 修改属性

      alter table students change id id int(4);

    10. 修改某个字段 --- 删除主键

        alter table students drop primary key;

    11. 修改某个字段 --- 添加主键

        alter table students add primary key(id);

        alter table students change id id int(4) primary key;

四:限制查询、分页查询、排序查询、分组查询

    1.限制查询

      第一种情况:查询限定条数

      select 字段列表 from 表名称 [where 条件] limit 最多记录数;

      第二种情况:从指定偏移量查询限定条数

      select 字段列表 from 表名称 [where 条件] limit 偏移量,最多记录数;

    2.分页查询

      已知当前页为currentPage,每页最多显示的记录数为pageSize,则currentPage页

      显示的表中的记录为:

      select 字段列表 from 表名称 [where 条件]

        limit (currentPage-1)*pageSize,pageSize;

    3.排序查询

      select 字段列表 from 表名称 [where 条件] order by 字段名[desc] [,字段名...];

    4.MySQL中的聚合函数

      A:  max(字段名)  获取某字段中的最大值

      B:  min(字段名)  获取某字段中的最小值

      C:  sum(字段名)  计算某字段值的和

      D:  avg(字段名)  计算某字段的平均值

      E:  count(字段名) 计算某字段值中不为null的记录数

          count(*)  计算表中的总记录数

    5.分组查询

      select 字段列表 from 表名称 [where 条件]

          group by 分组字段列表 [having 对分组后的筛选条件];

      注意:select后的字段列表应该包含在group by后的分组字段列表中!

一:模糊查询

    模糊查询中的两个通配符:

    1.  %  代表任意多个任意字符

    2.  _  代表任意一个字符

    模糊查询的SQL语法:

    select 字段列表 from 表名称 where 字段名 like 匹配条件;

二:外键(foreign key)

    外键用来约束子表的记录与父表对应。

    constraint 约束名 foreign key(用来关联父表的字段)

              references 父表名(父表中用来关联子表的字段,一般为主键);

三:多表查询

    1. 等值连接

      select 字段列表 from 表A,表B,... where 连接条件 [其他过滤条件];

    2. 内连接

      select 字段列表 from 表A inner join 表B on 连接条件 [其他过滤条件];

    3. 外连接

      左外连接:

      select 字段列表 from 表A left join 表B on 连接条件 [其他过滤条件];

      注意:左外连接的查询结果不但包括了符合连接条件的查询记录,而且还包括了

            左表中不符合连接条件的记录。

      右外连接:

      select 字段列表 from 表A right join 表B on 连接条件 [其他过滤条件];

      注意:右外连接的查询结果不但包括了符合连接条件的查询记录,而且还包括了

            右表中不符合连接条件的记录。

例子1:(多表查询)

1.使用“等值连接”查询学生姓名、学生成绩、学校名称。

  select student.name,student.score,school.schoolname 

      from school,student where student.school_id=school.schoolid;

2.使用“等值连接”查询出“张红”的学生姓名、学生成绩、学校名称。

  select student.name,student.score,school.schoolname 

      from school,student where student.school_id=school.schoolid

        and student.name='张红';

3.使用“内连接”查询学生姓名、学生成绩、学校名称。

  select student.name,student.score,school.schoolname 

      from school inner join student on student.school_id=school.schoolid;

4.使用“内连接”查询出“张红”的学生姓名、学生成绩、学校名称。

  select student.name,student.score,school.schoolname 

      from school inner join student on student.school_id=school.schoolid

      and student.name='张红';

5.先插入一条学校记录,再使用“左外连接”查询学生姓名、学生成绩、学校名称,

  要求显示所有学校的记录。

  insert into school(schoolname,note)values('东北师范',null);

  select student.name,student.score,school.schoolname 

      from school left join student on student.school_id=school.schoolid;

例子2:(限制,分页。。。。)

1.创建一个名为mydb的数据库

  create database mydb default character set 'utf8';

2.进入mydb

  use mydb;

13:55 2018/5/29

3.创建student表

  create table student(

    stuid  int  auto_increment primary key,

    name  varchar(20)  not null,

    age    int,

    score  float    not null,

    note    text

  );

4.向student表中插入一条记录

  insert into student(name,age,score,note)values('风清扬',20,93.5,'风清扬独孤九剑');

  插入成功之后,查询表的所有记录:

  select * from student;

  insert into student values(23,'令狐冲',18,65.5,'家住华山');

  insert into student(name,age,score)values('郭靖',25,62),('黄蓉',24,73.5),

  ('马云',40,79.5);

5.把学生表中所有的记录的成绩score改为60分

  update student set score=60;

6.将姓名为“令狐冲”的记录的成绩改为75分

  update student set score=75 where name='令狐冲';

7.删除学号为27的学生记录

  delete from student where stuid=27;

8.查询所有学生的姓名和成绩,并以别名的形式显示字段

  select name as 姓名,score as 成绩 from student;

9.查询出所有成绩在85到95之间的学生记录

  select * from student where score >=85 and score <= 95;

  或者

  select * from student where score between 85 and 95;

10.查询所有备注信息不为null的学生记录

  select * from student where note is not null;

11.查询学生表中的前三条记录

  select * from student limit 3;

12.查询成绩大于等于70分的学生中,前两条记录

  select * from student where score >= 70 limit 2;

13.查询学生表中第三条与第四条记录

  select * from student limit 2,2;

14.假如每页最多显示2条记录,查询第三页应该显示的记录

  select * from student limit 4,2;

15.按照成绩从高到低,将学生排序

  select * from student order by score desc;

16.按照成绩从高到低,将学生排序,如果成绩相等则再按照年龄降序排序

  select * from student order by score desc,age desc;

===========================以下为分组查询相应的SQL===========================

17.创建商品表product,并添加记录

  create table product(

      proid    int    auto_increment  primary key,

      proname  varchar(20)  not null,

      price    float  not null,

      type      varchar(20)  not null,

      note      text

  );

  insert into product(proname,price,type,note)values('锅巴',5,'零食',null),

    ('洗衣粉',8,'日用品',null),('可口可乐',12,'饮料','新品上市的Cola'),

    ('辣条',2,'零食',null),('脸盆',10,'日用品',null),('薯片',13,'零食',null),

    ('脉动',6,'饮料',null);

18.按照商品类型type对product表中的记录进行分组,求出每一组的平均价格

  select type as 类型,avg(price) as 平均价格 from product group by type;

19.按照商品类型type对product表中的记录进行分组,求出零食组的平均价格

  select type as 类型,avg(price) as 平均价格 from product

    group by type having type='零食';

例子三:(模糊查询)

创建worker表

create table worker(

  work_id  int  auto_increment primary key,

  name    varchar(20),

  job    varchar(20),

  salary  float

);

insert into worker(name,job,salary)values('张二强','修车',5000),

  ('王小刚','美容',3500),('李刚','经理',6000),('王娟','老板娘',7000);

1. 查询所有姓王的工人

  select * from worker where name like '王%';

2. 查询名字中带有“刚”的工人

  select * from worker where name like '%刚%';

3. 查询名字中第二个字是"刚"的工人

  select * from worker where name like '_刚%';

例子四:(外键)

学校表

create table school(

  schoolid    int  auto_increment primary key,

  schoolname  varchar(30)  not null,

  note      text

);

insert into school(schoolname,note)values('清华大学','清华大学很好')

  ,('北京大学','北大不错'),('交大','交大也很好');

学生表

create table student(

  stuid    int  auto_increment primary key,

  name    varchar(20) not null,

  score  double not null,

  sex    varchar(10),

  school_id int,

  constraint fk_student foreign key(school_id) references school(schoolid)

    on delete cascade on update cascade

);

insert into student(name,score,sex,school_id)values('张三',92,'男',1),

    ('张三丰',96,'男',1),('李娟',88,'女',2),('张红',86,'女',2),

    ('李芬',85,'女',3);

四:子查询(嵌套查询)

    在外部查询SQL语句中,可以包含其他内部查询的语句,这个内部查询(也叫嵌套查询)

    就是子查询;子查询需要使用括号括起来;子查询的结果一般作为外部查询语句的条件。

    子查询经常使用的关键字:

    1. in

      判断某字段的值是否在子查询结果集中

    2. all

      判断某字段的值是否满足操作符对子查询结果集所有值的比较

    3. any

      判断某字段的值是否满足操作符对子查询结果集任意一个值的比较

五:“一对多”与“多对多”关系表设计

    1. “一对多”关系表设计:

        在“多”的一方中,设置外键,关联“一”的一方。(eg:学校表("一")与学生表("多"))

    2. “多对多”关系表设计:

        “多对多”关系表的设计需要引入一个中间表,中间表负责维护“多对多”关系表。

        中间表至少需要包含两个字段,这两个字段分别用来关联这两个“多对多”的关系表。

        通常会将这两个字段设置成外键,关联两个“多”表的主键。

        可以通过将这两个字段设置成联合主键的方式,用来避免组合值重复。 

六.配置远程连接MySQL的权限

  1.sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

    对该文件进行编辑:注释掉 bind-address = 127.0.0.1

  2.进入MySQL环境,授予root用户所有权限

    grant all on *.* to 'root'@'%' identified by '你自己MySQL的root用户密码'

              with grant option;

  3.刷新权限

    flush privileges;

  4.退出MySQL环境,并重启mysql服务

    systemctl restart mysql

相关文章

网友评论

      本文标题:Mysql(2)查询实例

      本文链接:https://www.haomeiwen.com/subject/fvbhmftx.html