MySQL40-51:union/limit/表的增删查改

开始时间:2021-03-10

union

找出工作岗位是salesman和manager的员工

mysql> select * from emp e where job='salesman' or job='manager';
//两组代码等价
mysql> select * from emp e where job in('salesman','manager');
+-------+--------+----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB      | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+----------+------+------------+---------+---------+--------+
|  7499 | ALLEN  | SALESMAN | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER  | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER  | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER  | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
+-------+--------+----------+------+------------+---------+---------+--------+

用union的方式求并集

mysql> select * from emp e where job='salesman' union select * from emp e where job='manager';
+-------+--------+----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB      | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+----------+------+------------+---------+---------+--------+
|  7499 | ALLEN  | SALESMAN | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7566 | JONES  | MANAGER  | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7698 | BLAKE  | MANAGER  | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER  | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
+-------+--------+----------+------+------------+---------+---------+--------+

union的好处在于可以拼接两张不相关的表格

limit

limit是mysql特有的,其他数据库不通用
limit startindex,length

案例:取出工资排名前五的员工

mysql> select ename,sal from emp order by sal desc limit 0,5;
+-------+---------+
| ename | sal     |
+-------+---------+
| KING  | 5000.00 |
| SCOTT | 3000.00 |
| FORD  | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
+-------+---------+

找出排名是4到9的员工

mysql> select ename ,sal from emp order by sal limit 3,6;//6指的是6个数据
+--------+---------+
| ename  | sal     |
+--------+---------+
| WARD   | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN  | 1600.00 |
| CLARK  | 2450.00 |
+--------+---------+

分页

limit pageSize*(pageNo-1),pageSize
pageNo 第几页
pageSize 每页显示 条数

创建表

建表语句的语法格式:
create tabie表名(
字段名1数据类型,
字段名2数据类型,
字段名3数据类型,
) ;

关于MysQL当中字段的数据类型?以下只说常见的

int整数型(ava中的int)
bigint长整型(java中的1ong)
f1oat浮点型(ava中的f1oat double)char定长字符串(string)
varchar可变长字符串(stringBuffer/stringBuilder)
date日期类型(对应Java中的java.sq1.Date类型)
BLOB二进制大对象(存储图片、视频等流媒体信息)Binary Large 0Bject(对应java中的object)
CLOB字符大对象(存储较大文本,比如,可以存储4c的字符串。) character Large oBject(对应java中的object)

char和varchar怎么选择?
在实际的开发中,当某个字段中的数据长度不发生改变的时候,是定长的,例如:性别、生日等都是采用char。当一个字段的数据长度不确定,例如:简介、姓名等都是采用varchar.

BLOB和CLOB类型的使用?
电影表:t movie

id(int)name (varchar)playtime (date/ char)poster(BLOB)story (CLOB)
1蜘蛛侠
2
3

表名在数据库当中一般建议以:t_或者tb1_开始。

创建学生表

create table t_student (
no bigint,
name varchar(255),
sex char(1),
classno varchar (255),
birth char (10)
);

mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| dept                      |
| emp                       |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| salgrade                  |
| servers                   |
| slow_log                  |
| t_student                 |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
mysql> desc t_student;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| no      | bigint(20)   | YES  |     | NULL    |       |
| name    | varchar(255) | YES  |     | NULL    |       |
| sex     | char(1)      | YES  |     | NULL    |       |
| classno | varchar(255) | YES  |     | NULL    |       |
| birth   | char(10)     | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+

插入数据

mysql> insert into t_student(no,name,sex,classno,birth)values(5,'lisi',1,'grade 3','2000-01-01');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t_student;
+------+------+------+---------+------------+
| no   | name | sex  | classno | birth      |
+------+------+------+---------+------------+
|    5 | lisi | 1    | grade 3 | 2000-01-01 |
+------+------+------+---------+------------+

values(…),(…)可以插多行数据

删库

mysql> drop table if exists t_student;
Query OK, 0 rows affected (0.02 sec)

