单表查询

一、单表查询

1、查询语法及限制优先级

#语法
    select【distinct】(*|字段|四则运算|聚合函数) from 表名
  distinct        去除重复

  where      查询条件

  group by    分组

  having      分组后的过滤

  order by    排序

  limit        限制获取后的数据

#重点中的重点:关键字的执行优先级
    from
    where
    group by
    having
    select
    distinct
    order by
    limit
1、找到:from

2、拿着where指定的约束条件,去文件/表中取出一条条的记录

3、将取出来的的一条条记录进行分组group by,如果没有group by,则整体作为一组

4、将分组的结果进行having过滤

5、执行select

6、去重

7、将执行结果按条件排序:order by

8、限制结果的显示条数
较为复杂时,查询思路
create table stu(id int primary key auto_increment,name char(10),math float,english float);

insert into stu values(null,"赵云",90,30);

insert into stu values(null,"小乔",90,60);

insert into stu values(null,"小乔",90,60);

insert into stu values(null,"大乔",10,70);

insert into stu values(null,"李清照",100,100);

insert into stu values(null,"铁拐李",20,55);

insert into stu values(null,"小李子",20,55);
准备代码数据

2、where约束

1、比较运算符:> , < ,  >= ,  <= ,<>,!=

mysql> select *from stu;
+----+-----------+------+---------+
| id | name      | math | english |
+----+-----------+------+---------+
|  1 | 赵云      |   90 |      30 |
|  2 | 小乔      |   90 |      60 |
|  3 | 小乔      |   90 |      60 |
|  4 | 大乔      |   10 |      70 |
|  5 | 李清照    |  100 |     100 |
|  6 | 铁拐李    |   20 |      55 |
|  7 | 小李子    |   20 |      55 |
+----+-----------+------+---------+


mysql> select *from stu where english = 100;
+----+-----------+------+---------+
| id | name      | math | english |
+----+-----------+------+---------+
|  5 | 李清照    |  100 |     100 |
+----+-----------+------+---------+
1 row in set (0.00 sec)

mysql> select *from stu where math >=90;
+----+-----------+------+---------+
| id | name      | math | english |
+----+-----------+------+---------+
|  1 | 赵云      |   90 |      30 |
|  2 | 小乔      |   90 |      60 |
|  3 | 小乔      |   90 |      60 |
|  5 | 李清照    |  100 |     100 |
+----+-----------+------+---------+
4 rows in set (0.00 sec)

mysql> select *from stu where 90<=math<=100;
+----+-----------+------+---------+
| id | name      | math | english |
+----+-----------+------+---------+
|  1 | 赵云      |   90 |      30 |
|  2 | 小乔      |   90 |      60 |
|  3 | 小乔      |   90 |      60 |
|  4 | 大乔      |   10 |      70 |
|  5 | 李清照    |  100 |     100 |
|  6 | 铁拐李    |   20 |      55 |
|  7 | 小李子    |   20 |      55 |
+----+-----------+------+---------+
7 rows in set (1.52 sec)

mysql> select *from stu where math>=60 and english >= 60;
+----+-----------+------+---------+
| id | name      | math | english |
+----+-----------+------+---------+
|  2 | 小乔      |   90 |      60 |
|  3 | 小乔      |   90 |      60 |
|  5 | 李清照    |  100 |     100 |
+----+-----------+------+---------+
上边找表的信息

2、between

mysql> select name,math from stu where math between 60 and 90;
+--------+------+
| name   | math |
+--------+------+
| 赵云   |   90 |
| 小乔   |   90 |
| 小乔   |   90 |
+--------+------+
3 rows in set (0.00 sec)


mysql> select name,math from stu where math not between 60 and 90;
+-----------+------+
| name      | math |
+-----------+------+
| 大乔      |   10 |
| 李清照    |  100 |
| 铁拐李    |   20 |
| 小李子    |   20 |
+-----------+------+
4 rows in set (0.00 sec)
上边找表的信息

3、in

mysql> select id,name,english from stu where english=60 or english=70 or english=100;
+----+-----------+---------+
| id | name      | english |
+----+-----------+---------+
|  2 | 小乔      |      60 |
|  3 | 小乔      |      60 |
|  4 | 大乔      |      70 |
|  5 | 李清照    |     100 |
+----+-----------+---------+
4 rows in set (0.00 sec)





