Mysql数据库 | SQL语句解析『上篇』

在这里插入图片描述

个人主页:wei_shuo的个人主页

Hello World !


文章目录

  • mysql来源
  • navicat快捷键
  • mysql数据库语言分类
    • DQL
        • 简单查询
        • 条件查询
        • 模糊查询
        • 分组查询
        • 使用limit字句
        • 多表查询
        • 在增删改句子中使用子查询
        • 排序
        • 显示当前使用数据库
        • 语句执行顺序:
        • desc 表名

mysql来源

  • mysql是mysqlAB公司的

  • mysqlAB公司被sun公司收购了

  • sun公司又被Oracle公式收购了

  • mysql现在是由oracle公司负责维护

  • Oracle是收费的,mysql是免费的

navicat快捷键

在行尾:Shift+Home键选中当前行。

在行尾:Ctrl+Shift+Home键 从光标处一直选中文本开头

在行首:Shift+End键选中当前行。

在行首:Shift+End键 从光标处一直选中文本末尾

运行已选择的:Ctrl+Shift+R。

复制当前行:Ctrl+D。


Ctrl+q    打开查询窗口

Ctrl+/   注释MySQL语句

ctrl+shift +/  解除注释

ctrl+r           运行查询窗口的sql语句

ctrl+shift+r   只运行选中的sql语句

F6               打开一个mysql命令行窗口

ctrl+l            删除一行

ctrl+n           打开一个新的查询窗口

ctrl+w          关闭一个查询窗口

mysql数据库语言分类

DQL

数据查询语言,凡是带select关键字的都是查询语句都是DLQ

简单查询

select 字段名 from 表名

#查看kc表中的所有数据
mysql> select * from kc;
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 101    | 计算机基础   |        1 |    3 |
| 102    | c语言        |        1 |    3 |
| 206    | 高等数学     |        3 |    3 |
| 208    | 数据结构     |        5 |    6 |
| 209    | 操作系统     |        6 |    3 |
| 210    | 计算机组装   |        4 |    4 |
| 212    | ORACLE数据库 |        2 |    5 |
| 301    | 计算机网络   |        1 |    4 |
| 302    | 软件工程     |        7 |    2 |
+--------+--------------+----------+------+
9 rows in set (0.01 sec)

#distinct消除重复数据
mysql> select distinct(学分) from kc;
+------+
| 学分 |
+------+
|    3 |
|    6 |
|    4 |
|    5 |
|    2 |
+------+
5 rows in set (0.00 sec)

# 查询多个字段
mysql> select 课程号,课程名 from kc;
+--------+--------------+
| 课程号 | 课程名       |
+--------+--------------+
| 102    | c语言        |
| 212    | ORACLE数据库 |
| 209    | 操作系统     |
| 208    | 数据结构     |
| 101    | 计算机基础   |
| 210    | 计算机组装   |
| 301    | 计算机网络   |
| 302    | 软件工程     |
| 206    | 高等数学     |
+--------+--------------+
9 rows in set (0.00 sec)

#列起别名
mysql> select 课程号 as jkj from kc;
+-----+
| jkj |
+-----+
| 102 |
| 212 |
| 209 |
| 208 |
| 101 |
| 210 |
| 301 |
| 302 |
| 206 |
+-----+
9 rows in set (0.00 sec)

mysql> select 课程号 as 'jkj hkh' from kc;
+---------+
| jkj hkh |
+---------+
| 102     |
| 212     |
| 209     |
| 208     |
| 101     |
| 210     |
| 301     |
| 302     |
| 206     |
+---------+
9 rows in set (0.00 sec)
#注意:
#as可省略
#双引号不标准,在mysql中可用,在Oracle中不可用
#单引号标准,都可用

#列参与数学运算
mysql> select 课程名 课程,学分*18 分数 from kc;
+--------------+------+
| 课程         | 分数 |
+--------------+------+
| 计算机基础   |   54 |
| c语言        |   54 |
| 高等数学     |   54 |
| 数据结构     |  108 |
| 操作系统     |   54 |
| 计算机组装   |   72 |
| ORACLE数据库 |   90 |
| 计算机网络   |   72 |
| 软件工程     |   36 |
+--------------+------+
9 rows in set (0.00 sec)

#根据生日求年龄
select 姓名,year(now())-year(出生日期) as 年龄 from 信息管理学生表;

