共计 3514 个字符,预计需要花费 9 分钟才能阅读完成。
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 类型还是能够进行比拟,如小于大于等于,问题如下:
- string 类型的字节数大小远大于 datetime 等类型,造成空间节约,datetime 实质上是双 int 型;
- String 类型的日期格局固定,无奈像 datetime 一样调整显示格局,不同格局要进行 join,须要两次类型转换;
- 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 中的代替函数