mysql题目修改语句_mysql常用语句及实题训练

基本语句操作

创建数据库:

create database database-name

1

删除数据库:

drop database database-name

1

修改数据名:

RENAME DATABASE db_name TO new_db_name

1

创建新表:

create table table-name(

col1-name type1 [not null] [primary key] [auto_increment],

col2-name type2 ,

……

)

1

2

3

4

5

auto_increment ->自动增长,只针对数值类型

根据旧表创建新表:

create table table_name like table_old_name

1

create table table_name as select col1,col2... from table_old_name;

1

删除表:

drop table table_name;

1

修改表名:

alter table table_name rename table_new_name;

1

增加一个列:

alter table table_name add column col type [not null] ...;

1

删除一个列:

alter table table_name drop column col_name;

1

修改列名:

alter table table_name change column col_old_name col_new_name type [not null]...;

1

修改列的属性:

alter table table_name change column col_old_name col_old_name type [not null]...;

1

选择:

select * from table_name where ...

1

插入:

insert into table_name(col1_name,col2_name...) values(...);

1

拷贝表所有数据:

insert into table1_name(table1_name.col1_name,table1_name.col2_name...) select table2_name.col1_name,

table2_name.col_name...

from table2_name

1

2

3

跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)

insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件

1

删除:

delect from table_name where

1

更新:

update table_name set col1_nameee=value ...where ...

1

查找:

select * from table_name where ...

1

排序:

select * from table_name order by col1_name asc/desc;

1

asc 升序

desc 降序

总数:

select count(*|col_name) as count_name from table_name where ...

1

求和:

select sum(col_name) as sum_name from table_name where ...

1

求均值:

select avg(col_name) as avg_name from table_name where ...

1

最大:

select max(col_name) as max_name from table_name where ...

1

最小:

select min(col_name) as min_name from table_name where ...

1

union和union all

UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。

UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。

同时,每条 SELECT 语句中的列的顺序必须相同.

**注释:另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

注意:1、UNION 结果集中的列名总是等于第一个 SELECT 语句中的列名

2、UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同

**

union的用法及注意事项

union:联合的意思,即把两次或多次查询结果合并起来。

要求:两次查询的列数必须一致

推荐:列的类型可以不一样,但推荐查询的每一列,想对应的类型以一样

可以来自多张表的数据:多次sql语句取出的列名可以不一致,此时以第一个sql语句的列名为准。

如果不同的语句中取出的行,有完全相同(这里表示的是每个列的值都相同),那么union会将相同的行合并,最终只保留一行。也可以这样理解,union会去掉重复的行。

如果不想去掉重复的行,可以使用union all。

如果子句中有order by,limit,需用括号()包起来。推荐放到所有子句之后,即对最终合并的结果来排序或筛选。

SELECT column_name FROM table1

UNION

SELECT column_name FROM table2

1

2

3

Join语法概述

JOIN 按照功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录。

select * from table1_name inner join table2_name on teable1_name.col = teable2_name.col where ...

1

1ff5feca7e463566711501e81fc4188d.png

select * from table1_name inner join table2_name on teable1_name.col = teable2_name.col where table1_name.col is null or table2_name.col is null and...

1

214dee39c1e600c28fe9fe344b593bda.png 

LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录。

select * from table1_name left join table2_name on teable1_name.col = teable2_name.col where ...

1

23e0e127f5d8049a5e0f1654e8e9b2f8.png

select * from table1_name inner join table2_name on teable1_name.col = teable2_name.col where teable2_name.col is null and ...

1

08977e1e4f5c93729530095a6574f007.png 

RIGHT JOIN(右连接):与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录。

Full join:

select * from A left join B on B.name = A.name

union

select * from A right join B on B.name = A.name;

1

2

3

9fa8651a838ec7a7963cf83405183acf.png

分组:

select *|count,avg,sum,max,min from table_name group by table_name.col_name

1

子查询:

#in

select * from table1_name where tabel1_name.col1 in (

select table2_name.col1 from teable2_name where...

)

#not in

select * from table1_name where tabel1_name.col1 not in (

select table2_name.col1 from teable2_name where...

)

1

2

3

4

5

6

7

8

between 数值1 and 数值2

select * from table_name where table_name.col between 数值1 and 数值2

1

not between 数值1 and 数值2