条件查询

=         等于
><或!=    不等于
<         小于
<=	      小于等于
>         大于
>=        大于等于
between……and……两个值之间,等同于   >= and <=
is null   为null(is not null 不为空)
and或&&      并且
or或||        或
in          包含,相当于多个or(not in 不在这个范围中)
not         取非,(主要用在is或in中)
any			满足子条件查询的任意一条件
all			满足子条件查询的所有条件
#eg:
mysql> select * from kc;
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 101    | 计算机基础   |        1 |    3 |
| 102    | c语言        |        1 |    3 |
| 206    | 高等数学     |        3 |    3 |
| 208    | 数据结构     |        5 |    6 |
| 209    | 操作系统     |        6 |    3 |
| 210    | 计算机组装   |        4 |    4 |
| 212    | ORACLE数据库 |        2 |    5 |
| 301    | 计算机网络   |        1 |    4 |
| 302    | 软件工程     |        7 |    2 |
+--------+--------------+----------+------+
9 rows in set (0.00 sec)

mysql> select * from kc where 学分 != 3;
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 208    | 数据结构     |        5 |    6 |
| 210    | 计算机组装   |        4 |    4 |
| 212    | ORACLE数据库 |        2 |    5 |
| 301    | 计算机网络   |        1 |    4 |
| 302    | 软件工程     |        7 |    2 |
+--------+--------------+----------+------+
5 rows in set (0.00 sec)

模糊查询

like        模糊查询,支持%或下划线匹配
          %匹配任意个字符
       一个_只能匹配一个字符
#找出课程号中含有1的
mysql> select * from kc where 课程号 like '%1%';
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 101    | 计算机基础   |        1 |    3 |
| 102    | c语言        |        1 |    3 |
| 210    | 计算机组装   |        4 |    4 |
| 212    | ORACLE数据库 |        2 |    5 |
| 301    | 计算机网络   |        1 |    4 |
+--------+--------------+----------+------+
5 rows in set (0.00 sec)
#找出课程号开头为1的
mysql> select * from kc where 课程号 like '1%';
+--------+------------+----------+------+
| 课程号 | 课程名     | 开课学期 | 学分 |
+--------+------------+----------+------+
| 101    | 计算机基础 |        1 |    3 |
| 102    | c语言      |        1 |    3 |
+--------+------------+----------+------+
2 rows in set (0.01 sec)
#找出课程号结尾为1的
mysql> select * from kc where 课程号 like '%1';
+--------+------------+----------+------+
| 课程号 | 课程名     | 开课学期 | 学分 |
+--------+------------+----------+------+
| 101    | 计算机基础 |        1 |    3 |
| 301    | 计算机网络 |        1 |    4 |
+--------+------------+----------+------+
2 rows in set (0.00 sec)
#找出课程名第三个为机的
mysql> select * from kc where 课程名 like '__机%';
+--------+------------+----------+------+
| 课程号 | 课程名     | 开课学期 | 学分 |
+--------+------------+----------+------+
| 101    | 计算机基础 |        1 |    3 |
| 210    | 计算机组装 |        4 |    4 |
| 301    | 计算机网络 |        1 |    4 |
+--------+------------+----------+------+
3 rows in set (0.00 sec)

分组查询

group by

#查找xs表中各专业男生的人数
mysql> select 专业名,count(性别) as 男生人数 from xs where 性别='男' group by 专业名 ;
+----------+----------+
| 专业名   | 男生人数 |
+----------+----------+
| 软件技术 |        8 |
| 网络技术 |        3 |
| 信息管理 |        1 |
| 建筑智能 |        1 |
+----------+----------+
4 rows in set (0.00 sec)
#为什么分组函数不能直接使用在where后面?
mysql> select 分数 from cj where 分数>max(分数);
ERROR 1054 (42S22): Unknown column '分数' in 'field list'  //报错
因为分组函数在使用时必须分组之后才能使用,where执行的时候还没有分组,所以where之后不能用分组函数

使用limit字句

