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中的代替函数