mysql> select id,name,english from stu where english in(60,70,100);
+----+-----------+---------+
| id | name      | english |
+----+-----------+---------+
|  2 | 小乔      |      60 |
|  3 | 小乔      |      60 |
|  4 | 大乔      |      70 |
|  5 | 李清照    |     100 |
+----+-----------+---------+
4 rows in set (0.00 sec)
View Code

4、like

#like 长得像 模糊匹配
#% 任意个任意字符
#_ 一个任意字符
select *from stu where name like "李%"; 开头带李的
select *from stu where name like "%李%"; 名字带有李的
select *from stu where name like "%李"; 最后一个字是李的

3、group by 分组查询

create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);

insert into emp values

(1,"刘备","","市场","总监",5800),

(2,"张飞","","市场","员工",3000),

(3,"关羽","","市场","员工",4000),

(4,"孙权","","行政","总监",6000),

(5,"周瑜","","行政","员工",5000),

(6,"小乔","","行政","员工",4000),

(7,"曹操","","财务","总监",10000),

(8,"司马懿","","财务","员工",6000);
测试用的表
#单独使用GROUP BY关键字分组
    SELECT post FROM employee GROUP BY post;
    注意:我们按照post字段分组,那么select查询的字段只能是post,想要获取组内的其他相关信息,需要借助函数

#GROUP BY关键字和GROUP_CONCAT()函数一起使用
    SELECT post,GROUP_CONCAT(name) FROM employee GROUP BY post;#按照岗位分组,并查看组内成员名
    SELECT post,GROUP_CONCAT(name) as emp_members FROM employee GROUP BY post;

#GROUP BY与聚合函数一起使用
    select post,count(id) as count from employee group by post;#按照岗位分组,并查看每个组有多少人
#最简单使用
mysql> select dept from emp group by dept;
+--------+
| dept   |
+--------+
| 市场   |
| 行政   |
| 财务   |
+--------+
-------------------------------
#通过下面两个例子,可以看出,不与group_concat连用,不能查出两个字段
mysql> select dept id from emp group by dept;
+--------+
| id     |
+--------+
| 市场   |
| 行政   |
| 财务   |
+--------+
3 rows in set (0.00 sec)

mysql> select dept sex from emp group by dept;
+--------+
| sex    |
+--------+
| 市场   |
| 行政   |
| 财务   |
+--------+

-------------------------------------
#与group_concat连用
mysql> select dept, group_concat(name) from emp group by dept;
+--------+----------------------+
| dept   | group_concat(name)   |
+--------+----------------------+
| 市场   | 刘备,张飞,关羽       |
| 行政   | 孙权,周瑜,小乔       |
| 财务   | 曹操,司马懿          |
+--------+----------------------+


-----------------------------------
#与内置函数连用
mysql> select dept,count(id) from emp group by dept;
+--------+-----------+
| dept   | count(id) |
+--------+-----------+
| 市场   |         3 |
| 行政   |         3 |
| 财务   |         2 |
+--------+-----------+
练习

 4、聚合函数

#sum  求和
#avg  平均数
#max  最大值
#min  最小值
#count  计数
mysql> select avg(salary) from emp;
+-------------+
| avg(salary) |
+-------------+
|        5475 |
+-------------+
1 row in set (0.00 sec)

mysql> select count(salary) from emp;
+---------------+
| count(salary) |
+---------------+
|             8 |
+---------------+
1 row in set (0.00 sec)
View Code

5、having过滤

#having与where不同之处

#!!!执行的优先级从高到底:where > group by > having 


#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。

#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数

6、查询排序  order by

#order by默认是升序

#单字段
select *from emp order by salary;

#多字段(无论 升降序,先按前边的排序,如果有相同的,再按后边的)
select *from emp order by salary id;    (先按salary,工资相同的再按id)


#可以使用desc 来指定为降序
select *from emp order by salary desc;