建表的时候可以提供默认值

create table t_student (
no bigint,
name varchar(255),
sex char(1) default 1,
classno varchar (255),
birth char (10)
);
mysql> desc t_student;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| no      | bigint(20)   | YES  |     | NULL    |       |
| name    | varchar(255) | YES  |     | NULL    |       |
| sex     | char(1)      | YES  |     | 1       |       |
| classno | varchar(255) | YES  |     | NULL    |       |
| birth   | char(10)     | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+

表的复制

mysql> create table emp2 as select ename,job from emp;
Query OK, 14 rows affected (0.02 sec)
Records: 14  Duplicates: 0  Warnings: 0

mysql> select * from emp2;
+--------+-----------+
| ename  | job       |
+--------+-----------+
| SMITH  | CLERK     |
| ALLEN  | SALESMAN  |
| WARD   | SALESMAN  |
| JONES  | MANAGER   |
| MARTIN | SALESMAN  |
| BLAKE  | MANAGER   |
| CLARK  | MANAGER   |
| SCOTT  | ANALYST   |
| KING   | PRESIDENT |
| TURNER | SALESMAN  |
| ADAMS  | CLERK     |
| JAMES  | CLERK     |
| FORD   | ANALYST   |
| MILLER | CLERK     |
+--------+-----------+
mysql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+


mysql> create table mydept
    -> (deptno int,
    -> dname varchar(20),
    -> loc varchar(20)
    -> );
mysql> insert into mydept select * from dept;
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from mydept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+

修改数据 update

update 表名 set 字段名1=值1,字段名2=值2… where 条件;
注意:字段之间用逗号隔开,不能用and
如果没有条件的话,整张表都会更新

mysql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

mysql> update dept set loc='beijing' where dname='sales';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | beijing  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+

删除数据

delete from 表名 where条件;
没有条件就全部删除

mysql> delete from dept where loc='beijing';
Query OK, 1 row affected (0.01 sec)

mysql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     40 | OPERATIONS | BOSTON   |

删大表,发大招,删了找不回来那种,很快的。

truncate table XX;

mysql> truncate table emp2;
Query OK, 0 rows affected (0.01 sec)

修改表的结构

一般是通过可视化工具 操作
不会写代码直接改结构
增删改查CRUD操作(create,retrieve查,update,delete)

约束constraint

创建表的时候,给表的字段添加相应的约束,目的是保证表中数据的合法性、有效性、完整性。

非空约束(not null)约束的字段不能为NULL
唯一约束(unique)约束的字段不能重复
主键约束(primary key)约束的字段既不能为NULL,也不能重复(简称PK)
外键约束(foreign key)…简称(FK)
检查约束(check)注意oracle数据库有check约束,但是mysq1没有,目前mysql不支持该约束。

非空约束 not null

create

//创建新表
mysql> create table t_student 
(no bigint,name varchar(255),sex char(1) not null,birth char (10));
Query OK, 0 rows affected (0.01 sec)

//null字段变为了no,要求性别必须为非空
mysql> desc t_student;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| no    | bigint(20)   | YES  |     | NULL    |       |
| name  | varchar(255) | YES  |     | NULL    |       |
| sex   | char(1)      | NO   |     | NULL    |       |
| birth | char(10)     | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
//插入带sex的数据就ok了
mysql> insert into t_student(no,name,sex,birth)values(5,'lisi',1,'2000-01-01');

//插入不带sex 的数据会报错
mysql> insert into t_student(no,name,birth)values(5,'lisi','2000-01-01');
ERROR 1364 (HY000): Field 'sex' doesn't have a default value

Query OK, 1 row affected (0.01 sec)

mysql> select * from t_student;
+------+------+-----+------------+
| no   | name | sex | birth      |
+------+------+-----+------------+
|    5 | lisi | 1   | 2000-01-01 |
+------+------+-----+------------+
1 row in set (0.00 sec)

结束时间:2021-03-11

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值