select * from table_name where table_name.col between 数值1 and 数值2

1

两张关联表,删除主表中已经在副表中没有的信息:

delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

1

limit 返回前几条或者中间某几行数据

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

1

having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。

例:

SELECT region, SUM(population), SUM(area)

FROM bbc

GROUP BY region

HAVING SUM(area)>1000000

1

2

3

4

去重:

有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录。

select distinct col_name from table_name;

1

实题训练

第一题:

查找最晚入职员工的所有信息

CREATE TABLE `employees` (

`emp_no` int(11) NOT NULL,

`birth_date` date NOT NULL,

`first_name` varchar(14) NOT NULL,

`last_name` varchar(16) NOT NULL,

`gender` char(1) NOT NULL,

`hire_date` date NOT NULL,

PRIMARY KEY (`emp_no`));

输入描述:

输出描述:

emp_nobirth_datefirst_namelast_namegenderhire_date

10008

1958-02-19

Saniya

Kalloufi

M

1994-09-15

题解:

select * from employees order by hire_date desc limit 0,1;

1

2

第二题:

查找入职员工时间排名倒数第三的员工所有信息

CREATE TABLE `employees` (

`emp_no` int(11) NOT NULL,

`birth_date` date NOT NULL,

`first_name` varchar(14) NOT NULL,

`last_name` varchar(16) NOT NULL,

`gender` char(1) NOT NULL,

`hire_date` date NOT NULL,

PRIMARY KEY (`emp_no`));

输入描述:

输出描述:

emp_nobirth_datefirst_namelast_namegenderhire_date

10005

1955-01-21

Kyoichi

Maliniak

M

1989-09-12

select * from employees order by hire_date desc limit 2,1;

1

第三题:

查找各个部门当前(to_date=’9999-01-01’)领导当前薪水详情以及其对应部门编号dept_no

CREATE TABLE `dept_manager` (

`dept_no` char(4) NOT NULL,

`emp_no` int(11) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`dept_no`));

CREATE TABLE `salaries` (

`emp_no` int(11) NOT NULL,

`salary` int(11) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

输出描述:

emp_nosalaryfrom_dateto_datedept_no

10002

72527

2001-08-02

9999-01-01

d001

10004

74057

2001-11-27

9999-01-01

d004

10005

94692

2001-09-09

9999-01-01

d003

10006

43311

2001-08-02

9999-01-01

d002

10010

94409

2001-11-23

9999-01-01

d006

select salaries.*,dept_manager.dept_no from salaries, dept_manager

where salaries.emp_no = dept_manager.emp_no

and salaries.to_date = "9999-01-01"

and dept_manager.to_date = "9999-01-01";

1

2

3

4

第四题:

查找所有已经分配部门的员工的last_name和first_name

CREATE TABLE `dept_emp` (

`emp_no` int(11) NOT NULL,

`dept_no` char(4) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`dept_no`));

CREATE TABLE `employees` (

`emp_no` int(11) NOT NULL,

`birth_date` date NOT NULL,

`first_name` varchar(14) NOT NULL,

`last_name` varchar(16) NOT NULL,

`gender` char(1) NOT NULL,

`hire_date` date NOT NULL,

PRIMARY KEY (`emp_no`));

输入描述:

输出描述:

last_namefirst_namedept_no

Facello

Georgi

d001

省略

省略

省略

Piveteau

Duangkaew

d006

select last_name,first_name,dept_emp.dept_no from employees,dept_emp where employees.emp_no=dept_emp.emp_no;

1

第五题:

查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工

CREATE TABLE `dept_emp` (

`emp_no` int(11) NOT NULL,

`dept_no` char(4) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`dept_no`));

CREATE TABLE `employees` (

`emp_no` int(11) NOT NULL,

`birth_date` date NOT NULL,

`first_name` varchar(14) NOT NULL,

`last_name` varchar(16) NOT NULL,

`gender` char(1) NOT NULL,

`hire_date` date NOT NULL,

PRIMARY KEY (`emp_no`));

输入描述:

输出描述:

last_namefirst_namedept_no

Facello

Georgi

d001

省略

省略

省略

Sluis

Mary

NULL(在sqlite中此处为空,MySQL为NULL)

select employees.last_name,employees.first_name,dept_emp.dept_no from employees left join dept_emp

