文章目录
- 1. 连接
- 2. 数据库
- 3. 数据类型
- 4. 数据库表
- 5. WHERE 子句
- 6. 排序
- 7. 分组
- 8. JOIN 查询 (连接)
- 9. 事务
- 10. 函数
- 1.DATE_ADD()
- 2. DATE_SUB()
- 3. DATEDIFF()
- 4. DATE_FORMAT()
- 5. NOW()
- 6. CURDATE()
- 7. CURTIME()
- 8. DATE()
- 9. EXTRACT()
- 10. CONCAT()
- 11. CONCAT_WS()
- 12. GROUP_CONCAT()
- 13. REPEAT()
- 14. LEFT()
- 15. RIGHT()
- 16. SUBSTRING()
- 17. SUBSTRING_INDEX()
- 18. - 号
- 19. ABS(X)
- 20. SIGN(X)
- 21. MOD(N,M)
- 22. FLOOR(X)
- 23. CEILING(X)
- 24. ROUND(X) / ROUND(X,D)
- 25. DIV
- 26. EXP(X)
- 17. LN(X)
- 28. LOG(X) / LOG(B,X)
- 29. LOG2(X)
- 30. LOG10(X)
- 31. POW(X,Y)
- 31. SQRT(X)
- 32. PI()
- 33. COS(X)
- 34. SIN(X)
- 35. TAN(X)
- 36. ACOS(X)
- 37. ASIN(X)
- 38. ATAN(X)
- 39. ATAN(Y,X)
- 40. COT(X)
- 41. RAND() / RAND(N)
- 42. LEAST(X,Y,...)
- 43. GREATEST(X,Y,...)
- 44. DEGREES(X)
- 45. RADIANS(X)
- 46. TRUNCATE(X,D)
- 47. SUBSTR()
- 11. 索引
- 12. 批量插入数据
- 13. 练习
1. 连接
-- 启动 MySQL
net start mysql
-- 关闭 MySQL
net stop mysql
-- 登录
mysql -uroot -p123456
-- 退出
exit 或者 quit
-- 添加用户:先到 mysql 数据库,对 user 表进行操作即可
USE mysql;
INSERT INTO user(host,user,authentication_string,select_priv,insert_priv)
VALUES('127.0.0.1','root',PASSWORD('123456'),'Y','Y');
/*
1.MySQL 5.7 之前,authentication_string 用 password 表示
2.select_priv 这些表示的是用户具有的权限,'Y' 表示授予该权限给用户,此外还有 insert_priv、update_priv、delete_priv、create_priv、drop_priv、reload_priv、shutdown_priv、process_priv、file_priv、grant_priv、reference_priv、index_priv、after_priv
3.密码需要用 PASSWORD() 来加密
*/
-- 创建用户,最好是养成习惯,在用户名后面加上 @‘localhost’
CREATE USER root2 IDENTIFIED BY '123456';
-- 修改用户名,如果root2后面不加@‘localhost’,那么当需要填写用户名时也不用加@‘localhost’ 此时该用户 root2 的 host 字段值为 %,若有指定则 host 字段值为 localhost
RENAME USER ‘root’@‘localhost’ TO ‘root2’;
-- 修改密码
1.
mysqladmin -uroot -p123456 password 123 --亲测可用
2.
USE mysql;
UPDATE user SET authentication_string = PASSWORD('123456') WHERE user='root' AND host='localhost';
3.
set password for root@localhost = password('123');
-- 删除用户
DROP USER myuser;
-- 另一种给用户授予权限的写法
GRANT SELECT,INSERT,UPDATE ON mydatabase.* TO 'root'@'localhost';
-- 删除权限
REVOKE SELECT,INSERT,UPDATE ON mydatabase.* FROM 'root'@'localhost';
-- 查看权限
SHOW GRANTS FOR 'root'@'localhost';
2. 数据库
1. 创建数据库
-
使用 mysqladmin
mysqladmin -uroot -p123456 CREATE mysql2
-
登录后创建
CREATE DATABASE mysql2;
2. 删除数据库
-
使用 mysqladmin
mysqladmin -uroot -p123456 DROP mysql2
-
登录后删除
DROP DATABASE mysql2;
3. 使用数据库
-
登录后选择
USE mysql2;
3. 数据类型
数据库字段的数据类型与数据库优化息息相关
MySQL 支持的数据类型大致可以分为三类:数值 、日期/时间 和 字符类型
1.数值类型
2.日期与时间类型
3.字符类型
char 和 varchar 的比较:
- varchar 可以节省空间,但是性能上要比 char 差(varchar 在插入和删除的时候会保留末尾的空格)
- binary 和 varbinary 和 char 和 varchar 类似,只不过他们是存储 字节字符串 而不是 字符字符串
4. 数据库表
1. 创建表
CREATE TABLE hello (
id INT PRIMARY_KEY AUTO_INCREMENT DEFAULT 100,
name VARCHAR(11) NOT NULL COMMETNT '名字'
);
2. 删除数据库表
DROP TABLE table_name ;
3. 插入数据
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
4. 查询数据
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]
你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
你也可以使用 LIMIT 属性来设定返回的记录数。
5. 更新数据
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
若不指定where,则默认更新整张表
6. 删除数据
DELETE FROM table_name [WHERE Clause]
如果没有指定 WHERE 子句,MySQL表中的所有记录将被删除,这种情况下建议使用 TRUNCATE TABLE table_name
,这条语句会将整张表删除,然后重新建立一张一模一样的表但没有任何记录,如果要删除表的所有记录,它的效率比使用 delete 快
7. 删除字段
-- 使用 ALTER 命令及 DROP 子句来删除表的 i 字段
ALTER TABLE testalter_tbl DROP i;
8. 添加字段
-- 在表 testalter_tbl 中添加 i 字段,并定义数据类型
ALTER TABLE testalter_tbl ADD i INT;
如果需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl ADD i INT AFTER c;
9. 修改字段
修改字段有 MODIFY 和 CHANGE 子句
-- 把字段 c 的类型从 CHAR(1) 改为 CHAR(10)
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段的类型及名称
ALTER TABLE testalter_tbl CHANGE i j BIGINT;
-- 把字段 j 从 BIGINT 修改为 INT
ALTER TABLE testalter_tbl CHANGE j j INT;
10. ALTER 处理 NULL 值和默认值
当你修改字段时,你可以指定是否包含 NULL 值、是否设置默认值。
-- 指定字段 j 为 NOT NULL 且默认值为100
ALTER TABLE testalter_tbl
MODIFY j BIGINT NOT NULL DEFAULT 100;
如果你不设置默认值,MySQL会自动设置该字段默认为 NULL
另外,我们可以使用 ALTER 来修改字段的默认值
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
也可以使用 ALTER 命令及 DROP子句来删除字段的默认值
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; -- 删除后字段初始值变为 NULL
11. 修改表
将数据表 testalter_tbl 重命名为 alter_tbl
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
12. 查看数据表类型
语法是:SHOW TABLE STATUS LIKE table_name
,STATUS 后面需要跟过滤条件,否则会把数据库所有表都查询出来
SHOW TABLE STATUS LIKE 'testalter_tbl'\G
-- 结果
Name: testalter_tbl
Type: MyISAM
Row_format: Fixed
Rows: 0
Avg_row_length: 0
Data_length: 0
Max_data_length: 25769803775
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2007-06-03 08:04:36
Update_time: 2007-06-03 08:04:36
Check_time: NULL
Create_options:
Comment:
13. 复制表
如果我们需要完全的复制 MySQL 的数据表,包括表的结构,索引,默认值等。 如果仅仅使用CREATE TABLE … SELECT 命令,是无法实现的。
如何完整的复制 MySQL 数据表,步骤如下:
- 使用
HOW CREATE TABLE
命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。 - 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
- 如果你想复制表的内容,你就可以使用 INSERT INTO … SELECT 语句来实现。
案例:
复制表 w3cschool_tbl
- 获取数据表的完整结构
- 修改SQL语句的数据表名,并执行SQL语句
- 在数据库中创建新的克隆表 clone_tbl。 如果你想拷贝数据表的数据你可以使用 INSERT INTO… SELECT 语句来实现
执行以上步骤后,你将完整地复制表,包括表结构及表数据。
5. WHERE 子句
1. 基本操作符
2. 模糊查询
SELECT field1, field2,...fieldN
FROM table_name1, table_name2...
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
常和通配符 %
一起搭配使用
SELECT * from w3cschool_tbl
WHERE w3cschool_author LIKE '%jay';
SELECT * from w3cschool_tbl
WHERE w3cschool_author LIKE '%jay%';
SELECT * from w3cschool_tbl
WHERE w3cschool_author LIKE 'jay%';
SQL 中的通配符主要有两个:
1.%
:匹配单个字符
2. _
:匹配任意个字符,包括零个字符
3. NULL 值处理
为了处理空值,MySQL提供了三大运算符:
- IS NULL: 当列的值是NULL,此运算符返回true。
- IS NOT NULL: 当列的值不为NULL, 运算符返回true。
- <=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true。
在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false 。所以关于 NULL 值必须使用特殊的运算符
4. 正则表达式
举几个案例:
-- 查找name字段中以'st'为开头的所有数据
SELECT name FROM person_tbl WHERE name REGEXP '^st';
-- 查找name字段中以'ok'为结尾的所有数据
SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
-- 查找name字段中包含'mar'字符串的所有数据
SELECT name FROM person_tbl WHERE name REGEXP 'mar';
-- 查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据
SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
6. 排序
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
你可以设定多个字段来排序。
你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升排列。
你可以添加 WHERE…LIKE 子句来设置条件。
7. 分组
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
1. WITH ROLLUP
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
例如我们将数据表按名字进行分组,再统计每个人登录的次数:
SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
-- 结果
+--------+--------------+
| name | singin_count |
+--------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| NULL | 16 |
+--------+--------------+
其中记录 NULL 表示所有人的登录次数。
我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:select coalesce(a,b,c);
,表示如果a==null
,则选择b;如果b==null
,则选择c;如果a!=null
,则选择a;如果a b c 都为null ,则返回为null(没意义)。
如果名字为空我们使用总数代替:
SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
-- 结果
+--------------------------+--------------+
| coalesce(name, '总数') | singin_count |
+--------------------------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| 总数 | 16 |
+--------------------------+--------------+
8. JOIN 查询 (连接)
A 为左表,B 为右表
1. inner join
求两张表的交集,会丢弃掉没有等值关联的行
2. left join
A独有+AB共有(交集)
显示 A 表的所有行,B 表对应 A 表中这些没有关联到的行用 null 显示
3. right join
4. A 独有
5. B 独有
6. AB 全有
由于 mysql 中不支持 full outer join,所以这里通过 union 进行转换
AB并集 = AB交集+A独有+B独有
7. AB 独有
AB 独有 = A 独有 + B 独有
9. 事务
MySQL 的事务机制默认是自动提交的,我们可以通过手动 start transaction
来开启一个事务
1. MySQL 事务控制语句
10. 函数
1.DATE_ADD()
作用:向日期添加指定的时间间隔。
格式:DATE_ADD(date,INTERVAL expr type)
date 参数是合法的日期表达式。expr 参数是你希望添加的时间间隔。
type 参数可以是下列值:
- MICROSECOND
- SECOND
- MINUTE
- HOUR
- DAY
- WEEK
- MONTH
- QUARTER
- YEAR
- SECOND_MICROSECOND
- MINUTE_MICROSECOND
- MINUTE_SECOND
- HOUR_MICROSECOND
- HOUR_SECOND
- HOUR_MINUTE
- DAY_MICROSECOND
- DAY_SECOND
- DAY_MINUTE
- DAY_HOUR
- YEAR_MONTH
案例:
向 “OrderDate” 添加 45 天,这样就可以找到付款日期
SELECT OrderId,DATE_ADD(OrderDate,INTERVAL 45 DAY) AS OrderPayDate
FROM Orders
添加前:
执行结果:
2. DATE_SUB()
作用:从日期减去指定的时间间隔
格式:DATE_SUB(date,INTERVAL expr type)
参数同上
3. DATEDIFF()
作用:返回两个日期之间的天数
格式:DATEDIFF(date1,date2)
date1 和 date2 参数是合法的日期或日期/时间表达式
案例:
SELECT DATEDIFF('2008-11-30','2008-11-29') AS DiffDate
结果:
4. DATE_FORMAT()
作用:以不同的格式显示日期/时间数据
格式:DATE_FORMAT(date,format)
date 参数是合法的日期。format 规定日期/时间的输出格式。
输出格式有:
- %a 缩写星期名
- %b 缩写月名
- %c 月,数值
- %D 带有英文前缀的月中的天
- %d 月的天,数值(00-31)
- %e 月的天,数值(0-31)
- %f 微秒
- %H 小时(00-23)
- %h 小时(01-12)
- %I 小时(01-12)
- %i 分钟,数值(00-59)
- %j 年的天(001-366)
- %k 小时(0-23)
- %l 小时(1-12)
- %M 月名
- %m 月,数值(00-12)
- %p AM或PM
- %r 时间,12-小时(hh:mm:ssAM或PM)
- %S 秒(00-59)
- %s 秒(00-59)
- %T 时间,24-小时(hh:mm:ss)
- %U 周(00-53)星期日是一周的第一天
- %u 周(00-53)星期一是一周的第一天
- %V 周(01-53)星期日是一周的第一天,与%X使用
- %v 周(01-53)星期一是一周的第一天,与%x使用
- %W 星期名
- %w 周的天(0=星期日,6=星期六)
- %X 年,其中的星期日是周的第一天,4位,与%V使用
- %x 年,其中的星期一是周的第一天,4位,与%v使用
- %Y 年,4位
- %y 年,2位
案例:
使用 DATE_FORMAT() 函数来显示不同的格式。我们使用 NOW() 来获得当前的日期/时间
select
DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p'),
DATE_FORMAT(NOW(),'%m-%d-%Y'),
DATE_FORMAT(NOW(),'%d %b %y'),
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')
结果
5. NOW()
作用:获取当前日期和时间
格式:NOW()
案例:
SELECT NOW(),CURDATE(),CURTIME();
结果
使用 NOW() 创建表时:
CREATE TABLE Orders (
OrderId int NOT NULL,
ProductName varchar(50) NOT NULL,
OrderDate datetime NOT NULL DEFAULT NOW(),
PRIMARY KEY (OrderId)
);
OrderDate 列规定 NOW() 作为默认值。作为结果,当你向表中插入行时,当前日期和时间会自动插入列中。
6. CURDATE()
作用:返回当前的日期
格式:CURDATE()
同样的,CURDATE() 用于建表语句时,当你向表中插入行时,当前日期会自动插入列中。
7. CURTIME()
作用:返回当前的时间
格式:CURTIME()
同样的,CURTIME() 用于建表语句时,当你向表中插入行时,当前时间会自动插入列中。
8. DATE()
作用:提取日期或日期/时间表达式的日期部分
格式:DATE(date)
date 参数是合法的日期表达式。
案例:
SELECT ProductName, DATE(OrderDate) AS OrderDate
FROM Orders
WHERE OrderId=1
原来表中数据
结果
9. EXTRACT()
作用:返回日期/时间的单独部分,比如年、月、日、小时、分钟等等
格式:EXTRACT(unit FROM date)
date 参数是合法的日期表达式。unit 参数可以是下列的值:
- MICROSECOND
- SECOND
- MINUTE
- HOUR
- DAY
- WEEK
- MONTH
- QUARTER
- YEAR
- SECOND_MICROSECOND
- MINUTE_MICROSECOND
- MINUTE_SECOND
- HOUR_MICROSECOND
- HOUR_SECOND
- HOUR_MINUTE
- DAY_MICROSECOND
- DAY_SECOND
- DAY_MINUTE
- DAY_HOUR
- YEAR_MONTH
案例:
SELECT EXTRACT(YEAR FROM OrderDate) AS OrderYear,
EXTRACT(MONTH FROM OrderDate) AS OrderMonth,
EXTRACT(DAY FROM OrderDate) AS OrderDay,
FROM Orders
WHERE OrderId=1
结果
10. CONCAT()
作用:返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
格式:CONCAT(str1,str2,…)
注意:
如果所有参数均为非二进制字符串,则结果为非二进制字符串。
如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。
一个数字参数会被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如:
SELECT CONCAT(CAST(int_col AS CHAR), char_col)
MySQL的concat函数可以连接一个或者多个字符串,如:
select concat('10');
-- 结果
10
select concat('11','22','33');
-- 结果
112233
MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL
select concat('11','22',null);
--结果
NULL
mysql向表中某字段后追加一段字符串
update table_name set field=CONCAT(field,'',str);
mysql 向表中某字段前加字符串
update table_name set field=CONCAT('str',field);
11. CONCAT_WS()
作用:CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。另外,函数会忽略任何分隔符参数后的 NULL 值。
格式:CONCAT_WS(separator,str1,str2,...)
案例:
select concat_ws(',','11','22','33');
-- 结果
11,22,33
-- 和MySQL中concat函数不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL
select concat_ws(',','11','22',NULL,'33');
--结果
11,22,33
12. GROUP_CONCAT()
作用:在分组后,会将同一组的值按要求拼接起来
格式:GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
案例:
表的内容为:
以id分组,把name字段的值打印在一行,逗号分隔(默认)
select id,group_concat(name) from aa group by id;
-- 结果
+------+--------------------+
| id| group_concat(name) |
+------+--------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
+------+--------------------+
以id分组,把name字段的值打印在一行,分号分隔
select id,group_concat(name separator ';') from aa group by id;
-- 结果
+------+----------------------------------+
| id| group_concat(name separator ';') |
+------+----------------------------------+
|1 | 10;20;20 |
|2 | 20|
|3 | 200;500 |
+------+----------------------------------+
以id分组,把去冗余的name字段的值打印在一行,逗号分隔
select id,group_concat(distinct name) from aa group by id;
-- 结果
+------+-----------------------------+
| id| group_concat(distinct name) |
+------+-----------------------------+
|1 | 10,20|
|2 | 20 |
|3 | 200,500 |
+------+-----------------------------+
以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序
select id,group_concat(name order by name desc) from aa group by id;
-- 结果
+------+---------------------------------------+
| id| group_concat(name order by name desc) |
+------+---------------------------------------+
|1 | 20,20,10 |
|2 | 20|
|3 | 500,200|
+------+---------------------------------------+
13. REPEAT()
作用:用来复制字符串
格式:REPEAT(字符串,复制的份数)
案例:
将 ab 复制两份
select repeat('ab',2);
-- 结果
+----------------+
| repeat('ab',2) |
+----------------+
| abab |
+----------------+
14. LEFT()
作用:从左开始截取字符串
格式:LEFT(被截取字段,截取长度)
案例:
select left(content,200) as abstract from my_content_t;
15. RIGHT()
作用就是从右开始截取字符串,其他同上
案例:
select right(content,200) as abstract from my_content_t;
16. SUBSTRING()
作用:截取字符串
格式:SUBSTRING(被截取字段,从第几位开始截取)
,SUBSTRING(被截取字段,从第几位开始截取,截取长度)
案例:
select substring(content,5) as abstract from my_content_t;
select substring(content,5,200) as abstract from my_content_t;
注意:如果位数是负数 如-5 则是从后倒数位数,到字符串结束或截取的长度
SUBSTRING(str,pos) , SUBSTRING(str FROM pos) , SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len):
不带有 len 参数的格式,表示从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度为len的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可让pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。
17. SUBSTRING_INDEX()
作用:按关键字截取字符串
格式:SUBSTRING_INDEX(被截取字段,关键字,关键字出现的次数)
案例:
select substring_index("www.w3cschool.cn",".",2) as abstract;
-- 结果
www.w3cschool
注意:如果关键字出现的次数是负数 如-2 则是从后倒数,到字符串结束
18. - 号
SELECT - 2;
-- 结果
-2
注意,如果这个操作符被用于一个 BIGINT,返回值也是一个 BIGINT!这就意味着,应该避免在一个可能有值 -2^63 的整数上使用 - 操作符
19. ABS(X)
作用:返回 X 的绝对值
案例:
SELECT ABS(2);
-- 结果
2
SELECT ABS(-32);
-- 结果
32
20. SIGN(X)
作用:以 -1 、 0 或 1 的方式返回参数的符号,它取决于参数 X 是负数、0 或正数。
案例:
SELECT SIGN(-32);
-- 结果
-1
SELECT SIGN(0);
-- 结果
0
SELECT SIGN(234);
-- 结果
1
21. MOD(N,M)
作用:取模 (就如 C 中的 % 操作符)。返回 N 被 M 除后的余数
案例:
SELECT MOD(234, 10);
-- 结果
4
SELECT 253 % 7;
-- 结果
1
SELECT MOD(29,9);
-- 结果
2
SELECT 29 MOD 9;
-- 结果
2
22. FLOOR(X)
作用:返回不大于 X 的最大整数值
案例:
SELECT FLOOR(1.23);
-- 结果
1
SELECT FLOOR(-1.23);
-- 结果
-2
注意,返回值被转换为一个 BIGINT
23. CEILING(X)
作用:返回不小于 X 的最小整数
案例:
SELECT CEILING(1.23);
-- 结果
2
SELECT CEILING(-1.23);
-- 结果
-1
注意,返回值被转换为一个 BIGINT
24. ROUND(X) / ROUND(X,D)
作用:将参数 X 四舍五入到最近的整数,然后返回。两个参数的形式是将一个数字四舍五入到 D 个小数后返回。
案例:
SELECT ROUND(-1.23);
-- 结果
-1
SELECT ROUND(-1.58);
-- 结果
-2
SELECT ROUND(1.58);
-- 结果
2
SELECT ROUND(1.298, 1);
-- 结果
1.3
SELECT ROUND(1.298, 0);
-- 结果
1
注意,当参数在两个整数之间时, ROUND() 的行为取决于 C 库的实现。某些取整到最近的偶数,总是向下取,总是向上取,也可能总是接近于零。如果你需要某种取整类型,应该使用一个明确定义的函数比如 TRUNCATE() 或 FLOOR() 代替。
25. DIV
作用:删除,类似于 FLOOR() ,但是它可安全地用于 BIGINT 值。
案例:
SELECT 5 DIV 2
-- 结果
2
26. EXP(X)
作用:返回值 e (自然对数的底) 的 X 次方
案例:
SELECT EXP(2);
-- 结果:e 的平方
7.389056
SELECT EXP(-2);
-- 结果
0.135335
17. LN(X)
作用:返回 X 的自然对数
案例:
SELECT LN(2);
-- 结果:e的 0.693147 次方等于 2
0.693147
SELECT LN(-2);
-- 结果:e的多少次方都是正数
NULL
28. LOG(X) / LOG(B,X)
作用:如果以一个参数调用,它返回 X 的自然对数(e 就是自然对数);如果以两个参数调用,这个函数返回 X 任意底 B 的对数
案例:
SELECT LOG(2);
-- 结果:e的 0.693147 次方等于 2
0.693147
SELECT LOG(-2);
-- 结果:e的多少次方都是正数
NULL
SELECT LOG(2,65536);
-- 结果:2 的 16 次方等于 65536
16.000000
SELECT LOG(1,100);
-- 结果:1 的任意次方都等于 1,不可能等于 100
NULL
29. LOG2(X)
作用:返回 X 的以 2 为底的对数
案例:
SELECT LOG2(65536);
-- 结果:2的16次方等于65536
16.000000
SELECT LOG2(-100);
-- 结果
NULL
LOG2() 通常可以用于计数出一个数字需要多少个比特位用于存储它。这个函数在 MySQL 4.0.3 中被添加。在更早的版本中,可以使用 LOG(X)/LOG(2) 来代替它。
30. LOG10(X)
作用:返回 X 以 10 为底的对数
案例:
SELECT LOG10(2);
-- 结果
0.301030
SELECT LOG10(100);
-- 结果
2.000000
SELECT LOG10(-100);
-- 结果
NULL
31. POW(X,Y)
作用:返回 X 的 Y 幂
案例:
SELECT POW(2,2);
-- 结果
4.000000
SELECT POW(2,-2);
-- 结果
0.250000
31. SQRT(X)
作用:返回 X 的非负平方根
案例:
SELECT SQRT(4);
-- 结果
2.000000
SELECT SQRT(20);
-- 结果
4.472136
32. PI()
作用:返回 PI 值(圆周率)。缺少显示 5 位小数,但是在 MySQL 内部,为 PI 使用全部的双精度
案例:
SELECT PI();
-- 结果:返回的只显示五位
3.141593
SELECT PI()+0.000000000000000000;
-- 结果:但实际参与运算的是双精度范围内的数,双精度有8个字节
3.141592653589793116
33. COS(X)
作用:返回 X 的余弦
案例:
SELECT COS(PI());
--结果
-1.000000
34. SIN(X)
作用: 返回 X 的正弦
案例:
SELECT SIN(PI());
--结果
0.000000
35. TAN(X)
作用:返回 X 的正切
案例:
SELECT TAN(PI()+1);
--结果
1.557408
36. ACOS(X)
作用:返回 X 的反余弦,更确切地说,返回余弦值为 X 的值。如果 X 不在 -1 到 1 之间的范围内,返回 NULL
案例:
SELECT ACOS(1);
-- 结果
0.000000
SELECT ACOS(1.0001);
-- 结果
NULL
SELECT ACOS(0);
-- 结果
1.570796
37. ASIN(X)
作用:返回 X 的反正弦,更确切地说,返回正弦值为 X 的值。如果 X 不在 -1 到 1 之间的范围内,返回 NULL
案例:
SELECT ASIN(0.2);
-- 结果
0.201358
SELECT ASIN('foo');
-- 结果
0.000000
38. ATAN(X)
作用:返回 X 的反正切,更确切地说,返回正切值为 X 的值
案例:
SELECT ATAN(2);
-- 结果
1.107149
SELECT ATAN(-2);
-- 结果
-1.107149
39. ATAN(Y,X)
作用:返回两个变量 X 和 Y 的反正切。它类似于计算 Y / X 的反正切,除了两个参数的符号用于决定结果的象限
案例:
SELECT ATAN(-2,2);
-- 结果
-0.785398
SELECT ATAN2(PI(),0);
-- 结果
1.570796
40. COT(X)
作用:返回 X 的余切
案例:
SELECT COT(12);
-- 结果
-1.57267341
SELECT COT(0);
-- 结果
NULL
41. RAND() / RAND(N)
作用:返回一个范围在 0 到 1.0 之间的随机浮点值。如果一个整数参数 N 被指定,它被当做种子值使用(用于产生一个可重复的数值)
案例:
SELECT RAND();
-- 结果
0.9233482386203
SELECT RAND(20);
-- 结果:指定了种子
0.15888261251047
SELECT RAND(20);
-- 结果:指定种子是20.无论调用多少次,都是产生相同的值
0.15888261251047
SELECT RAND();
-- 结果
0.63553050033332
SELECT RAND();
-- 结果
0.70100469486881
在一个 ORDER BY 子句中,不可以使用 RAND() 值使用一个列,因为 ORDER BY 将多次重复计算列。从 MySQL 3.23 开始,你可以使用: SELECT * FROM table_name ORDER BY RAND()
,这有利于得到一个来自 SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000
的集合中的随机样本。 注意,在一个 WHERE 子句中的 RAND() 将在每次 WHERE 执行时被重新计算。 RAND() 并不是预期完美的随机数发生器,但是可以代替做为产生特别的随机数一个快速的方法,这样便于在两个不同平台下的同一 MySQL 版本间移动。
42. LEAST(X,Y,…)
作用:有两个或更多个参数,返回最小(最小值)的参数。
参数使用下列规则进行比较:
- 如果返回值用于一个 INTEGER 语境,或所有的参数是整数值,它们作为整数比较。
- 如果返回值用于一个 REAL 语境,或所有的参数均是实数值,它们作为实数被比较。
- 如果任何一个参数是字母大小写敏感的,参数作为大小写敏感的字符串进行比较。
- 在其它情况下,参数做为忽略大小写的字符中进行比较:
案例:
SELECT LEAST(2,0);
-- 结果
0
SELECT LEAST(34.0,3.0,5.0,767.0);
-- 结果
3.0
SELECT LEAST("B","A","C");
-- 结果
"A"
在早于 MySQL 3.22.5 的版本中,你可以使用 MIN() 代替 LEAST()
43. GREATEST(X,Y,…)
作用:返回最大(最大值)参数。
参数使用与 LEAST 一致的规则进行比较
案例:
SELECT GREATEST(2,0);
-- 结果
2
SELECT GREATEST(34.0,3.0,5.0,767.0);
-- 结果
767.0
SELECT GREATEST("B","A","C");
-- 结果
"C"
在早于 MySQL 3.22.5 的版本中,可以使用 MAX() 代替 GREATEST()。
44. DEGREES(X)
作用:将参数 X 从弧度转换为角度,然后返回
案例:
SELECT DEGREES(PI());
-- 结果
180.000000
45. RADIANS(X)
作用:将参数 X 从角度转换为弧度,然后返回
案例:
SELECT RADIANS(90);
-- 结果
1.570796
46. TRUNCATE(X,D)
作用:将数值 X 截到 D 个小数,然后返回。如果 D 为 0 ,结果将不包含小数点和小数部分
案例:
SELECT TRUNCATE(1.223,1);
-- 结果
1.2
SELECT TRUNCATE(1.999,1);
-- 结果
1.9
SELECT TRUNCATE(1.999,0);
-- 结果
1
SELECT TRUNCATE(-1.999,1);
-- 结果
-1.9
从 MySQL 3.23.51 开始,所有数字被四舍五入到零。 如果 D 是负数,那么数字的整个部分被对准零位输出
SELECT TRUNCATE(122,-1);
-- 结果
120
SELECT TRUNCATE(122,-2);
-- 结果
100
SELECT TRUNCATE(122,-3);
-- 结果
0
注意,十进值小数在计算机中通常不以精确数字存储,而是双精度型的值,你可能会被下列结果所愚弄:
SELECT TRUNCATE(10.28*100,0);
--结果
1027
-- 我的测试结果是 1028
上面结果的发生是因为 10.28 实际上是以某些像 10.2799999999999999 的形式被存储的。
47. SUBSTR()
作用:返回原字符串的子字符串,该字符串是原字符串从<始>位置开始,长度为<长>的一段。如果没有指定<长>或指定得超过字符串长度,则子字符串从<始>位置一直取到原字符串尾。如果所指定的位置不能返回字符串,则返回空字符串。
格式:SUBSTR(string string,num start,num length)
string为字符串;start为起始位置(若为负数则表示从末尾开始);length为长度。注意:mysql中的start是从1开始的。
案例:
-- 查出kename字段中第一次出现`.`之前的字符串
select kename,substr(kename,1,locate('.',kename)) as subkename from web_dev_api where 1;
-- 截取末尾两位
select substr(kename,-2,2);
11. 索引
1. 概念
索引是一种可以帮助 数据库(MySQL)高效获取数据的一种数据结构,它会以某种方式指向数据,从而可以在这些数据结构上实现一些高级查找算法。索引的目的是为了提高查询效率,就好像书的目录一样
没有特殊指明,索引默认使用 B 树, 聚集索引、次要索引、覆盖索引、前缀索引、唯一索引默认都是用 B 树
优缺点
-
优点:
- 类似书的目录 ,可以提高数据的检索效率,降低数据库的IO成本
- 通过索引列对数据进行排序,可以降低数据的排序成本,从而降低CPU的消耗
-
缺点:
- 索引实际上也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用物理空间
- 索引虽然能够提升查询效率,但是对于更新操作,MySQL 除了要保存数据之外,还需要去额外维护索引
- 对于 MySQL 中有大量数据表的情况下,需要花时间去研究建立最优秀的索引或查询语句
是否建立索引
- 需要建立
- 主键自动建立唯一索引(主键索引不允许存在 null 值,但唯一索引是允许的)
- 经常需要查询到的字段
- 需要排序的字段
- 需要分组的字段
- 查询中与外表关联的字段,外键关系建立索引
- 高并发下使用联合索引
- 不需要建立
- 表很小
- 表特别大的情况下应该使用
- 经常更新(增删改)操作的字段
- 重复值比较多, 如国籍、性别,不适合创建索引
- where 条件里用不到的字段
2. 添加、查询和删除索引
-
主键索引
当一张表,把某个列设为主键的时候,则该列就是主键索引,下面的id 列就是主键索引create table user (id int unsigned primary key auto_increment , name varchar(32) not null defaul ‘’);
如果你创建表时,没有指定主键索引,也可以在创建表后,再添加, 指令:
alter table 表名 add primary key (列名); //举例 alter table user add primary key (id);
-
普通索引
一般来说,普通索引的创建,是先创建表,然后在创建普通索引。比如:create table user( id int unsigned, name varchar(32) ) create index 索引名 on 表 (列1,列名2);
-
全文索引
全文索引,主要是针对对文件、文本的检索, 比如文章, 全文索引针对MyISAM有用。创建如下:CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body) )engine=myisam charset utf8;
注意:
- 在mysql中fulltext 索引只针对 myisam生效
- mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文
- 使用方法是match(字段名…) against(‘关键字’)
- 全文索引一个 叫 停止词, 因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.
-
唯一索引
当表的某列被指定为unique约束时,这列就是一个唯一索引// 创建 create table user(id int primary key auto_increment , name varchar(32) unique);
这时, name 列就是一个唯一索引,unique字段可以为NULL,并可以有多NULL, 但是如果是具体内容,则不能重复,主键字段,不能为NULL,也不能重复。
创建唯一索引的另一种方式:
create table user(id int primary key auto_increment, name varchar(32)); create unique index 索引名 on 表名 (列表..);
-
查询索引
desc 表名 //不能够显示索引名 show index(es) from 表名 show keys from 表名
-
删除索引
alter table 表名 drop index 索引名; //如果删除主键索引。 alter table 表名 drop primary key
由于索引本身很大,占用磁盘空间,对dml操作有影响,变慢,满足以下条件的字段,才应该创建索引。
- 肯定在where条经常使用
- 该字段的内容不是唯一的几个值
- 字段内容不是频繁变化
12. 批量插入数据
使用脚本进行大数据量的批量插入,对特定情况下测试数据集的建立非常有用。
1. 准备
13. 练习
create table Student(
s_no char(6) primary key,
class_no char(6) not null,
s_name varchar(10) not null,
s_sex char(2) check(s_sex in ('男','女')),
s_birthday datetime
);
create table Class(
class_no char(6) primary key,
class_name char(20) not null,
class_special varchar(20),
class_dept char(20)
);
create table Course(
course_no char(5) primary key,
course_name char(20) not null,
course_score numeric(6,2)
);
create table Choise(
s_no char(6),
course_no char(5),
score numeric(6,1)
);
CREATE TABLE Teacher(
t_no CHAR(6) PRIMARY KEY,
t_name VARCHAR(10) NOT NULL,
t_sex SET('男','女'),
t_birthday DATETIME,
t_title CHAR(10)
);
create table Teaching(
course_no char(5),
t_no char(6)
);
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991101','js9901','张彬','男','1981-10-1');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991102','js9901','王蕾','女','1980-8-8');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991103','js9901','李建国','男','1981-4-5');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991104','js9901','李平方','男','1981-5-12');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991201','js9902','陈东辉','男','1980-2-8');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991202','js9902','葛鹏','男','1979-12-23');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991203','js9902','潘桃枝','女','1980-2-6');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991204','js9902','姚一峰','男','1981-5-7');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('001101','js0001','宋大芳','男','1980-4-9');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('001102','js0001','许辉','女','1978-8-1');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('001201','js0002','王一山','男','1980-12-4');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('001202','js0002','牛莉','女','1981-6-9');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('002101','xx0001','李丽丽','女','1981-9-19');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('002102','xx0001','李王','男','1980-9-23');
insert into Class(class_no,class_name,class_special,class_dept) values('js9901','计算机99-1','计算机','计算机系');
insert into Class(class_no,class_name,class_special,class_dept) values('js9902','计算机99-2','计算机','计算机系');
insert into Class(class_no,class_name,class_special,class_dept) values('js0001','计算机00-1','计算机','计算机系');
insert into Class(class_no,class_name,class_special,class_dept) values('js0002','计算机00-2','计算机','计算机系');
insert into Class(class_no,class_name,class_special,class_dept) values('xx0001','信息00-1','信息','信息系');
insert into Class(class_no,class_name,class_special,class_dept) values('xx0002','信息00-2','信息','信息系');
insert into Course(course_no,course_name,course_score) values('01001','计算机基础',3);
insert into Course(course_no,course_name,course_score) values('01002','程序设计语言',5);
insert into Course(course_no,course_name,course_score) values('01003','数据结构',6);
insert into Course(course_no,course_name,course_score) values('02001','数据库原理与应用',6);
insert into Course(course_no,course_name,course_score) values('02002','计算机网络',6);
insert into Course(course_no,course_name,course_score) values('02003','微机原理与应用',8);
insert into Choise(s_no,course_no,score) values('991101','01001',88.0);
insert into Choise(s_no,course_no,score) values('991102','01001',);
insert into Choise(s_no,course_no) values('991103','01001',91.0);
insert into Choise(s_no,course_no,score) values('991104','01001',78.0);
insert into Choise(s_no,course_no,score) values('991201','01001',67.0);
insert into Choise(s_no,course_no,score) values('991101','01002',90.0);
insert into Choise(s_no,course_no,score) values('991102','01002',58.0);
insert into Choise(s_no,course_no,score) values('991103','01002',71.0);
insert into Choise(s_no,course_no,score) values('991104','01002',85.0);
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000001','李英','女','1964-11-3','讲师');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000002','王大山','男','1955-3-7','副教授');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000003','张朋','男','1960-10-5','讲师');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000004','陈为军','男','1970-3-2','助教');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000005','宋浩然','男','1966-12-4','讲师');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000006','徐红霞','女','1951-5-8','副教授');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000007','徐永军','男','1948-4-8','教授');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000008','李桂清','女','1940-11-3','教授');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000009','王一帆','女','1962-5-9','讲师');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000010','田丰','男','1972-11-5','助教');
insert into Teaching(course_no,t_no) values('01001','000001');
insert into Teaching(course_no,t_no) values('01002','000002');
insert into Teaching(course_no,t_no) values('01003','000002');
insert into Teaching(course_no,t_no) values('02001','000003');
insert into Teaching(course_no,t_no) values('02002','000004');
insert into Teaching(course_no,t_no) values('01001','000005');
insert into Teaching(course_no,t_no) values('01002','000006');
insert into Teaching(course_no,t_no) values('01003','000007');
insert into Teaching(course_no,t_no) values('02001','000007');
insert into Teaching(course_no,t_no) values('02002','000008');
#查询所有学生的基本信息
select s_no,class_no,s_name,s_sex,s_birthday from Student;
#查询所有学生 显示学号姓名
select s_no,s_name from Student;
#查询男同学 显示学号姓名出生日期
select s_no,s_name,s_birthday from Student where s_sex = '男';
#查询出生日期在80-1-1前女学生
select s_no,class_no,s_name,s_sex,s_birthday from Student where s_sex='女' and s_birthday<'1980-01-01';
#查询李姓男学生
select s_no,class_no,s_name,s_sex,s_birthday from Student where s_sex='男' and s_name like "李%";
#查询名字含一
select s_no,class_no,s_name,s_sex,s_birthday from Student where s_name like "%一%";
#查询职称不是讲师
select t_no,t_name,t_sex,t_birthday,t_title from Teacher where t_title != '讲师';
#查询未参加考试的学生
SELECT co.s_name
FROM(
SELECT s.s_name s_name,c.score score
FROM student s LEFT JOIN choise c
ON s.`s_no` = c.`s_no`
) co
WHERE co.score IS NULL;
#查询考试不及格的学生并按成绩排序
SELECT co.*
FROM (
SELECT s.*,c.score score
FROM student s
LEFT JOIN choise c ON s.`s_no` = c.`s_no`
) co
WHERE co.score < 60.0 OR co.score IS NULL
ORDER BY co.score;
#查询课程号为01001 02001 02003所有课程
select course_no,course_name,course_score from Course where course_no in ('01001','02001','02003');
#查询1970年出生的讲师
SELECT *
FROM teacher
WHERE t_birthday >= '1970-01-01 00:00:00' AND t_birthday < '1971-01-01 00:00:00';
#查询各课程号选修人数
select course_no,count(course_no) from Choise group by course_no ;
#查询教授两门课程以上的讲师
select t_no,count(course_no) from Teaching group by t_no having count(course_no)=>2 ;
#查询01001平均分最低分最高分
select avg(score),min(score),max(score) from Choise where course_no = '01001';
#查询1960年后出生职称为讲师并按出生日期升序
select t_no,t_name,t_sex,t_birthday,t_title from Teacher where t_birthday > '1960' and t_title = '讲师' ORDER BY t_birthday ASC;
#查询所有学生选课和成绩s_no s_name course_no score
select Student.s_no,s_name,course_no,score from Student join Choise on Student.s_no = Choise.s_no;
#查询计算机99-1同学的选课及成绩s_no s_name course_no course_name score
select Student.s_no,s_name,Course.course_no,course_name,score from Student join Choise,Course,Class where Student.s_no = Choise.s_no and Course.course_no = Choise.course_no and Student.class_no = Class.class_no and Class.class_name = '计算机99-1';
#查询所有学生及格科目
select Student.s_no,s_name,Course.course_no,course_name,score from Student join Choise,Course where Student.s_no = Choise.s_no and Course.course_no = Choise.course_no and Choise.score >= 60;
#查询所有学生平均成绩和所选科目数
select Student.s_no,s_name,avg(score),count(score) from Choise join Student where Student.s_no = Choise.s_no group by s_no;
#查询未参加考试的学生和课程
select Student.s_no,s_name,Course.course_no,course_name,score from Choise join Student,Course where Course.course_no = Choise.course_no and Student.s_no = Choise.s_no and score is NULL;
#查询不及格的学生和课程
select Student.s_no,s_name,Course.course_no,course_name,score from Choise join Student,Course where Course.course_no = Choise.course_no and Student.s_no = Choise.s_no and score < 60;
#查询"程序设计语言"的所有同学和成绩 ANY
select s_name,score from Student,Choise where course_no = any(select course_no from Course where course_name = '程序设计语言') and Student.s_no = Choise.s_no;
#查询所有教师的任课
select t_name,course_name from Teaching,Teacher,Course where Teacher.t_no = Teaching.t_no and Teaching.course_no = Course.course_no;
#查询李建国的同学 子查询
select s_name from Student where class_no = (select class_no from Student where s_name = '李建国') and s_name != '李建国';
#查询没有选修计算机基础NOTEXISTS
select s_name from Student,Choise where NOT EXISTS (select course_no from Course where course_name = '计算机基础' and course_no = Choise.course_no) and Student.s_no = Choise.s_no;
#查询主讲数据库原理和应用和主讲数据结构的教师姓名 UNION
select t_name from Teacher,Teaching,Course where Teacher.t_no = Teaching.t_no and Teaching.course_no = Course.course_no and Course.course_name = '数据库原理与应用' UNION select t_name from Teacher,Teaching,Course where Teacher.t_no = Teaching.t_no and Teaching.course_no = Course.course_no and Course.course_name = '数据结构';
#插入学生的存储过程
delimiter $$
create procedure insertStudent(
in s_no char(6),
in class_no char(6),
in s_name varchar(10),
in s_sex char(2),
in s_birthday datetime
)
begin
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values(s_no,class_no,s_name,s_sex,s_birthday);
end$$
delimiter ;
#插入课程 学分默认2
#delimiter $$
#create procedure insertCourse(
#in course_no char(5),
#in course_name char(20),
#in course_score numeric(6,2) DEFAULT 2
#)
#begin
#insert into Course(course_no,course_name,course_score) values(course_no,course_name,course_score);
#end$$
#delimiter ;
#根据姓名查询学生信息
delimiter $$
create procedure queryStudent(
in name varchar(10)
)
begin
select s_no,s_name from Student where s_name = name;
end$$
delimiter ;
#触发器
drop trigger StudentTrigger;
delimiter $$
create trigger StudentTrigger
AFTER INSERT ON Student FOR EACH ROW
begin
select NEW.s_no into @arg1;
select NEW.s_name into @arg2;
end$$
delimiter ;