#查询前三条数据记录
mysql> select * from xs limit 3;
+--------+--------+----------+------+------------+--------+------+
| 学号   | 姓名   | 专业名   | 性别 | 出生日期   | 总学分 | 备注 |
+--------+--------+----------+------+------------+--------+------+
| 001101 | 王金华 | 软件技术 | 男   | 1990-02-10 |   NULL | NULL |
| 001102 | 程周杰 | 软件技术 | 男   | 1991-02-01 |   NULL | NULL |
| 001103 | 王元   | 软件技术 | 男   | 1989-10-06 |   NULL | NULL |
+--------+--------+----------+------+------------+--------+------+
3 rows in set (0.01 sec)
#查询第四条数据记录
mysql> select * from xs limit 3,1;
+--------+--------+----------+------+------------+--------+------+
| 学号   | 姓名   | 专业名   | 性别 | 出生日期   | 总学分 | 备注 |
+--------+--------+----------+------+------------+--------+------+
| 001104 | 严蔚敏 | 信息管理 | 女   | 1990-08-26 |   NULL | NULL |
+--------+--------+----------+------+------------+--------+------+
1 row in set (0.00 sec)

多表查询

#查询最高分学生的详细信息
mysql> select distinct cj.学号,姓名,成绩 from xs,cj where cj.学号=xs.学号 and 成绩 = (select max(成绩) from cj) order by 成绩 desc;
+--------+--------+------+
| 学号   | 姓名   | 成绩 |
+--------+--------+------+
| 001110 | 张晓晖 | 95.0 |
+--------+--------+------+
1 row in set (0.00 sec)
#查询及格学生的详细信息
mysql> select distinct 姓名 as 及格学生的姓名,课程号,成绩 from xs,cj  where cj.学号=xs.学号 && 成绩 in (select 成绩 from cj where 成绩 >= 60) order by 成绩 desc;
+----------------+--------+------+
| 及格学生的姓名 | 课程号 | 成绩 |
+----------------+--------+------+
| 张晓晖         | 101    | 95.0 |
| 张晓晖         | 102    | 95.0 |
| 李明           | 101    | 85.0 |
| 严蔚敏         | 102    | 84.0 |
| 张飞           | 102    | 83.0 |
| 王元           | 206    | 81.0 |
| 李伟           | 206    | 80.0 |
| 刘超           | 102    | 80.0 |
| 马妮啦         | 102    | 79.0 |
| 王金华         | 102    | 78.0 |
| 程周杰         | 102    | 78.0 |
| 程周杰         | 206    | 78.0 |
| 刘超           | 101    | 78.0 |
| 王金华         | 206    | 76.0 |
| 李长江         | 206    | 76.0 |
| 李伟           | 102    | 71.0 |
| 王元           | 102    | 70.0 |
| 张飞           | 206    | 70.0 |
| 刘超           | 206    | 68.0 |
| 张飞           | 101    | 66.0 |
| 严蔚敏         | 101    | 65.0 |
| 严蔚敏         | 206    | 65.0 |
| 李伟           | 101    | 65.0 |
| 李明           | 102    | 64.0 |
| 刘敏           | 101    | 63.0 |
| 王元           | 101    | 62.0 |
| 王金华         | 101    | 61.0 |
| 李天飞         | 206    | 60.0 |
+----------------+--------+------+
28 rows in set, 1 warning (0.00 sec)

在增删改句子中使用子查询

  • insert语句中使用子查询
mysql> create table rom414  like xs;
Query OK, 0 rows affected (0.03 sec)

mysql> insert into rom414 select * from xs limit 20,4;
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from rom414;
+--------+--------+--------+------+------------+--------+------+
| 学号   | 姓名   | 专业名 | 性别 | 出生日期   | 总学分 | 备注 |
+--------+--------+--------+------+------------+--------+------+
| 200308 | 郑明鑫 | NULL   | 男   | 2003-04-05 |   NULL | NULL |
| 200326 | 唐辉阳 | NULL   | 男   | 2003-02-06 |   NULL | NULL |
| 200327 | 徐斌   | NULL   | 男   | 2003-03-05 |   NULL | NULL |
| 200336 | 李昌城 | NULL   | 男   | 2003-06-03 |   NULL | NULL |
+--------+--------+--------+------+------------+--------+------+
4 rows in set (0.00 sec)
  • update语句中使用子查询
#在成绩表中把学C语言的学生成绩全部加5
mysql> update cj set 成绩=成绩+5 where 课程号 = (select 课程号 from kc where 课程名 = 'c语言');
Query OK, 10 rows affected (0.01 sec)
Rows matched: 10  Changed: 10  Warnings: 0

