Mysql(2)查询实例

一: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

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

推荐阅读更多精彩内容

  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,790评论 5 116
  • 观其大纲 page 01 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 M...
    周少言阅读 3,155评论 0 33
  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,227评论 0 7
  • 1.英语学习并不是一朝一夕的事,他需要长时间的积累,词汇的积累 语法的积累 2.我学到的怦然心动的单词:disti...
    侯淑洁阅读 169评论 1 0
  • 04.04.2018 It’s a day to visit Taska in Lampung. Had a lo...
    快樂很簡單阅读 308评论 0 0