on employees.emp_no=dept_emp.emp_no;

1

2

第六题:

查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序

CREATE TABLE `employees` (

`emp_no` int(11) NOT NULL,

`birth_date` date NOT NULL,

`first_name` varchar(14) NOT NULL,

`last_name` varchar(16) NOT NULL,

`gender` char(1) NOT NULL,

`hire_date` date NOT NULL,

PRIMARY KEY (`emp_no`));

CREATE TABLE `salaries` (

`emp_no` int(11) NOT NULL,

`salary` int(11) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

输出描述:

emp_nosalary

10011

25828

省略

省略

10001

60117

select employees.emp_no,salaries.salary from employees

inner join salaries on employees.emp_no = salaries.emp_no where employees.hire_date = salaries.from_date order by employees.emp_no desc;

1

2

第七题:

查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t

CREATE TABLE `salaries` (

`emp_no` int(11) NOT NULL,

`salary` int(11) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

输出描述:

emp_not

10001

17

10004

16

10009

18

select salaries.emp_no,count(salaries.salary) as t from salaries group by salaries.emp_no

having count(salaries.salary)> 15;

1

2

第八题:

找出所有员工当前(to_date=’9999-01-01’)具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示

CREATE TABLE `salaries` (

`emp_no` int(11) NOT NULL,

`salary` int(11) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

输出描述:

salary

94692

94409

88958

88070

74057

72527

59755

43311

25828

select salaries.salary from salaries where to_date='9999-01-01' group by salary order by salary desc;

1

第九题:

获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date=’9999-01-01’

CREATE TABLE `dept_manager` (

`dept_no` char(4) NOT NULL,

`emp_no` int(11) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`dept_no`));

CREATE TABLE `salaries` (

`emp_no` int(11) NOT NULL,

`salary` int(11) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

输出描述:

dept_noemp_nosalary

d001

10002

72527

d004

10004

74057

d003

10005

94692

d002

10006

43311

d006

10010

94409

select dm.dept_no,dm.emp_no,s.salary

from salaries s, dept_manager dm

where s.emp_no=dm.emp_no and dm.to_date='9999-01-01' and s.to_date='9999-01-01'

1

2

3

第十题:

获取所有非manager的员工emp_no

CREATE TABLE `dept_manager` (

`dept_no` char(4) NOT NULL,

`emp_no` int(11) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`dept_no`));

CREATE TABLE `employees` (

`emp_no` int(11) NOT NULL,

`birth_date` date NOT NULL,

`first_name` varchar(14) NOT NULL,

`last_name` varchar(16) NOT NULL,

`gender` char(1) NOT NULL,

`hire_date` date NOT NULL,

PRIMARY KEY (`emp_no`));

输入描述:

输出描述:

emp_no

10001

10003

10007

10008

10009

10011

select emp_no from employees where employees.emp_no not in (

select emp_no from dept_manager

);

1

2

3

第十一题:

获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date=’9999-01-01’。

结果第一列给出当前员工的emp_no,第二列给出其manager对应的manager_no。

CREATE TABLE `dept_emp` (

`emp_no` int(11) NOT NULL,

`dept_no` char(4) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`dept_no`));

CREATE TABLE `dept_manager` (

`dept_no` char(4) NOT NULL,

`emp_no` int(11) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`dept_no`));

输入描述:

输出描述:

emp_nomanager_no

10001

10002

10003

10004

10009

10010

select dept_emp.emp_no,dept_manager.emp_no as manager_no from dept_emp left join dept_manager

on dept_emp.dept_no = dept_manager.dept_no where dept_emp.emp_no!=dept_manager.emp_no

and dept_emp.to_date='9999-01-01' and dept_manager.to_date='9999-01-01';

1

2

3

第十二题:

获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary

CREATE TABLE `dept_emp` (

`emp_no` int(11) NOT NULL,

`dept_no` char(4) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`dept_no`));