select *from emp order by id desc,salary desc;
mysql> select *from emp order by salary;
+------+-----------+------+--------+--------+--------+
| id   | name      | sex  | dept   | job    | salary |
+------+-----------+------+--------+--------+--------+
|    2 | 张飞      | 男   | 市场   | 员工   |   3000 |
|    3 | 关羽      | 男   | 市场   | 员工   |   4000 |
|    6 | 小乔      | 女   | 行政   | 员工   |   4000 |
|    5 | 周瑜      | 男   | 行政   | 员工   |   5000 |
|    1 | 刘备      | 男   | 市场   | 总监   |   5800 |
|    4 | 孙权      | 男   | 行政   | 总监   |   6000 |
|    8 | 司马懿    | 男   | 财务   | 员工   |   6000 |
|    7 | 曹操      | 男   | 财务   | 总监   |  10000 |
+------+-----------+------+--------+--------+--------+


mysql> select *from emp order by salary desc;           
+------+-----------+------+--------+--------+--------+
| id   | name      | sex  | dept   | job    | salary |
+------+-----------+------+--------+--------+--------+
|    7 | 曹操      | 男   | 财务   | 总监   |  10000 |
|    4 | 孙权      | 男   | 行政   | 总监   |   6000 |
|    8 | 司马懿    | 男   | 财务   | 员工   |   6000 |
|    1 | 刘备      | 男   | 市场   | 总监   |   5800 |
|    5 | 周瑜      | 男   | 行政   | 员工   |   5000 |
|    3 | 关羽      | 男   | 市场   | 员工   |   4000 |
|    6 | 小乔      | 女   | 行政   | 员工   |   4000 |
|    2 | 张飞      | 男   | 市场   | 员工   |   3000 |
+------+-----------+------+--------+--------+--------+





mysql> select *from emp order by salary desc,id desc;
+------+-----------+------+--------+--------+--------+
| id   | name      | sex  | dept   | job    | salary |
+------+-----------+------+--------+--------+--------+
|    7 | 曹操      | 男   | 财务   | 总监   |  10000 |
|    8 | 司马懿    | 男   | 财务   | 员工   |   6000 |
|    4 | 孙权      | 男   | 行政   | 总监   |   6000 |
|    1 | 刘备      | 男   | 市场   | 总监   |   5800 |
|    5 | 周瑜      | 男   | 行政   | 员工   |   5000 |
|    6 | 小乔      | 女   | 行政   | 员工   |   4000 |
|    3 | 关羽      | 男   | 市场   | 员工   |   4000 |
|    2 | 张飞      | 男   | 市场   | 员工   |   3000 |
+------+-----------+------+--------+--------+--------+
8 rows in set (0.00 sec)
View Code

7、限制查询的记录数   limit

#select *from emp limit a,b;
    a表示起始位置
    b表示获取的条数
mysql> select *from emp
    -> ;
+------+-----------+------+--------+--------+--------+
| id   | name      | sex  | dept   | job    | salary |
+------+-----------+------+--------+--------+--------+
|    1 | 刘备      | 男   | 市场   | 总监   |   5800 |
|    2 | 张飞      | 男   | 市场   | 员工   |   3000 |
|    3 | 关羽      | 男   | 市场   | 员工   |   4000 |
|    4 | 孙权      | 男   | 行政   | 总监   |   6000 |
|    5 | 周瑜      | 男   | 行政   | 员工   |   5000 |
|    6 | 小乔      | 女   | 行政   | 员工   |   4000 |
|    7 | 曹操      | 男   | 财务   | 总监   |  10000 |
|    8 | 司马懿    | 男   | 财务   | 员工   |   6000 |
+------+-----------+------+--------+--------+--------+
8 rows in set (0.00 sec)

--------------------------------
mysql> select *from emp limit 0,3;
+------+--------+------+--------+--------+--------+
| id   | name   | sex  | dept   | job    | salary |
+------+--------+------+--------+--------+--------+
|    1 | 刘备   | 男   | 市场   | 总监   |   5800 |
|    2 | 张飞   | 男   | 市场   | 员工   |   3000 |
|    3 | 关羽   | 男   | 市场   | 员工   |   4000 |
+------+--------+------+--------+--------+--------+
3 rows in set (0.00 sec)