#根据生日求年龄并写入到表格
update 信息管理学生表 set 年龄 = year(now())-year(出生日期);
  • 在delete语句中使用子查询
#在成绩表中删除张飞c语言的成绩
mysql> delete from cj where 学号 = (select 学号 from xs where 姓名='张飞') && 课程号 = (select 课程号 from kc where 课程名 = 'c语言');
Query OK, 1 row affected, 1 warning (0.01 sec)

排序

#查询kc表,以学分为升序排序
mysql> select * from kc order by 学分 asc;  //默认是升序
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 302    | 软件工程     |        7 |    2 |
| 101    | 计算机基础   |        1 |    3 |
| 102    | c语言        |        1 |    3 |
| 206    | 高等数学     |        3 |    3 |
| 209    | 操作系统     |        6 |    3 |
| 210    | 计算机组装   |        4 |    4 |
| 301    | 计算机网络   |        1 |    4 |
| 212    | ORACLE数据库 |        2 |    5 |
| 208    | 数据结构     |        5 |    6 |
+--------+--------------+----------+------+
9 rows in set (0.00 sec)
#查询kc表,以学分为降序排序
mysql> select * from kc order by 学分 desc;
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 208    | 数据结构     |        5 |    6 |
| 212    | ORACLE数据库 |        2 |    5 |
| 210    | 计算机组装   |        4 |    4 |
| 301    | 计算机网络   |        1 |    4 |
| 101    | 计算机基础   |        1 |    3 |
| 102    | c语言        |        1 |    3 |
| 206    | 高等数学     |        3 |    3 |
| 209    | 操作系统     |        6 |    3 |
| 302    | 软件工程     |        7 |    2 |
+--------+--------------+----------+------+
9 rows in set (0.00 sec)

#多个字段排序
要求查询课程名和学分,学分按升序排序,如果学分相同,就按课程名以升序排序
mysql> select 课程名,学分 from kc order by 学分,课程名;
+--------------+------+
| 课程名       | 学分 |
+--------------+------+
| 软件工程     |    2 |
| c语言        |    3 |
| 操作系统     |    3 |
| 计算机基础   |    3 |
| 高等数学     |    3 |
| 计算机组装   |    4 |
| 计算机网络   |    4 |
| ORACLE数据库 |    5 |
| 数据结构     |    6 |
+--------------+------+
9 rows in set (0.00 sec)

mysql> select 课程名,学分 from kc order by 2;//这里的2表示第二列,不建议这样写
+--------------+------+
| 课程名       | 学分 |
+--------------+------+
| 软件工程     |    2 |
| 计算机基础   |    3 |
| c语言        |    3 |
| 高等数学     |    3 |
| 操作系统     |    3 |
| 计算机组装   |    4 |
| 计算机网络   |    4 |
| ORACLE数据库 |    5 |
| 数据结构     |    6 |
+--------------+------+
9 rows in set (0.00 sec)
#找出学分在3到5之间的数据按学分降序进行排列
mysql> select * from kc where 学分 between 3 and 5 order by 学分 desc;
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 212    | ORACLE数据库 |        2 |    5 |
| 210    | 计算机组装   |        4 |    4 |
| 301    | 计算机网络   |        1 |    4 |
| 101    | 计算机基础   |        1 |    3 |
| 102    | c语言        |        1 |    3 |
| 206    | 高等数学     |        3 |    3 |
| 209    | 操作系统     |        6 |    3 |
+--------+--------------+----------+------+
7 rows in set (0.00 sec)

显示当前使用数据库

mysql> select database();
+------------+
| database() |
+------------+
| cjgl1      |
+------------+
1 row in set (0.00 sec)

语句执行顺序:

第一步:from

第二步:where

第三步:group by

第四步:select

第五步:order by(排序总是最后执行)

desc 表名

#不查看表中的数据,只查看结构
mysql> desc kc;
+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| 课程号   | char(3)          | NO   | PRI | NULL    |       |
| 课程名   | varchar(20)      | NO   | UNI | NULL    |       |
| 开课学期 | tinyint unsigned | NO   |     | 1       |       |
| 学分     | tinyint unsigned | YES  |     | NULL    |       |
+----------+------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

你可能感兴趣的:(数据库,sql,mysql)