入職學習------mysql

MySQL開發規範

 

MySQL數據庫入門

  • DDL

    create,;drop,;truncate,;rename,;alter,;
  • 存儲引擎

  • 字段類型

權限管理

  • 權限管理開場

  • MySQL權限驗證

  • 常見場景舉例

  • 權限安全

常用系統命令

  • 常用系統命令(上)

  • 常用系統命令(下)

作業

圖書表
id book_id author_id book_name pages press

獎項表
id book_id author_id cup_type cup_time
作者表
id author_id author_name content

一、設計表,寫出建表語句(我給出的字段內容、名稱僅供參考,各位同學可以按照自己的設計建表)

crete database data0709;

use data0709;

create table d_book(
id int(10) NOT NULL AUTO_INCREMENT COMMENT'id',
book_id varchar(20) NOT NULL COMMENT 'book id',
author_id varchar(20) NOT NULL COMMENT 'author id',
book_name varchar(20) NOT NULL COMMENT 'book name',
book_pages varchar(20) NOT NULL COMMENT 'book page',
book_press varchar(20) NOT NULL COMMENT 'book press',
primary key(id));

 

create table d_author(
id int(10) NOT NULL AUTO_INCREMENT COMMENT'id',
author_id varchar(20) NOT NULL COMMENT 'author id',
author_name varchar(20) NOT NULL COMMENT 'author name',
content varchar(20)  COMMENT 'content',
primary key(id));

create table d_prize(
id int(10) NOT NULL AUTO_INCREMENT COMMENT'id',
book_id varchar(20) NOT NULL COMMENT 'book id',
prize_type varchar(20) NOT NULL COMMENT 'prize type',
prize_time Date NOT NULL COMMENT 'prize time',
author_id varchar(20) NOT NULL COMMENT 'author id',
primary key(id));

二、設計索引,寫出創建索引的語句

首先分析這三個的關係,一個作者可以寫多本書,某作者以某書獲得某個獎,一個人通過一本書可以獲得多個獎項。

ALTER TABLE d_book ADD UNIQUE uk_book_author (author_id,book_id);

ALTER TABLE d_prize ADD UNIQUE uk_book_author_prize (author_id,book_id,prize_type);

三、完成以下SQL
1. 查詢姓王的作者有多少

先插入一些數據哈~insert into d_author(author_id,author_name) values ('2','海波');

插入時候會遇到不能插入中文,解決辦法:alter table d_author change author_name author_name varchar(255) character set utf8;

然後再查找姓王的作=作者有多少:

select count(*) from d_author where author_name like '王%';

2. 查詢頁數最多的前5名作者姓名和書名

select d_book.book_name,d_author.author_name from d_book join d_author on d_book.author_id=d_author.author_id order by book_pages desc limit 5;


3. 查詢獲獎最多的作者姓名,獲獎時間

select d_prize.prize_time,d_author.author_name from d_author join d_prize on d_prize.author_id=d_author.author_id group by d_prize.author_id order by count(author_name) desc limit 1;


4. 查詢獲獎作者總人數

select count(distinct author_id ) from d_prize;


5. 查詢最近獲獎的一本書名和出版社

select d_book.book_press,d_book.book_name from d_book join d_prize on d_prize.book_id=d_book.book_id order by d_prize.prize_time desc limit 1;


6. 查詢同時獲得過金獎、銀獎的作者姓名

SELECT d_author.author_name FROM d_author INNER JOIN d_prize ON d_author.author_id = d_prize.author_id WHERE prize_type = "金獎"  OR prize_type = "銀獎" GROUP
BY d_prize.author_id HAVING COUNT( * ) = 2;


7. 查詢獲得過金獎的圖書有多少本,銀獎的有多少本

SELECT prize_type, COUNT(prize_type) from d_prize where prize_type='金獎'or prize_type='銀獎' GROUP BY prize_type;
8. 查詢最近一年內獲過獎的作者姓名

select distinct d_author.author_name from d_author join d_prize on d_author.author_id = d_prize.author_id where prize_time>DATE_SUB( CURDATE( ), INTERVAL 1 YEAR );


9. 查詢每位作者各自出版的圖書名

