乐趣区

关于mysql:my-sql

SQL 面试题

**1.

DDL:数据定义语言 create table …/ drop table … / rename … to…./ truncate table…/alter table …
DML : 数据操纵语言 **

insert into … values … update … set … where … delete from … where …

2.

select 查问后果 如: [学号, 均匀问题:组函数 avg(问题)] _from_ 从哪张表中查找数据 如:[波及到问题:成绩表 score] _where_ 查问条件 如:[b. 课程号 =’0003′ and b. 问题 >80] _group by_ 分组 如: 每个学生的均匀:按学号分组,MySQL 中能够不必 _having_ 对分组后果指定条件 如:[大于 60 分] _order by_ 对查问后果排序 如:[增序: 问题 ASC / 降序: 问题 DESC];**

limit 应用 limt 子句返回 topN(对应这个问题返回的问题前两名)如:[limit 2 _==> 从 0 索引开始读取 2 个_] limit==> 从 0 索引开始 [0,N-1]

① select * from table limit 2,1;
// 含意是跳过 2 条取出 1 条数据,limit 前面是从第 2 条开始读,读取 1 条信息,即读取第 3 条数据
② select * from table limit 2 offset 1;

// 含意是从第 1 条(不包含)数据开始取出 2 条数据,limit 前面跟的是 2 条数据,offset 前面是从第 1 条开始读取,即读取第 2,3 条

组函数_: 去重 _distinct() 统计总数_sum()_ 计算个数_count()_ 平均数_avg()_ 最大值_max()_ 最小数_min()_

多表连贯: 内连贯 _(__省略默认__inner__) join_ …_on_.. 左连贯_left join_ tableName _as_ b _on_ a.key ==b.key 右连贯_right join_ 连贯_union(无反复(过滤去重)_) 和_union all(有反复[不过滤去重]_)

3. 日期

4.– 问题:查问工资大于 149 号员工工资的员工的信息

select * from employees where salary>(select salary from employees where employees_id =149)

5.Insert
1 用法

在规范的 SQL 语句中,一次插入一条记录的 INSERT 语句只有一种模式。

INSERT INTO tablename(列名…) VALUES(列值);

而在 MySQL 中还有另外一种模式。

INSERT INTO tablename SET column_name1 = value1, column_name2 = value2,…;

第一种办法将列名和列值离开了,在应用时,列名必须和列值的数统一。如上面的语句向 users 表中插入了一条记录:

INSERT INTO users(id, name, age) VALUES(123, ‘ 姚明 ’, 25);

第二种办法容许列名和列值成对呈现和应用,如上面的语句将产生同样的成果。

INSERT INTO users SET id = 123, name = ‘ 姚明 ’, age = 25;

2 不同点

(1): 如果应用了 SET 形式,必须至多为一列赋值。如果某一个字段应用了省缺值(如默认或自增值),这两种办法都能够省略这些字段。如 id 字段上应用了自增值,下面两条语句能够写成如下模式:

INSERT INTO users (name, age) VALUES(‘ 姚明 ’,25);
INSERT INTO uses SET name = ‘ 姚明 ’, age = 25;

(2)MySQL 在 VALUES 上也做了些变动。如果 VALUES 中什么都不写,那 MySQL 将应用表中每一列的默认值来插入新记录。

INSERT INTO users () VALUES();

如果 表名 后什么都不写,就示意向表中所有的字段赋值。应用这种形式,不仅在 VALUES 中的值要和列数统一,而且程序不能颠倒。INSERT INTO users VALUES(123, ‘ 姚明 ’, 25);

如果将 INSERT 语句写成如下模式 MySQL 将会报错。如:

INSERT INTO users VALUES(‘ 姚明 ’,25)

(3)规范的 INSERT 语句容许一次插入多条数据,set 不行

INSERT INTO users (name, age) VALUES(‘ 姚明 ’,25),(‘ 麦蒂 ’,25)

6. 首字母大写

SELECT

dname,