mysql> select *from emp limit 3,3;
+------+--------+------+--------+--------+--------+
| id   | name   | sex  | dept   | job    | salary |
+------+--------+------+--------+--------+--------+
|    4 | 孙权   | 男   | 行政   | 总监   |   6000 |
|    5 | 周瑜   | 男   | 行政   | 员工   |   5000 |
|    6 | 小乔   | 女   | 行政   | 员工   |   4000 |
+------+--------+------+--------+--------+--------+
3 rows in set (0.00 sec)
练习

8、正则表达式匹配(也是模糊匹配)

# like 只有 % 和 _  灵活度没有 regexp高

#语法:
 select *from emp regexp "表达式";
 select *from emp where name regexp ".*ba$";

 

----------------------------------------------------------------------

用户管理

  mysql用户指的是和客户端连接服务器时使用的账户

  在一些公司中,很多项目的数据  可能会放在同一个服务器

  那就必须要为每一个用户明确其所拥有的权限

  通常  到公司之后  都会给你个一个账号的名称和密码  并且 为你制定可以访问哪些数据库和表

  对用户这个账号的增删改查,以及权限的增删改查

  mysql与权限相关的表

    user

数据库30分

​    设计图书管理系统,图书表包含,书名,售价,出版社,页数,作者信息

​    其中包含作者信息管理,作者表包含,姓名,年龄,性别,国籍信息

 

​    1.创建图书数据库

​    2.创建相关的表

​    3.添加作者信息

​    莫言,男,65,中国

​    尼古拉·奥斯特洛夫斯基,女,65,USA

​    金庸,男,94,中国

​    古龙,男,48中国

 

​    4.添加 图书信息 提示 先添加图书信息 到图书表 在添加关系到中间表

​    绝代双骄,68元,500页,(古龙,金庸)

​    射雕英雄传,198元,800页,(金庸)

​    钢铁是怎样炼成的,88元,300页,    (尼古拉·奥斯特洛夫斯基,古龙)

​    丰乳肥臀,78元,200页,(莫言)
练习1
mysql> create database book_db charset utf8;
Query OK, 1 row affected (0.16 sec)

mysql> use book_db;
Database changed

mysql> create table author(
    -> id int primary key auto_increment,
    -> name varchar(20),
    -> sex enum("","") not null,
    -> age int,
    -> nationnality varchar(20));
Query OK, 0 rows affected (2.19 sec)



mysql> insert into author value(1,"莫言","",65,"中国");
Query OK, 1 row affected (1.87 sec)

mysql> insert into author value(2,"尼古拉斯",65,"USA");
ERROR 1136 (21S01): Column count doesn't match value count at row 1

mysql> insert into author value(2,"尼古拉斯","",65,"USA");
Query OK, 1 row affected (1.84 sec)


mysql> insert into author value(3,"金庸","",94,"中国");
Query OK, 1 row affected (0.13 sec)

mysql> insert into author value(4,"古龙","",48,"中国");
Query OK, 1 row affected (0.14 sec)





mysql> create table book(
    -> id int primary key auto_increment,
    -> book_name varchar(20),
    -> book_price int,
    -> num int);
Query OK, 0 rows affected (2.04 sec)


mysql>
mysql> insert into book values(
    -> 1,"绝代双骄",68,500),
    -> (2,"​射雕英雄传",198,800),
    -> (3,"钢铁是怎样炼成的",88,300),
    -> (4,"丰乳肥臀",78,200);




mysql> create table book_author(
    ->     id int primary key auto_increment,
    ->     book_id int,
    ->     author_id int
    -> );
Query OK, 0 rows affected (2.05 sec)


mysql> insert into book_author values(null,1,3),(null,1,4),(null,2,3),(null,3,2),
    -> (null,3,4),(null,4,1);
Query OK, 6 rows affected (1.79 sec)
Records: 6  Duplicates: 0  Warnings: 0


mysql> select *from author join book join book_author
    -> on book_id = book.id and author_id = author.id
    -> where author.name = "金庸";





mysql> select *from author join book join book_author
    -> on book_id = book.id and author_id = author.id
    -> where book.book_name = "绝代双骄";



mysql> delete from book where book_name = "钢铁是怎样炼成的";
Query OK, 1 row affected (1.86 sec)

mysql>
mysql>
mysql> delete from book_author where id = 1;
Query OK, 1 row affected (1.87 sec)
练习1答案
原文地址:https://www.cnblogs.com/pdun/p/10536656.html