select author_name,group_concat(book_name) from d_author join d_book on d_book.author_id=d_author.author_id group by author_name;
四、

1.如何查看錶的結構信息?

show create table 表名;
2.聯合索引中的字段順序應該如何設計?

通常就按照where條件中字段的順序建立 ,這樣根據最左匹配原則纔可以生效。

https://www.cnblogs.com/goody9807/p/7396195.html 
3.int(10)和varchar(10)兩個字段的(10)有什麼區別?

int(10)的10表示顯示的數據的長度,不是存儲數據的大小;chart(10)和varchar(10)的10表示存儲數據的大小,即表示存儲多少個字符。
4.以下查詢如何創建索引能夠實現覆蓋索引優化?
select invalid_time_flag from pushtoken_android_62 where uid = ’AC54E24E-FB73-3981-C4BC-CED8D69407F8’and pid = ‘10010’
select count(*) from pushtoken_android_62 where uid = ’AC54E24E-FB73-3981-C4BC-CED8D69407F8’and pid = ‘10010’
提示:調整索引時請給出依據,要有explain的說明前後對比。

創建表並加數據:

create table ushtoken_android_62(
id int(10) NOT NULL AUTO_INCREMENT COMMENT'id',
uid varchar(20) NOT NULL COMMENT 'uid',
pid varchar(20) NOT NULL COMMENT 'pid',
tokenid varchar(20) NOT NULL COMMENT 'token id',
primary key(id));

insert into ushtoken_android_62 (uid,pid,tokenid) values ('AC54E24E-F8','10010','hikhkjhjh');

證明最左匹配原則的過程:

沒有索引情況:

explain select tokenid from ushtoken_android_62 where uid = 'AC54E24E-F8' ;
+----+-------------+---------------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | ushtoken_android_62 | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | Using where |
+----+-------------+---------------------+------------+------+---------------+------+---------+------+------+----------+-------------+

添加查詢順序的索引:

ALTER TABLE ushtoken_android_62 ADD UNIQUE uk_uid_pid (uid,pid);

explain select tokenid from ushtoken_android_62 where uid = 'AC54E24E-F8' and pid = '10010';
+----+-------------+---------------------+------------+-------+---------------+------------+---------+-------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------------------+------------+-------+---------------+------------+---------+-------------+------+----------+-------+
| 1 | SIMPLE | ushtoken_android_62 | NULL | const | uk_uid_pid | uk_uid_pid | 44 | const,const | 1 | 100.00 | NULL |
+----+-------------+---------------------+------------+-------+---------------+------------+---------+-------------+------+----------+-------+

刪除索引,換字段順序

ALTER TABLE ushtoken_android_62 drop index uk_uid_pid

ALTER TABLE ushtoken_android_62 ADD UNIQUE uk_pid_uid (pid,uid);

explain select tokenid from ushtoken_android_62 where uid = 'AC54E24E-F8';
+----+-------------+---------------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | ushtoken_android_62 | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | Using where |
+----+-------------+---------------------+------------+------+---------------+------+---------+------+------+----------+-------------+

explain select tokenid from ushtoken_android_62 where uid = 'AC54E24E-F8' and pid = '10010';
+----+-------------+---------------------+------------+-------+---------------+------------+---------+-------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------------------+------------+-------+---------------+------------+---------+-------------+------+----------+-------+
| 1 | SIMPLE | ushtoken_android_62 | NULL | const | uk_pid_uid | uk_pid_uid | 44 | const,const | 1 | 100.00 | NULL |
+----+-------------+---------------------+------------+-------+---------------+------------+---------+-------------+------+----------+-------+

explain select count(*) tokenid from ushtoken_android_62 where uid = 'AC54E24E-F8' and pid = '10010';
+----+-------------+---------------------+------------+-------+---------------+------------+---------+-------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------------------+------------+-------+---------------+------------+---------+-------------+------+----------+-------------+
| 1 | SIMPLE | ushtoken_android_62 | NULL | const | uk_pid_uid | uk_pid_uid | 44 | const,const | 1 | 100.00 | Using index |
+----+-------------+---------------------+------------+-------+---------------+------------+---------+-------------+------+----------+------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章