CREATE TABLE `salaries` (

`emp_no` int(11) NOT NULL,

`salary` int(11) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

输出描述:

dept_noemp_nosalary

d001

10001

88958

d002

10006

43311

d003

10005

94692

d004

10004

74057

d005

10007

88070

d006

10009

95409

select dept_emp.dept_no,dept_emp.emp_no,max(salaries.salary) as salary

from dept_emp,salaries where dept_emp.emp_no=salaries.emp_no and dept_emp.to_date='9999-01-01'

and salaries.to_date='9999-01-01' group by dept_emp.dept_no;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL是最常用的关系型数据库管理系统之一,可以使用SQL语言来管理和操作数据库。下面是一些常用MySQL建表SQL语句。 1. 创建数据库: CREATE DATABASE database_name; 2. 使用数据库: USE database_name; 3. 创建表: CREATE TABLE table_name ( column1 datatype constraint, column2 datatype constraint, ... ); 4. 添加主键: ALTER TABLE table_name ADD PRIMARY KEY (column_name); 5. 添加外键: ALTER TABLE table_name ADD CONSTRAINT FK_name FOREIGN KEY (foreign_key_column) REFERENCES parent_table (primary_key_column); 6. 添加索引: CREATE INDEX index_name ON table_name (column_name); 7. 插入数据: INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); 8. 更新数据: UPDATE table_name SET column1 = new_value1, column2 = new_value2 WHERE condition; 9. 删除数据: DELETE FROM table_name WHERE condition; 10. 查询数据: SELECT column1, column2, ... FROM table_name WHERE condition; 以上仅是MySQL建表和数据操作的基本语句,还有许多其他的高级用法和语法,可以根据具体需求进一步学习和掌握。MySQL提供了强大的数据管理功能,使得对数据的存储和查询变得更加高效和方便。 ### 回答2: MySQL建表是通过使用SQL语句来创建一个新的数据库表。下面是一个简单的例子来说明如何使用SQL语句来创建MySQL表。 首先,我们需要打开MySQL命令行界面或图形界面工具,然后选择要创建表的数据库。假设我们已经选择了名为"mydatabase"的数据库。 接下来,我们可以使用CREATE TABLE语句来创建一个新的表。以下是一个示例的CREATE TABLE语句: CREATE TABLE mytable ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT, email VARCHAR(100) ); 在上面的示例中,我们创建了一个名为"mytable"的表,在该表中包含了四个列。第一列是"id",它是整数类型,并且设置为自动增加。它还被指定为主键,这意味着每个条目都有一个唯一的id值。第二列是"name",它是一个可变长度的字符列,最大长度为50个字符。第三列是"age",它是一个整数类型。第四列是"email",它是一个可变长度的字符列,最大长度为100个字符。 CREATE TABLE语句中的其他选项可以根据需要进行更改和添加。例如,我们可以指定列的约束、索引、默认值等。 在完成CREATE TABLE语句后,我们可以执行它来创建新的表。然后,我们可以使用ALTER TABLE语句修改表结构,例如添加新的列、删除列或更改列的数据类型。使用INSERT INTO语句可以向表中插入数据,使用SELECT语句可以检索表中的数据。 总结起来,MySQL建表的过程包括选择数据库、使用CREATE TABLE语句创建表、使用ALTER TABLE语句修改表结构(可选)、使用INSERT INTO语句插入数据,以及使用SELECT语句检索数据。 ### 回答3: MySQL是一种广泛使用的关系型数据库管理系统,建表是在MySQL中创建数据表的过程。建表是通过执行SQL语句来实现的。 建表的SQL语句包括CREATE TABLE语句和相关的列定义。 CREATE TABLE语句的一般格式如下: CREATE TABLE 表名 ( 列名1 数据类型1, 列名2 数据类型2, ... ); 其中,表名是我们要创建的数据表的名称。列名是数据表中的每一列的名称。数据类型定义了每一列所存储的数据的类型,如整数、字符、日期等。 例如,我们要创建一个名为“users”的数据表,包含id、name和age三个列,可以使用如下的建表语句: CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT ); 上述建表语句中,id列使用INT数据类型,表示整数,并设置为主键(PRIMARY KEY),同时使用AUTO_INCREMENT属性来自动增加其值。name列使用VARCHAR(50)数据类型,表示最大长度为50的字符。age列使用INT数据类型,表示整数。 建表语句中还可以使用多种约束条件来约束列的取值范围,如NOT NULL表示该列不允许为空值,UNIQUE表示该列的值是唯一的,DEFAULT表示该列的默认值等。 通过执行建表语句,我们可以在MySQL中创建一个符合我们需求的数据表,供我们存储和管理数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值