SUBSTR(dname,1,1),UPPER(SUBSTR(dname,1,1)),

SUBSTR(dname,2,LENGTH(dname)),

CONCAT(UPPER(SUBSTR(dname,1,1)),SUBSTR(dname,2,LENGTH(dname)))

FROM dept;

7.mysql 日期
mysql 工夫日期类型

示意工夫值的日期和工夫类型为 DATETIME、DATE、TIMESTAMP、TIME 和 YEAR。

每个工夫类型有一个有效值范畴和一个 ” 零 ” 值,当指定不非法的 MySQL 不能示意的值时应用 ” 零 ” 值。

TIMESTAMP 类型有专有的自动更新个性。

类型

大小(字节)

范畴

格局

用处

DATE

3

1000-01-01/9999-12-31

YYYY-MM-DD

日期值

TIME

3

‘-838:59:59’/’838:59:59’

HH:MM:SS

工夫值或持续时间

YEAR

1

1901/2155

YYYY

年份值

DATETIME

8

1000-01-01 00:00:00/9999-12-31 23:59:59

YYYY-MM-DD HH:MM:SS

混合日期和工夫值

TIMESTAMP

4

1970-01-01 00:00:00/2038 完结工夫是第 2147483647 秒,北京工夫 2038-1-19 11:14:07,格林尼治工夫 2038 年 1 月 19 日 凌晨 03:14:07

YYYYMMDD HHMMSS

混合日期和工夫值,工夫戳

now()函数 存储的模式 DATETIME

select YEAR(bithday) AS 年,MONTH(brihtday)月,DAY(brithday)日 from student;

7.1 date_format

日期转字符串,留神格局的大小写,不错谬误

SELECT DATE_FORMAT(NOW(),’%Y-%m-%d’)

SELECT DATE_FORMAT(NOW(),’%Y-%m-%d %H:%i:%s’)

7.2 str_to_date

字符串转日期

SELECT STR_TO_DATE(‘2020-05-08′,’%Y-%m-%d’) FROM emp

ps1:

两个工夫串能够进行比拟,但不能够间接进行加减,须要调用工夫加减的函数实现。

ps2:
1. 咱们公司也是把业务日期设置为了 varchar 类型,不倡议这么设置。

如果是日期,倡议应用 date 类型,如果还须要有工夫局部,倡议应用它 datetime

因为如果用 varchar 来存储年月日,那么须要 10 个字节,而 date 类型只需 4 个字节,而 datetime 类型也只须要 8 个字节,都小于 varchar 类型。

其次,在进行查找、比拟时,因为 date 和 datetime 实质上存储在数据库中是一个数字,所以间接通过数值比拟效率很高,而 varchar 进行比拟 必须要一个字符一个字符比拟,所以速度很慢。

2. 将工夫设置成 string 是偷懒的做法。尽管在 string 类型还是能够进行比拟,如小于大于等于,问题如下:
  1. string 类型的字节数大小远大于 datetime 等类型,造成空间节约,datetime 实质上是双 int 型;
  2. String 类型的日期格局固定,无奈像 datetime 一样调整显示格局,不同格局要进行 join,须要两次类型转换;
  3. String 类型无奈解决时区等信息;

8. 年薪统计

公司福利不错 13 薪,年底双薪,统计员工的年薪 =sal_13+comm_13

副总不按月奖金计算

SELECT empno,ename,job,sal_13+comm_13 FROM emp;

SELECT empno,ename,job,sal_13+nvl(comm_13,0) FROM emp;

SELECT empno,ename,job,sal_13+nvl(comm_13,0) AS 年收入 FROM emp;

SELECT empno,ename,job,sal_13+nvl(comm_13,0) AS ‘ 年收入 ’ FROM emp;

SELECT empno,ename,job,sal_13+nvl(comm_13,0) AS “ 年收入 ” FROM emp;

计算时字段为数值类型应该按 0 来计算,按 null 达不到咱们预期成果。

ps:nvl()sql 中的代替函数

退出移动版